JAVA

[ Java ] - 생성자

algml0703 2022. 12. 30. 07:06
반응형

  생성자

생성자는 클래스가 new 에 의해 인스턴스로 생성될 때 인스턴스의 변수들을 초기화하여주는 생성자 함수를 의미한다. 생성자 함수는 해당 클래스명과 같으며 반환값이 없다는 특징을 가진다. 한 클래스 내부에 인자깂에 따라 오버로딩하여  여러 개의 생성자 함수를 가질 수도 있다. 만약에 해당 클래스 내부에 아무런 생성자 함수가 존재하지 않는 경우에는 컴파일러에 의해 자동으로 아무런 인자를 받지 않는 기본 생성자를 추가하여 준다.

* 클래스에 멤버변수가 존재함에도 불구하고 인자를 아무것도 받지 않고 아무런 기능도 하지 않는 기본 생성자 함수가 가능한 이유? 
클래스의 멤버변수의 경우 초기화해주지 않아도 각 멤버변수의 타입에 따라 기본값으로 초기화가 이루어지기 때문에 초기화해주지 않아도 문제가 발생하지 않는다.(하지만 메서드 내에 존재하는 지역변수의 경우에는 반드시 초기화를 해주어야 사용이 가능하다.)

각 타입별 기본값

public class Car {
    private String color;
    private String size;

    Car() {
        color = "white";
        color = "small";
    }

    Car(String color, String size) {
        this.color = color;
        this.size = size;
    }
}

위에서 이야기 한 것처럼 클래스에서 여러 생성자를 가질 수 있는데, 더불어 생성자에서 생성자를 호출할 수 도 있다. 다른 생성자를 호출하기 위해서는 this 키워드를 사용한다. 예를 들어 위의 코드는 아래와 같이 수정될 수 있다.

public class Car {
    private String color;
    private String size;

    Car () {
        this("white", "small");
    }

    Car(String color, String size) {
        this.color = color;
        this.size = size;
    }
}

위의 코드는 아무 인자를 받지 않는 생성자 함수에서 String 타입의 인자 두 개를 받는 또 다른 생성자 함수를 호출하고 있다. 이때 주의할 점은 생성자에서 다른 생성자를 호출하여 사용할 때는 반드시 함수의 가장 첫 번째 줄에서 다른 생성자 함수가 호출되어야 한다는 것이다.

* this
자바에서 this 키워드는 두 가지 용도로 사용된다.
1. 생성자함수에서 또 다른 생성자 함수 호출을 하기 위한 것으로 this()이와 같이 사용된다.
2. 클래스 내부의 매서드에서 사용되는 매개변수명과, 클래스의 멤버변수명이 같은 때 두 변수를 구별하기 위해 사용된다.

위의 코드에서 this("white", "small")은 생성자 함수에서 다른 생성자 함수 호출을 위해 this() 키워드가 사용되었으며, this.color = color; this.size = size; 의 경우에 this는 참조변수로써 자기 자신을 가리키며 해당 인스턴스의 멤버변수에 매개변수로 받은 값을 할당해주는 것이다. 

* 클래스 초기화 블럭과 인스턴스 초기화 블럭(자바의 정석 302pg)

인스턴스 초기화 블럭은 단순히 클래스 내부에 { }안에 모든 생성자에서 공통적으로 실행되는 부분을 넣어주는 것이고, 클래스 초기화 블럭은 static 만 붙여서 static {} 이와 같은 식으로 작성해주는 것이다.

public class Car2 {
    private int count;
    private int serialNo;
    private String color;
    private String size;

    Car2() {
        count++;
        serialNo = count;
        color = "white";
        size = "small";
    }
    Car2(String color, String size) {
        count++;
        serialNo = count;
        this.color = color;
        this.size = size;
    }
}

예를 들어 위와 같은 코드에서 count++l serizNo=count; 부분은 코드의 중복이 이루어지는데 해당 부분은 인스턴스 초기화 블럭을 사용하여 아래와 같이 변경할 수 있다.

public class Car2 {
    private int count;
    private int serialNo;
    private String color;
    private String size;
    
    // 클래스 초기화 블럭 
    // static {}

    // 인스턴스 초기화 블럭
    {
        count++;
        serialNo = count;
    }

    Car2() {
        color = "white";
        size = "small";
    }
    Car2(String color, String size) {
        this.color = color;
        this.size = size;
    }
}

* 인스턴스 초기화 블럭은 생성자 함수보다 먼저 수행된다.

 

출처

자바의 정석 (남궁성)

반응형