프로그래밍자바 개발자

자바에서 인스턴스 초기화 구문(Instance Initializer)이란 무엇이며, 어떻게 작동하며, 언제 사용해야 하는가?

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

답변

인스턴스 초기화 구문은 클래스 내에서 중괄호로 둘러싸인 특수 코드 블록으로, 메소드와 생성자 외부에 위치합니다. 이 블록은 인스턴스 초기화 블록이라고 불립니다. 새로운 클래스 객체가 생성될 때마다, 부모 클래스의 생성자가 호출된 직후와 현재 클래스의 생성자 코드가 실행되기 전에 실행됩니다.

public class Example { { // 인스턴스 초기화 블록 System.out.println("인스턴스 초기화"); } private int x; public Example(int x) { this.x = x; System.out.println("생성자"); } }

인스턴스 초기화 블록은 다음과 같은 목적으로 유용합니다:

  • 모든 생성자에 대한 일반적인 코드 초기화,
  • 별도의 메소드로 빼기 어려운 중복 작업 간소화,
  • 익명 클래스 또는 지역 클래스 초기화.

함정 질문

클래스에 인스턴스 초기화 블록과 생성자가 모두 존재하면, 어떤 순서로 실행될까요?

답변: 먼저 인스턴스 초기화 블록이 실행된 후 생성자 코드가 실행됩니다. 클래스에 여러 개의 인스턴스 초기화 블록이 있을 경우, 정의된 순서대로 실행됩니다.

예시:

public class Demo { { System.out.println("인스턴스 초기화 1"); } public Demo() { System.out.println("생성자"); } { System.out.println("인스턴스 초기화 2"); } } // new Demo()를 호출할 때의 출력: // 인스턴스 초기화 1 // 인스턴스 초기화 2 // 생성자

스토리

어떤 프로젝트에서 개발자가 메소드나 생성자 대신 인스턴스 초기화 블록에 로직을 배치했습니다. 클래스를 상속하고 생성자를 오버라이드 할 때 인스턴스 초기화 블록이 여전히 실행되어 예상치 못한 초기화 순서와 비즈니스 로직의 오류를 초래했습니다.


스토리

다른 프로젝트에서 인스턴스 초기화 블록이 코드 아래쪽에 초기화된 클래스 필드에 접근했습니다. 변수들이 아직 초기화되지 않아 객체를 생성할 때 NullPointerException이 발생했습니다.


스토리

팀이 인스턴스 초기화 블록에 외부 리소스(데이터베이스)와 관련된 작업을 추가했습니다. 이로 인해 생성자가 호출될 때마다 데이터베이스에 연결하게 되어, 객체를 배치로 생성할 때 시스템이 과부하되었습니다.