Static Initialization Block(정적 초기화 블록)

hoyong.eom·2024년 12월 29일

자바

목록 보기
5/5
post-thumbnail

java

오늘은 java 문법 중 static Initialization Block(정적 초기화 블록)에 대해서 알아보려고 한다
정적 초기화 블록 자체는 굉장히 단순하다. 말그대로 정적 변수의 값을 초기화 해줄 수 있는 코드 블록을 말한다.
무심코 사용하다보니 궁금한게 생겼다.
정적 초기화 블록의 초기화 순서는 언제일까? 사실 구글링만 해봐도 많은 정보가 있다.
그렇지만 직접 출력해보고 정리해야지 속이 풀린다..
그런 의미에서 직접 실행해보고 결과를 정리해보자!

1.변수 초기화

1.1 static 변수, 인스턴스 변수

static 변수와 인스턴스 변수는 초기화하지 않아도 기본값이 존재한다.
(static변수는 알고있었는데, 인스턴스 변수도 기본값이 존재할까?)

class Main {

    public static int staticValue;


    static class TestClass{
        int a;
        int b;

        public TestClass() {
        }
    }

    public static void main(String[] args) {

        System.out.println("static 변수 기본값 확인 : " + staticValue);

        TestClass testClass = new TestClass();
        System.out.println("instance 변수 기본값 확인 : " + testClass.a);
    }
}

Task :Main.main()
static 변수 기본값 확인 : 0
instance 변수 기본값 확인 : 0

1.2 지역 변수

지역변수는 초기화하지 않으면 사용할 수 없다.

        int localValue;
        System.out.println("지역 변수 기본값 확인 : " + localValue);

error: variable localValue might not have been initialized
System.out.println("지역 변수 기본값 확인 : " + localValue);

위 결과 처럼 컴파일 에러가 발생한다.


2.초기화 순서

2.1 static 변수, 인스턴스 변수

static 변수 : 클래스가 로딩될때 1번 초기화
인스턴스 변수 : 인스턴스가 생성될때 마다 각 인스턴스 별로 초기화

static 변수 초기화 순서
1) 기본값
2) 명시적 초기화
3) 정적 초기화 블록

class Main {


    public static int staticValue = 1; // 1.기본값 0 -> 2.명시적 초기화 1

    static {
        staticValue = 2; // 3.정적 초기화 블록 2
    }
    
    public static void main(String[] args) {
        System.out.println("static 변수 값 확인 : " + staticValue);

    }


}

Task :Main.main()
static 변수 값 확인 : 2

인스턴스 변수 초기화
1) 기본값
2) 명시적 초기화
3) 인스턴스 초기화 블록
4) 생성자

class Main {

    static class TestClass {
        int value = 1; // 1. 기본값 0 -> 2. 명시적 초기화 1

        {
            value = 2; // 3. 인스턴스 초기화 블록 2
        }
        public TestClass() {
            value = 3; // 4. 생성자 3
        }
    }

    public static void main(String[] args) {
        TestClass testClass = new TestClass();
        System.out.println("인스턴스 변수 기본값 확인 " + testClass.value);
    }
}

Task :Main.main()
인스턴스 변수 기본값 확인 3


3. 초기화 블록

초기화 블록은 static 블록과 인스턴스 블록이 존재한다. 이 블록들은 클래스 내에 선언되며 각각 static {}, {} 으로 작성된다고 한다.

3.1 static 블록

static 블록은 클래스가 로딩 될때 호출되며 각 클래스당 최초 1회만 실행된다.
static 블록은 static 변수와 static 메소드와 마찬가지로 객체가 생성되기 이전에 수행되므로 인스턴스 멤버에 접근이 불가능하다.

3.2 인스턴스 블록

인스턴스 블록은 인스턴스가 생성될 때 마다 수행된다.

참고

tomato2532 velog

0개의 댓글