개인공부

생성자와 변수의 초기화 정리

리승우 2022. 12. 13. 23:33

생성자(Constructor)

  • 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
  • 생성자 이름은 클래스 이름과 같아야 하며, 리턴값이 없음
  • 인스턴스를 생성할 때는 반드시 클래스 내에 정의된 생성자 중의 하나를 선택하여 지정해주어야 함.

기본 생성자(Default Constructor)

클래스명(){ }

※주의!※

클래스 내에 생성자가 하나도 없을 때는 컴파일러가 자동적으로 기본 생성자를 추가해준다. 하지만 클래스 내에 생성자가 하나라도 있으면 기본 생성자는 자동으로 생기지 않으므로 정의되지 않은 생성자를 호출하려고 할 때 컴파일 에러가 발생한다. 

 

this(), this

같은 클래스의 다른 생성자를 호출할 때 사용된다.

 

class Data {
    String color;
    String type;
    int num;

    public Data(String color) {
        this(color,"memo",2); // (1)
        num = 4; // (2)
    }

    public Data(String color, String type, int num) {
        this.color = color; // (3)
        this.type = type;
        this.num = num;
    }
}

 

(1) 생성자 내에서 다른 생성자를 호출할 때는 클래스 이름이 아닌 this를 사용해야 한다.

 

(2) this는 생성자의 첫 줄에서만 호출이 가능하다. 

 

(3) 생성자의 매개변수와 인스턴스변수 이름이 같을 경우 서로 구별이 안 되기 때문에 인스턴스 변수 앞에 this를 붙여 인스턴스 자신을 가리킨다. this에는 인스턴스의 주소가 저장되어 있다.

 

this는 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

 

클래스변수는 this 를 사용할 수 없다. static 메서드는 인스턴스를 생성하지 않고 호출될 수 있어 static 메서도가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문이다.

 

인스턴스 복사

class Data {
    String color;
    String type;
    int num;

    public Data(){

    }
    public Data(String color){
        this.color = color;
    }

    public Data(Data data) {
        color = data.color;
        type = data.type;
        num = data.num;
    }

}

 

public class Test {
    public static void main(String[] args){
        Data data1 = new Data("white");
        Data data2 = new Data(data1); 
        data2.color = "blue";
        System.out.println(data1.color); // white
        System.out.println(data2.color); // blue

        System.out.println("-----------------");

        data2 = data1; // 같은 인스턴스 주소값 저장
        System.out.println(data1.color); // white
        System.out.println(data2.color); // white
    }
}

 

변수의 초기화

멤버 변수(클래스 변수와 인스턴스 변수)의 초기화는 선택이지만, 지역변수는 사용하기 전에 반드시 초기화해야 한다.

1. 명시적 초기화

변수를 선언과 동시에 초기화 하는 것

보다 복잡한 초기화 작업이 필요할 때는 초기화 블럭 또는 생성자 사용

2. 초기화 블럭

class Data {
    static {
        System.out.println("클래스 초기화 블럭");
    }
    {
        System.out.println("인스턴스 초기화 블럭");
    }

    public Data() {
        System.out.println("생성자");
    }
}

 

public class Test {
    public static void main(String[] args){
        System.out.println("------첫 번째 인스턴스 호출------");
        Data data = new Data();
        System.out.println("------두 번째 인스턴스 호출------");
        Data data2 = new Data();
    }
}

 

출력 결과:

 

클래스 초기화 블럭
------첫 번째 인스턴스 호출------
인스턴스 초기화 블럭
생성자
------두 번째 인스턴스 호출------
인스턴스 초기화 블럭
생성자

 

  • Data가 메모리에 로딩될 때 클래스 초기화 블럭이 가장 먼저 수행되고 인스턴스가 생성되면서 인스턴스 초기화 블럭이 수행되고 그 다음에 생성자가 수행된다.
  • 클래스 초기화 블럭은 처음 메모리에 로딩될 때 한 번만 수행되지만 인스턴스 초기화 블럭은 인스턴스가 생성될 때마다 수행된다. 

클래스 변수 초기화 순서: 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭

인스턴스 변수 초기화 순서: 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자