이 질문의 역사:
자바에서 생성자 간 호출(생성자 체인) 개념은 객체 초기화를 유연하게 관리하고 코드 중복을 피하기 위한 필요성으로 등장했습니다. 이는 하나의 클래스 내 또는 상속 계층을 따라 생성자를 연결할 수 있게 해줍니다.
문제:
매개변수가 많은 복잡한 클래스를 설계할 때, 각 생성자에서 초기화 로직을 복사하는 것은 불편하고 비효율적입니다. 이는 코드 중복, 오류 발생 및 시스템 유지 보수성을 낮추는 원인이 됩니다.
해결책:
자바에서는 동일 클래스의 생성자에서 this() 키워드를 사용하여 다른 생성자를 호출할 수 있으며, 부모 클래스의 생성자는 super()를 통해 호출할 수 있습니다. 이는 초기화 로직을 중앙 집중화하고 가독성을 증가시키며 오류 가능성을 줄이는 데 도움을 줍니다.
코드 예:
public class Person { private String name; private int age; public Person(String name) { this(name, 0); // 다른 생성자 호출 } public Person(String name, int age) { this.name = name; this.age = age; } }
주요 특징:
this()를 이용한 생성자 호출은 생성자의 첫 번째 행이어야 함super()로 나아갈 수 있음생성자에서 첫 번째 행이 아닌 곳에서 생성자를 호출할 수 있나요?
아니요. this() 또는 super() 호출은 항상 생성자의 첫 번째 행이어야 하며, 그렇지 않으면 코드가 컴파일되지 않습니다.
자식 클래스의 생성자에서 명시적으로 super()를 호출하지 않으면 어떻게 되나요?
이 경우 자바는 부모 클래스의 기본 생성자를 자동으로 호출합니다. 만약 그런 생성자가 없다면, 프로그램은 컴파일되지 않습니다.
코드 예:
class Base { public Base(int x) {} } class Derived extends Base { public Derived() {} // 오류! 파라미터가 없는 Base() 생성자가 없음 }
하나의 생성자에서 this()를 몇 번 호출할 수 있나요?
정확히 한 번만 호출할 수 있으며, 반드시 첫 번째 행이어야 합니다. 반복적이거나 첫 번째가 아닌 호출은 컴파일 오류를 발생시킵니다.
프로그래머가 클래스의 각 생성자에 동일한 초기화를 복사했는데, 로직이 변경될 경우 모든 생성자를 수정하는 것을 잊게 됩니다.
장점:
단점:
프로그래머가 최대 매개변수를 가진 생성자를 기본 생성자로 사용하고 나머지는 this()를 통해 위임하여 로직이 중앙 집중화됩니다.
장점:
단점: