2 분 소요

자바 초기화 블록필드 초기화는 객체가 메모리에 올라갈 때 예상 가능한 상태를 보장해 주는 핵심 기법입니다. 이 글에서는 static 블록·인스턴스 블록·명시적 초기화·생성자 초기화를 종합적으로 살펴보고, 초기화 순서까지 차근차근 설명드리겠습니다.


기본값과 명시적 초기화 이해하기

자바는 클래스 로드·객체 생성 시점에 타입별 기본값(0, false, null 등)을 자동으로 채워 줍니다. 그러나 비즈니스 로직에 맞춘 초기 상태를 보장하려면 명시적 초기화가 필수입니다.

class Example {
    static int staticVar = 10; // 클래스 변수의 명시적 초기화
    int   instanceVar  = 20;  // 인스턴스 변수의 명시적 초기화
}

간단한 상수·디폴트 숫자라면 이렇게 선언부에서 바로 초기화하는 것이 가장 깔끔합니다.


초기화 블록의 두 얼굴

▲ 클래스 초기화 블록 static { ... }

  • 클래스 로딩(최초 참조) 시 단 한 번 실행
  • 오직 클래스 변수(static 변수) 만 다룰 수 있음
class Config {
    static int MAX_USER;

    static {                 // 클래스 초기화 블록
        MAX_USER = 100;
        System.out.println("Static block executed");
    }
}

▲ 인스턴스 초기화 블록 { ... }

  • new 로 객체를 만들 때 생성자보다 먼저 실행
  • 여러 생성자에 공통인 초기화 코드 중복을 제거
class Car {
    int speed;

    {                        // 인스턴스 초기화 블록
        speed = 0;
        System.out.println("Speed initialized to 0");
    }

    Car() {
        System.out.println("Constructor called");
    }
}

TIP: 공통 로직은 블록에, 각 생성자별 로직은 생성자에 배치하면 SRP(단일 책임 원칙)을 지킬 수 있습니다.


생성자 초기화 – 동적 값 주입

필드 값이 입력 파라미터·외부 자원에 따라 달라질 때는 생성자가 유일 해답입니다.

class User {
    final String name;        // 필수 값

    User(String name) {       // 생성자를 통한 동적 초기화
        this.name = name;
    }
}

초기화 순서 한눈에

  1. 클래스 변수
    1. 기본값 → 2) 명시적 초기화 → 3) 클래스(static) 블록
  2. 인스턴스 변수
    1. 기본값 → 2) 명시적 초기화 → 3) 인스턴스 블록 → 4) 생성자
class InitDemo {
    static int  cv = 1;          // ①
    int          iv = 2;         // ①

    static { cv = 10; }          // ②
    { iv = 20; }                 // ③
    InitDemo() { iv = 30; }      // ④
}

출력 → cv = 10, iv = 30


실전: 초기화 블록 활용 시나리오

시나리오 권장 방법
글로벌 상수·환경 설정 static final + static 블록
여러 생성자에 공통 코드 인스턴스 블록
외부 파라미터 기반 초기화 생성자
단순 기본값 명시적 초기화

★ 실수 예방 체크리스트

  1. 순서 의존 로직은 피하기 – static 블록에서 인스턴스 필드 접근 ❌
  2. 인스턴스 블록 내부에도 예외 처리를 명확히 – 발생 시 객체 생성 실패
  3. 상수를 정의할 땐 public static final + 대문자 스네이크 사용

질문 정리

Q1. static 블록이 두 개 이상이면 실행 순서는?

선언 순서대로 위→아래 실행됩니다.

Q2. 인스턴스 블록과 생성자에 같은 코드가 있으면?

블록이 먼저 실행되고, 바로 이어서 생성자가 실행됩니다.

Q3. 지역 변수도 초기화 블록에서 접근할 수 있나요?

불가능합니다. 블록은 여전히 클래스 스코프이므로 지역 변수 개념과 다릅니다.

Q4. final 필드는 언제 초기화해야 하나요?

선언과 동시에 또는 생성자 안에서만 1회 설정 가능합니다.

Q5. enum에도 초기화 블록을 쓸 수 있을까요?

네, enum은 숨겨진 static 블록을 포함하며, 추가로 명시적 static 블록을 작성할 수 있습니다.

카테고리:

업데이트:

댓글남기기