[Java] 초기화 블럭

sinryuji·2025년 2월 19일

Java의 초기화 블럭에 대해 알아보자. 나는 왜 그동안 그렇게 Java를 써오면서 이 문법을 몰랐지? 라는 생각이 들었다. 심지어 중간에 추가된 문법도 아니고 Java 1.0 부터 존재한 문법이다. 이래서 기초가 중요하다...

초기화 블럭

클래스 필드의 초기화를 담당하는 블럭이다. 초기화 블럭은 생성자보다 먼저 호출되고, static 유무에 따라 2가지로 나뉘어진다.

  • 인스턴스 초기화 블럭: 중괄호({})만을 사용해서 정의.
  • 클래스 초기화 블럭: 인스턴스 초기화 블럭에 static을 붙여서 정의.

생성자 초기화전에 호출되기 때문에, 생성자에 상관없이 어떻게 객체를 초기화 하든 공통적으로 처리할 로직이 있을 경우 초기화 블럭에서 처리하면 편하다!!

멤버 변수의 초기 값 할당 순서

  1. 변수 기본 값 자동 할당(0, null, false 등)
  2. 멤버 변수 선언 시 할당한 값
  3. 초기화 블럭에서 할당한 값
  4. 생성자에서 할당한 값

예시

class Test {
    int a = 1;
    static int b = 2;

    {
        System.out.println("인스턴스 초기화 블럭!!");
        System.out.println("인스턴스 초기화 블럭에서 a값 할당 전 a값: " + a);
        a = 3;
        System.out.println("인스턴스 초기화 블럭에서 a값 할당 후 a값: " + a);
    }

    static {
        System.out.println("클래스 초기화 블럭!!");
        System.out.println("클래스 초기화 블럭에서 a값 할당 전 b값: " + b);
        b = 4;
        System.out.println("클래스 초기화 블럭에서 a값 할당 후 b값: " + b);
    }

    Test() {
        System.out.println("생성자!!");
        a = 5;
        b = 5;
    }
}

class Scratch {

    public static void main(String[] args) {

        System.out.println("=== 객체 생성 전 ===");
        System.out.println("b: " + Test.b);

        Test test = new Test();

        System.out.println("=== 객체 생성 후 ===");
        System.out.println("a: " + test.a);
        System.out.println("b: " + Test.b);
    }
}
=== 객체 생성 전 ===
클래스 초기화 블럭!!
클래스 초기화 블럭에서 a값 할당 전 b값: 2
클래스 초기화 블럭에서 a값 할당 후 b값: 4
b: 4
인스턴스 초기화 블럭!!
인스턴스 초기화 블럭에서 a값 할당 전 a값: 1
인스턴스 초기화 블럭에서 a값 할당 후 a값: 3
생성자!!
=== 객체 생성 후 ===
a: 5
b: 5

객체 생성 전, 그러니까 생성자가 호출되기 전에 먼저 초기화 블럭이 호출 되는 것을 확인할 수 있다.

profile
응애 개발자입니다.

0개의 댓글