생성자 메소드 체이닝이란?
- 같은 클래스안에서 생성자가 다른 생성자를 호출하는 것이다.
- "this"키워드와 호출되는 생성자에 대한 매개 변수를 사용하여 수행된다.
- 클래스에 생성자가 여러 개 있으면 한 생성자가 "this"키워드를 사용하여 클래스의 다른 생성자를 호출하여 필요한 매개 변수를 전달할 수 있다.
- 생성자 메소드 체이닝을 통해 코드의 재사용성, 가독성을 높이고 유지보수를 편리하게 할 수 있다.
생성자 메소드 체이닝의 장점
- 코드 재사용 : 한 생성자에서 다른 생성자를 호출함으로써 코드 중복을 방지할 수 있고 코드를 유지보수가 편리할 수 있게 만들 수 있다.
- 가독성 : 생성자 메소드 체이닝은 어떤 생성자가 호출되는지, 어떤 파라미터를 가지는지 명확하게 하여 가독성을 높일 수 있다.
- 유연성 : 생성자 메소드 체이닝을 사용하여 서로 다른 매개변수를 사용하여 여러 생성자를 만들 수 있으므로 구성이 다른 객체를 쉽게 만들 수 있다.
생성자 메소드 체이닝의 단점
- 복잡성 : 생성자 메소드 체이닝을 사용하면 생성자가 많고 복잡한 연결로 호출하는 경우 코드가 복잡해질 수 있다.
- 디버깅 : 체이닝에 에러가 있으면 추적해서 고치기 힘들 수 있다.
- 성능 : 체인에서 여러 생성자를 호출하면 오버헤드가 생길 수 있다. 특히 생성 중인 객체가 많은 경우 심하다.
- 혼란 : 생성자 메소드 체이닝에 대하여 문서화가 제대로 되있지 않거나, 개발자가 코드 재사용에 익숙하지 않다면 코드의 흐름과 생성자 호출에 대해서 혼란을 야기할 수 있다.
생성자 메소드 체이닝을 적절히 사용하는 법
- 단순하게 유지하라 : 생성자 체인을 이해하기 어렵게 하지 말아야 한다. 호출하는 생성자가 많아질수록 코드는 더 복잡해진다.
- 기본값을 사용하라 : 클래스 멤버에 대한 기본값을 설정할 때 생성자 메소드 체인을 사용한다. 이렇게 하면 구성이 다른 객체를 쉽게 만들 수 있다.
- 문서화하라 : 어떤 생성자가 호출되고, 호출될 때 어떤 파라미터가 전달되는지 문서화를 해야한다. 이를 통해 다른 개발자들이 생성자 호출의 흐름을 이해할 수 있다.
- 성능을 고려하라 : 체인에서 여러 생성자를 호출할 경우 성능에 미치는 영향에 대해 고려해야 한다. 객체를 많이 생성하는 경우 여러 생성자를 호출하는 과정에서 오버헤드가 누적될 수 있다.
- 재귀를 방지하라 : 생성자를 재귀적으로 호출하면 Stack overflow 오류가 발생한다.
- 첫 번째 문장에 생성자를 호출하라 : 다른 생성자를 호출하는 생성자는 항상 생성자의 첫 번째 문장이어야 한다.
생성자 메소드 체인의 예시
class Person {
private String name;
private int age;
private String address;
public Person() {
this("John Doe", 0);
}
public Person(String name) {
this(name, 0);
}
public Person(String name, int age) {
this(name, age, "Unknown");
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
// 멤버변수 getter setter...
}
- 멤버변수 아래의 첫 번째 생성자는 두 번째 생성자를 호출하며, String name 매개 변수에 대해 "Jogh Doe"라는 기본값을 전달한다.
- 두 번째 생성자는 세 번째 생성자를 호출하며 int age 매개 변수에 대해 0이라는 기본값을 전달한다.
- 세 번째 생성자는 네 번째 생성자를 호출하며 String address 매개 변수에 대해 "Unknown"이라는 기본 값을 전달한다.
- 최종적으로 네 번째 생성자는 name, age, address 값을 해당 클래스 멤버 변수에 할당한다.