이번 포스팅에서는 Java에서 객체를 생성할 때, 생성자에서 다른 생성자를 호출하는 생성자 체인(Constructor Chaining)에 대해 설명합니다.
생성자 체인(Constructor Chaining)
생성자 체인은 this 또는 super 키워드를 사용해서 생성자에서 다른 생성자를 호출하는 기술입니다.
Java에서 생성자의 이름을 직접 호출할 수 없으므로 this와 super 키워드를 사용합니다.
this는 동일한 클래스의 생성자에서 다른 생성자를 호출할 때 사용합니다.
super는 자식 클래스 생성자에서 부모 클래스 생성자를 호출할 때 사용합니다.
this 키워드를 사용한 생성자 체인
다음은 this 키워드를 사용하여 생성자 체인 기술을 사용한 코드입니다.
public class Person
{
private String name;
private String country;
private int age;
public Person() {
this("Empty");
}
public Person(String name) {
this(name, 0);
}
public Person(String name, int age) {
this(name, age, "Korea");
}
public Person(String name, int age, String country) {
this.name = name;
this.age = age;
this.country = country;
}
@Override
public String toString() {
return "name: " + name + " / age : " + age + " / country : " + country;
}
public static void main(String[] args) {
Person personObj = new Person();
System.out.println(personObj.toString());
}
}
실행 결과
다음은 생성자가 호출되는 과정입니다.
동작 과정
- 객체를 생성할 때, 인수가 존재하지 않는 기본 생성자를 호출합니다.
- 기본 생성자는 인수가 한 개인 생성자를 호출합니다.
- 인수가 한 개인 생성자는 인수가 두 개인 생성자를 호출합니다.
- 인수가 두 개인 생성자는 인수가 세 개인 생성자를 호출합니다.
- 인수가 세 개인 생성자는 세 개의 인수를 name, age, country 필드에 값을 할당합니다.
super 키워드를 사용한 생성자 체인
자식 클래스 객체를 생성할 때, 자식 클래스 생성자에서 super()를 호출하거나 또는 super 키워드를 사용하지 않은 경우 부모 클래스의 기본 생성자를 호출합니다.
만약, 부모 클래스가 상위 클래스에 상속을 받는 경우 부모 클래스의 생성자는 상위 클래스의 기본 생성자를 호출합니다.
상위 클래스의 생성자를 호출하는 과정은 최상위(조상) 클래스 생성자가 호출될 때까지 계속되며, 생성자 체인의 마지막은 항상 Object 클래스의 생성자입니다.
생성자 체인의 마지막이 Object 클래스인 이유는 Object 클래스는 최상위 객체이며, 모든 클래스는 기본적으로 Object 클래스에서 상속됩니다.
super 키워드를 사용하지 않아도 Object 클래스의 생성자가 호출되는 이유는 JVM이 자동으로 super 키워드를 생성자의 첫 번째 라인에 넣기 때문입니다.
즉, 개발자가 super 키워드를 입력하지 않아도 객체를 생성하는 과정에서 JVM이 자동으로 super 키워드를 넣어서 상위 클래스의 생성자를 호출합니다.
다음은 super 키워드를 생성하여 생성자 체인 기술을 사용한 코드입니다.
SuperPerson.java : 부모 클래스입니다.
public class SuperPerson
{
private String name;
private String country;
private int age;
public SuperPerson() {
this("Empty");
}
public SuperPerson(String name) {
this(name, 0);
}
public SuperPerson(String name, int age) {
this(name, age, "Korea");
}
public SuperPerson(String name, int age, String country) {
this.name = name;
this.age = age;
this.country = country;
}
@Override
public String toString() {
return "name: " + name + " / age : " + age + " / country : " + country;
}
}
ChildPerson.java : 자식 클래스입니다.
public class ChildPerson extends SuperPerson
{
ChildPerson() {
System.out.println("인수가 없는 ChildPerson 생성자");
}
ChildPerson(String name) {
super(name);
System.out.println("인수가 한 개 있는 ChildPerson 생성자");
}
public static void main(String[] args)
{
ChildPerson childPersonObj1 = new ChildPerson("ChildPerson");
System.out.println(childPersonObj1.toString());
ChildPerson childPersonObj2 = new ChildPerson();
System.out.println(childPersonObj2.toString());
}
}
실행 결과
다음은 childPersonObj1 객체를 생성하는 과정입니다.
동작 과정
- childPersonObj1 객체를 생성할 때 인수가 한 개인 생성자를 호출합니다.
- ChildPerson 클래스에서 인수가 한 개인 생성자는 super 키워드를 사용하여 SuperPerson 클래스(부모 클래스)에서 인수가 한 개인 생성자를 호출합니다.
- SuperPerson 클래스에서 인수가 한 개인 생성자는 this 키워드를 사용하여 SuperPerson 클래스에서 인수가 두 개인 생성자를 호출합니다.
- SuperPerson 클래스에서 인수가 두 개인 생성자는 this 키워드를 사용하여 SuperPerson 클래스에서 인수가 세 개인 생성자를 호출합니다.
- SuperPerson 클래스에서 인수가 세 개인 생성자는 세 개의 인수를 name, age, country 필드에 값을 할당합니다.
다음은 childPersonObj2 객체를 생성하는 과정입니다.
동작 과정
- childPersonObj2 객체를 생성할 때 인수가 없는 생성자를 호출합니다.
- ChildPerson 클래스에서 인수가 없는 생성자는 코드가 JVM이 자동으로 super 키워드를 넣어 부모 클래스인 SuperPerson 클래스의 기본 생성자(인수가 없는 생성자)를 호출합니다.
- SuperPerson 클래스에서 인수가 없는 생성자는 this 키워드를 사용하여 SuperPerson 클래스에서 인수가 한 개인 생성자를 호출합니다.
- SuperPerson 클래스에서 인수가 한 개인 생성자는 this 키워드를 사용하여 SuperPerson 클래스에서 인수가 두 개인 생성자를 호출합니다.
- SuperPerson 클래스에서 인수가 두 개인 생성자는 this 키워드를 사용하여 SuperPerson 클래스에서 인수가 세 개인 생성자를 호출합니다.
- SuperPerson 클래스에서 인수가 세 개인 생성자는 세 개의 인수를 name, age, country 필드에 값을 할당합니다.
생성자 체인 작성 규칙 & 룰
- 상위 클래스 생성자는 하위 클래스에서 상속될 수 없습니다.
- this 키워드 또는 super 키워드는 생성자의 첫 번째 라인에 작성해야 합니다.
- 생성자에서 this 키워드와 super 키워드 둘 다 사용할 수 없습니다. 첫 번째 라인에 this 키워드를 작성한 경우 super 키워드를 두 번째 라인에 작성해야 하므로 2번 조건에 위반됩니다.
- 생성자 호출과 실행은 반대로 동작합니다. 생성자를 1, 2, 3 순서로 호출하면, 3, 2, 1 순서로 실행됩니다.
- 생성자에 super()를 추가하지 않은 경우 JVM은 super 키워드를 생성자에 암시적으로 추가합니다.
- 생성자 이름을 직접 호출할 수 없습니다.
생성자 체인 사용하는 이유 & 필요성
- 생성자 체인 기술을 사용하여 다른 생성자의 프로퍼티 또는 부모 클래스의 프로퍼티를 접근(값을 할당)할 수 있습니다.
- this 또는 super 키워드를 호출하면 되므로 코드가 간소화됩니다.
- 유지 관리에 용이합니다.
'Java' 카테고리의 다른 글
[Java]객체(Object)를 XML로 변환 (0) | 2022.04.11 |
---|---|
[Java]main 함수(메서드) (0) | 2022.04.10 |
[Java]현재 날짜 및 시간 가져오기 (0) | 2022.04.09 |
[Java]날짜 비교 방법 (0) | 2022.04.05 |
[Java]String 리터럴(Literal), String 객체(Object) (0) | 2021.05.12 |
댓글