[JAVA] 생성자와 변수의 초기화

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

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

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

     


    참고: 자바의 정석 - 남궁성

     

    🤞자바의 정석 스터디 3일차 p283-307🤞

    728x90

    댓글