📖 Books/자바 객체 지향의 원리와 이해

[Books] Java에 초기화 블록이 있다는 사실 아셨나요?

오늘 ONEUL 2023. 2. 28. 23:59

 

초기화블록? 그게 뭔데? 🤦‍♀️

초기화 블록(initialization block)이란?
클래스 필드의 초기화만을 담당하는 중괄호{}로 둘러싸인 블록을 의미한다.
  • 클래스 변수, 인스턴스 변수의 초기화가 복잡하거나 공통된 부분이 많을 경우 초기화 블록을 사용하면 코드를 간결하게 할 수 있다.
  • 초기화 블록은 생성자보다 먼저 호출되며, static 키워드의 유무에 따라 다음과 같이 구분한다.
    • Static Block(클래스 초기화 블록)
    • Instance Block(인스턴스 초기화 블록)

 

 

Static Block(클래스 초기화 블록)

  • 클래스가 처음으로 메모리에 로딩될 때 단 한 번만 실행
  • 생성자나 인스턴스 초기화 블록으로는 수행할 수 없는 클래스 변수의 초기화를 수행
class InitBlock {

    static int classVar; // 클래스 변수
    int instanceVar;     // 인스턴스 변수

    static { // 클래스 초기화 블록을 이용한 초기화
        classVar = 10;
    }

}

public class Member {

    public static void main(String[] args) {
        System.out.println(InitBlock.classVar); // 클래스 변수에 접근
    }

}

 

 

Instance Block(인스턴스 초기화 블록)

  • 단순히 중괄호{} 만을 사용하여 정의
  • 생성자와 마찬가지로 인스턴스가 생성될 때마다 실행
  • 그러나 생성자보다 먼저 실행!

 

 

생성자 vs 인스턴스 초기화 블록

  • 사실 차이는 거의 없다..!
  • 따라서 인스턴스 블록은 잘 사용되지 않는다.

 

 

그럼 도대체 언제 사용하나요?

여러 개의 생성자가 있으면 모든 생성자에서 공통으로 수행되어야 할 코드를 인스턴스 초기화 블록에 포함하여 코드의 중복을 막을 수 있다.

class Car {

    private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;

    { // 인스턴스 초기화 블록
        this.currentSpeed = 0;
    }

    Car() {}

    Car(String modelName, int modelYear, String color, int maxSpeed) {
        this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public int getSpeed() {
        return currentSpeed;
    }

}

public class Member {

    public static void main(String[] args) {
        Car myCar = new Car();                // 인스턴스 생성
        System.out.println(myCar.getSpeed()); // 인스턴스 메소드의 호출
    }

}

 

 

 

 

※ 이 내용은 책 [스프링 입문을 위한 자바 객체 지향의 원리와 이해]를 보고 정리한 내용입니다.