정적 초기화 블록은 클래스가 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 블록이 큰 파일을 읽고 외부 서비스에 연결합니다. 테스트나 간단한 유틸리티에서 JVM 클래스 로드가 느려집니다.
장점:
단점:
Static 블록이 시작 시 소프트웨어 라이센스를 확인하고 오류가 발생하면 ExceptionInInitializerError를 던집니다.
장점:
단점: