자바에는 상속이라는 개념이 존재한다.
부모 클래스와 자식 클래스가 존재하며 자식 클래스는 부모 클래스를 상속 받을 수 있다.
상속을 받는다는 의미는 자식 클래스에서 부모 클래스의 멤버 필드를 그대로 사용할 수 있다는 뜻이다.
각각의 자식 클래스에서 계속 멤버 필드를 생성하는 것이 아니라 부모 클래스에서 상속 받아 사용하기 때문에 효율적이며 개발 시간을 줄여준다.
public class Person { // 부모
String name;
String age;
}
public class User1 extends Person{ // 자식
public User1(String name, String age) {
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
User1 user1 = new User1("홍길동", "25"); // 명시적 선언
System.out.println(user1.name);
System.out.println(user1.age);
}
}
User1에서 따로 변수를 선언하지 않았음에도 불구하고 main에서 User1 객체를 생성하여
name과 age라는 변수를 사용할 수 있는데 그 이유는 User1이 Person을 상속받았기 때문이다.
코드에서는 부모 객체를 따로 생성하는 부분이 없지만 자바에서는 자식 객체를 생성하면
내부적으로 부모 객체가 생성이 된 후, 자식 객체가 생성이 된다.
main에서 User1이라는 객체를 생성하기전에 Person이라는 객체가 내부적으로 먼저 생성이 되는 것이다.
객체는 User1 user1 = new User1(); 와 같은 생성자를 호출해야만 생성이 되는데
부모 객체를 생성할 때 부모 생성자를 어디서 호출하는 것일까?
우선적으로 명시적으로 생성자를 선언해주지 않는다면 컴파일러가 자동적으로 기본 생성자를 생성하여 호출한다.
위 코드와 같이 부모 클래스는 명시적 생성자가 존재하지 않고, 자식 클래스에는 존재한다면
자식 클래스 생성자 선언 내부 첫 줄에 super();로 생성이 된다.
super();는 부모 클래스의 기본 생성자를 컴파일러가 호출하는 것이다.
super()가 생성이 되기 때문에 자식 클래스는 부모 클래스의 멤버 필드를 그대로 사용할 수 있는 것이다.
여기서 부모의 명시적 생성자가 있는 경우라면 어떻게 작성해야 할까?
public class Person { // 부모
String name;
String age;
public Person(String name, String age) {
this.name = name;
this.age = age;
}
}
public class User1 extends Person{ // 자식
public User1(String name, String age) {
super(name, age);
}
}
public class Test {
public static void main(String[] args) {
User1 user1 = new User1("홍길동", "25");
System.out.println(user1.name);
System.out.println(user1.age);
}
}
컴파일러가 기본 생성자만 자동으로 호출하기 때문에 명시적 생성자의 경우
직접적으로 자식 클래스에서 super();를 통해 선언을 해주어야 한다.
반드시 생성자 내부 첫 줄에 해주어야 한다.
'JAVA' 카테고리의 다른 글
[JAVA] 정적 변수, 정적 메소드(Static) (0) | 2022.01.05 |
---|---|
[JAVA] 접근제어자 (0) | 2022.01.04 |
[JAVA] 오버로딩과 오버라이딩 (0) | 2022.01.04 |
[JAVA] 생성자 (0) | 2022.01.04 |
[JAVA] List와 ArrayList (0) | 2022.01.04 |