28. 변수의 초기화

변수 초기화

‘변수 초기화’는 변수를 처음 선언하고 그 값을 저장하는 과정입니다.그것은 말한다. 변수 초기화는 경우에 따라 필수 또는 선택 사항이지만 가능하면 선언 시점에 적절한 값으로 초기화하는 것이 바람직하다.하다.

멤버 변수는 초기화하지 않아도 변수의 데이터 타입에 맞는 기본값으로 자동 초기화되므로 초기화하지 않고 사용할 수 있습니다. 지역 변수는 사용하기 전에 초기화해야 합니다.해야한다.

class InitTest {
   int x; // 인스턴스 변수
   int y = x; // 인스턴스 변수
   
   void method1() {
      int i; // 지역변수
      int j = i; // ERR. 지역변수를 초기화하지 않고 사용
   }
}

명시적 초기화

명시적 초기화는 선언 시 변수가 초기화되는 경우입니다.그것은 말한다. 가장 기본적이고 간단한 초기화 방법이므로 다양한 초기화 방법 중에서 가장 먼저 고려해야 할 사항이다.

class Car {
   int door = 4; // 기본형 변수의 초기화
   Engine e = new Engine(); // 참조형 변수의 초기화
}

명시적 초기화는 간단하고 명확하지만 더 복잡한 초기화 작업이 필요한 경우 “초기화 블록” 또는 생성자를 사용해야 합니다.

초기화 블록

초기화 블록에는 ‘클래스 초기화 블록’과 ‘인스턴스 초기화 블록’의 두 가지 유형이 있습니다. 클래스 초기화 블록은 클래스 변수를 초기화하는 데 사용됩니다.이 되다, 인스턴스 초기화 블록은 인스턴스 변수를 초기화하는 데 사용됩니다.하다.

초기화 블록을 작성하려면: 인스턴스 초기화 블록은 단순히 클래스에 {} 블록을 생성하고 여기에 코드를 작성합니다.당신이해야 할 일은 그것을하는 것입니다. 그리고 클래스 초기화 블록은 인스턴스 초기화 블록 앞에 static을 추가하기만 하면 됩니다.

class InitBlock {
   static { /* 클래스 초기화 블럭 */ }
   
   { /* 인스턴스 초기화 블럭 */ }
}

클래스 초기화 블록은 클래스가 메모리에 처음 로드될 때 한 번만 실행됩니다.되고, 생성자와 마찬가지로 인스턴스 초기화 블록은 인스턴스가 생성될 때마다 실행됩니다.하고 인스턴스 초기화 블록은 생성자보다 우선합니다.하다.

Car() {
   count++;
   serialNo = count;
   color = "White";
   gearType = "Auto";
}
Car(String color, String gearType) {
   count++;
   serialNo = count;
   this.color = color;
   this.gearType = gearType;
}

인스턴스 변수 초기화는 주로 생성자를 사용하며 인스턴스 초기화 블록은 모든 생성자에 공통적으로 실행해야 하는 코드를 주입하는 데 사용됩니다. 위와 같이 클래스의 모든 생성자에 대해 일괄적으로 실행해야 하는 명령문이 있는 경우 각 생성자에 작성하지 않고 아래와 같이 해당 명령문을 인스턴스 블록에 넣습니다.

{
   count++;
   serialNo = count;
}
Car() {
   color = "White";
   gearType = "Auto";
}
Car(String color, String gearType) {
   this.color = color;
   this.gearType = gearType;
}

class BlockTest {
    static {
        System.out.println("static { }"); // 클래스 초기화 블럭
    }
    {
        System.out.println("{ }"); // 인스턴스 초기화 블럭
    }
    public BlockTest() {
        System.out.println("생성자");
    }

    public static void main(String() args) {
        System.out.println("BlockTest bt = new BlockTest();");
        BlockTest bt = new BlockTest();

        System.out.println("BlockTest bt2 = new BlockTest();");
        BlockTest bt2 = new BlockTest();
    }
}
실행결과
static { }
BlockTest bt = new BlockTest();
{ }
생성자
BlockTest bt2 = new BlockTest();
{ }
생성자

위의 코드가 실행되는 동안 BlockTest가 메모리에 로드되면 클래스 초기화 블록이 먼저 실행되고 “static { }”가 화면에 표시됩니다. 그런 다음 메인 메서드가 실행되고 BlockTest 인스턴스가 생성되고 인스턴스 초기화 블록이 먼저 실행되고 마지막으로 생성자가 실행됩니다. 위의 실행 결과에서 알 수 있듯이 클래스 초기화 블록은 메모리에 처음 로드될 때 한 번만 실행되지만 인스턴스 초기화 블록은 인스턴스가 생성될 때마다 실행됩니다.

멤버 변수의 초기화 시간 및 순서

클래스 변수 초기화 시점: 클래스가 처음 로드될 때 한 번만 초기화됩니다.

인스턴스 변수 초기화 시간: 인스턴스가 생성될 때 각 인스턴스에 대한 초기화가 수행됩니다.

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

인스턴스 변수 초기화 순서: 기본값명시적 초기화인스턴스 트리거 블록생성자

import java.util.*;
class Product {
    static int count = 0;
    int serialNo;
    { // 인스턴스 초기화 블럭
        ++count;
        serialNo = count;
    }
    public Product() {}; // 기본생성자 , 생략가능
}
class ProductTest {
    public static void main(String() args){
        Product p1 = new Product();
        Product p2 = new Product();
        Product p3 = new Product();

        System.out.println("p1의 제품번호(serial no)는 "+p1.serialNo);
        System.out.println("p2의 제품번호(serial no)는 "+p2.serialNo);
        System.out.println("p3의 제품번호(serial no)는 "+p3.serialNo);
        System.out.println("생산된 제품의 수는 모두 "+Product.count+"개 입니다.");
    }

}

제품이 공장에서 제조될 때 각 제품에 일련 번호가 할당되는 것처럼 제품 클래스의 인스턴스에는 고유한 일련 번호가 있습니다. 제품 클래스의 인스턴스가 생성될 때마다 인스턴스 블록이 실행되고 클래스 변수 count의 값이 1씩 증가한 후 인스턴스 변수 serialNo에 값이 저장됩니다. 결과적으로 새로 생성된 인스턴스는 이전에 생성된 인스턴스보다 일련 번호가 1 증가했습니다. 인스턴스 변수로 count를 선언하면 인스턴스가 생성될 때마다 0으로 초기화되므로 product 인스턴스의 serialNo 값은 항상 1이다.