아무 작업도 하지 않는 생성자를 기본 생성자(default constructor)라고 하며, 사용자가 만들지 않아도 클래스에 생성자가 없는 경우 생성된다.
public class Message {
private String sender;
//클래스에 생성자가 없으므로 기본 생성자가 자동 작성된다.
//public Message(){ }
}
public class Message{
private String sender;
//명시적으로 생성자를 만들었으므로 기본 생성자가 자동 작성되지 않는다.
public Message(String sender){
this.sender = sender;
}
}
생성자 오버로딩
생성자를 필요에 의해 여러 개 만드는 것을 생성자 오버로딩(Constructor Overloading)이라고 하며, 다음 조건을 만족할 경우 생성자를 여러 개 만들 수 있다.
매개변수의 개수가 다른 경우
매개변수의 자료형이 다른 경우
매개변수의 순서가 다른 경우
이를 통하여 다양한 객체 생성 방식을 제공할 수 있다.
public class Book {
private String name;
private String writer;
private int page;
private int price;
//생성옵션1 : 아무런 정보 설정 없이 생성(기본 생성자)
public Book(){}
//생성옵션2 : 책 이름만 설정하여 생성
public Book(String name){
this.name = name;
}
//생성옵션3 : 저자만 설정하여 생성
// - 생성옵션2와 형태,개수,순서 모두 같기 때문에 작성 불가
//public Book(String writer){...}
//생성옵션4 : 책 이름과 저자를 설정하여 생성
// - 개수가 다르므로 중복 정의 가능
public Book(String name, String writer){
this.name = name;
this.writer = writer;
}
//생성옵션 5 : 책 이름과 가격을 설정하여 생성
// - 생성옵션 1, 2와 개수가 다르고, 생성옵션 4와 형태가 다르므로 중복 정의 가능
public Book(String name, int price){
this.name = name;
this.price = price;
}
//생성옵션 6 : 책 가격과 이름을 설정하여 생성
// - 생성옵션 5와 동일하나, 순서가 다르므로 중복 정의 가능
// - 실제로 사용할 가능성은 낮음
public Book(int price, String name){
this.price = price;
this.name = name;
}
}
생성자간 호출
생성자가 많아지다 보면 중복 코드가 많이 발생하게 되는데, 이 때 생성자 간에 데이터를 전달하여 중복 코드를 없엘 수 있다.
중복이 발생하는 경우
public class Book {
private String name;
private String writer;
private int page;
private int price;
public Book(String name){
this.name = name;
this.writer = "작자 미상";
this.page = 0;
this.price = 0;
}
public Book(String name, String writer){
this.name = name;
this.writer = writer;
this.page = 0;
this.price = 0;
}
public Book(String name, String writer, int page){
this.name = name;
this.writer = writer;
this.page = page;
this.price = 0;
}
public Book(String name, String writer, int page, int price){
this.name = name;
this.writer = writer;
this.page = page;
this.price = price;
}
}
생성자의 초기화문이 계속 중복되기 때문에 이를 하나의 생성자에 전달하여 처리하도록 할 수 있다. 수정하면 다음과 같다.
public class Book {
private String name;
private String writer;
private int page;
private int price;
public Book(String name){
this(name, "작자 미상", 0, 0);
}
public Book(String name, String writer){
this(name, writer, 0, 0);
}
public Book(String name, String writer, int page){
this(name, writer, page, 0);
}
public Book(String name, String writer, int page, int price){
this.name = name;
this.writer = writer;
this.page = page;
this.price = price;
}
}
어떤 생성자에 전달할 것인가가 문제가 되는데, 정답은 없지만 모든 데이터를 처리할 수 있는 생성자 방향으로 전달하는 것이 처리하기가 수월하다.