[TIL] Java - 초기화 블럭

phdljr·2024년 3월 22일
0

TIL

목록 보기
68/70
class Test {

    static {
        System.out.println(1);
    }

    {
        System.out.println(2);
    }

    Test() {
        System.out.println(3);
    }

    public static void main(String[] args) {
        Test test1 = new Test();
        Test test2 = new Test();
    }
}

위의 코드를 실행했을 때, 실행 결과가 어떻게 될까?

정답은 다음과 같다.

필자는 Java 문법만큼은 잘 알고있다고 생각했었는데, 이 코드를 보고 생각이 바뀌었다. 실행 결과가 어떻게 될지 예상조차 못했기 때문이다.

그래서 오늘은 초기화 블럭에 대해 내용을 간단하게 정리해보는 시간을 가져보겠다.


초기화 블럭(Initialization block)

  • 클래스 필드를 초기화시키는 방법
  • 초기화 블럭은 생성자보다 먼저 호출된다.
  • 초기화 블럭은 인스턴스 초기화 블럭클래스 초기화 블럭이 존재한다.

인스턴스 초기화 블럭

  • 단순히 중괄호{}만을 사용하여 정의할 수 있다.
  • 인스턴스가 생성될 때마다 실행된다.
  • 항상 생성자보다 먼저 실행된다.
  • 여러 개의 생성자가 있을 때, 모든 생성자에 공통으로 수행되어야 할 코드를 작성할 때 사용되며 코드의 중복을 막을 수 있다.
class Test {

    { // 인스턴스 초기화 블럭
        System.out.println(2);
    }

    Test() {
        System.out.println(3);
    }

    public static void main(String[] args) {
        Test test1 = new Test();
        Test test2 = new Test();
    }
}

클래스 초기화 블럭

  • static 키워드와 중괄호{}를 사용하여 정의할 수 있다.
  • 처음으로 메모리에 로딩될 때 단 한 번만 실행된다.
  • 생성자나 인스턴스 초기화 블록으로는 수행할 수 없는 클래스 변수의 초기화를 수행할 때 사용된다.
class Test {

    static { // 클래스 초기화 블럭
        System.out.println(2);
    }

    Test() {
        System.out.println(3);
    }

    public static void main(String[] args) {
        Test test1 = new Test();
        Test test2 = new Test();
    }
}

필드의 초기화 순서

  • 클래스 변수(static 필드)
    • 기본값 -> 명시적 초기화 -> 클래스 초기화 블럭
  • 인스턴스 변수
    • 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자

느낀 점

초기화 블럭이라는 키워드조차 처음 들어봤다. 예제 코드를 봤을 때, 키워드를 모르니 구글링할 때도 뭐라고 검색해야 할지 감도 안 잡혔다.

초기화 블럭의 존재와 이유를 알게 되니 납득이 되었다. 하나의 클래스에 여러 개의 생성자가 충분히 존재할 수 있으며, 만약 공통 코드가 존재한다면 이를 하나로 뽑아내서 관리할 수 있는 아주 좋은 역할을 해주기 때문이다.

이번에 새로운 Java 문법을 알게 돼서 신기했고, 어느 정도 Java를 해왔기 때문에 잘 알고 있다고 자칭했던 자신이 부끄러워졌다. 자만하지 말고, 항상 배우는 자세를 임하도록 하자.


참조

https://www.tcpschool.com/java/java_member_initBlock

profile
난 Java도 좋고, 다른 것들도 좋아

0개의 댓글