생성자

생성자(constructor)

생성자는 인스턴스 생성 시 데이터 초기화를 수행하기 위한 초기화 전용 구문이다.

형태

public class 클래스명 {
    public 클래스명(){
        //초기화 코드
    }
}

특징

생성자의 특징은 다음과 같다.

  • 클래스와 동일한 이름을 가진다.

  • 메소드와 동일하게 매개변수를 가질 수 있다.

  • 메소드처럼 반환형을 작성할 수 없다.

  • 매개변수가 다르다면 중복하여 작성할 수 있다.(생성자 오버로딩이라 한다)

  • 생성자는 인스턴스 생성 시 단 1회만 실행되며, 인스턴스에 포함되지 않는다.

  • 기본적으로 클래스에는 내장되어있는 생성자가 한 개 있으며, 작성 시 사라진다.

기본 생성자

아무 작업도 하지 않는 생성자를 기본 생성자(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;
    }
}

어떤 생성자에 전달할 것인가가 문제가 되는데, 정답은 없지만 모든 데이터를 처리할 수 있는 생성자 방향으로 전달하는 것이 처리하기가 수월하다.

Last updated