본문 바로가기
개인공부

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

by 리승우 2022. 12. 13.

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

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

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

'개인공부' 카테고리의 다른 글

오버로딩, 오버라이딩 정리  (0) 2022.12.15
JVM 구조 정리  (0) 2022.12.14
객체지향 4가지 특징 정리 (OOP)  (0) 2022.12.12
메서드 (Method) 정리  (0) 2022.12.10
클래스 변수, 인스턴스 변수, 지역 변수 정리  (0) 2022.12.06

댓글