프로그래밍백엔드 개발자

정적 초기화 블록(static initialization block)이란 무엇이며, 언제 어떻게 사용해야 하는지, 사용 시 주의해야 할 점은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

정적 초기화 블록은 클래스가 JVM에 처음 로드될 때 실행되는 코드 블록으로, 클래스의 어떤 정적 멤버가 처음 사용되기 전 또는 클래스의 인스턴스가 생성되기 전까지 실행됩니다.

문제의 배경:

Java는 시작부터 모든 인스턴스에 공통된 값을 저장하기 위한 정적 필드를 제공했습니다. 비표준 초기화 또는 복잡한 계산을 위해 클래스 시작 시 static 블록이 도입되었습니다.

문제:

일반 정적 필드는 선언 시 직접 초기화할 수 있지만, 초기화가 오래 걸리거나 다른 클래스/파일/DB에 접근하거나 복잡한 로직에 의존하는 경우에는 static 블록을 사용해야 합니다. static 블록의 잘못된 사용은 클래스 로드 시 예기치 않은 동작, 테스트의 어려움 및 심지어 교착 상태를 초래할 수 있습니다.

해결책:

Static 블록은 정적 자원의 복잡한 초기화에만 사용하며, 이는 단일 표현식으로 표현할 수 없을 때 필요합니다. 좋은 예시로는 JDBC 드라이버 로드, 설정 파일 읽기가 있습니다:

public class Config { public static Properties properties; static { properties = new Properties(); try (InputStream in = new FileInputStream("config.properties")) { properties.load(in); } catch (IOException e) { throw new ExceptionInInitializerError(e); } } }

주요 특징:

  • 클래스 로드 시 한 번만 실행됨
  • 정적 필드의 복잡한 초기화에 사용됨
  • 표준 초기화로 처리할 수 없는 예외를 처리할 수 있음

속임수 질문.

정적 블록 내에서 return을 사용할 수 있나요?

아니요, static 블록 내에서 return 문은 허용되지 않습니다. 예외를 던지기 위해 throw를 사용할 수 있습니다.

정적 블록은 클래스 로드 시 실행되나요, 아니면 객체 생성 시 실행되나요?

정적 블록은 클래스 로드 시 한 번 실행되며, 객체가 생성되지 않더라도 실행됩니다.

하나의 클래스에 여러 개의 static 블록을 가질 수 있나요? 실행 순서는 어떻게 되나요?

네, 여러 개의 정적 블록을 선언할 수 있습니다. 이들은 코드에서 나타나는 순서대로 실행됩니다.

일반적인 오류 및 안티 패턴

  • 클래스 로드를 차단하는 긴 초기화
  • 테스트를 방해하는 복잡한 로직 및 부작용
  • 생성자/초기화 대신에 모든 것을 위한 static 블록의 남용

실제 예시

부정 사례

클래스의 static 블록이 큰 파일을 읽고 외부 서비스에 연결합니다. 테스트나 간단한 유틸리티에서 JVM 클래스 로드가 느려집니다.

장점:

  • 보장된 한 번의 초기화

단점:

  • 테스트 및 디버깅이 어렵고
  • 지연 초기화 문제

긍정 사례

Static 블록이 시작 시 소프트웨어 라이센스를 확인하고 오류가 발생하면 ExceptionInInitializerError를 던집니다.

장점:

  • 시작 시 보장된 확인
  • 프로그램이 문제를 사전에 파악

단점:

  • 치명적인 오류 — 애플리케이션이 시작되지 않음
  • 유연한 재초기화 없음,