compile-time_constant

2 min read

compile-time_constant


package com.github.sejoung.codetest.singleton;

class OldSingleton {
    //compile-time constant
    final static String NAME = "OldSingleton";
 
    final static String NAME = new String("OldSingleton");
    final static OldSingleton INSTANCE = new OldSingleton();

    private OldSingleton() {
        System.out.println("hi");
    }

}

위에 코드에서 아래의 변수를 선언하면 compile-time constant라고 하는데 컴파일 시점에 상수를 참조 하고 있는 값을 상수 내부의 값으로 바꿔준다.


final static String NAME = "OldSingleton";

그래서 아래의 코드를 찍어 보면


package com.github.sejoung.codetest.singleton;

public class SingletonTest {
    
    public static void main(String[] args) {
        System.out.println("1======================");
        System.out.println(OldSingleton.NAME);
        System.out.println("2======================");
        OldSingleton oldSingleton1 = OldSingleton.INSTANCE;
        System.out.println("3======================");
        OldSingleton oldSingleton2 = OldSingleton.INSTANCE;
        System.out.println("4======================");
        System.out.println(oldSingleton1 == oldSingleton2);

    }

}


아래 처럼 static 변수를 선언해서 가지고 와도 싱글톤 객체가 참조 되는 순간 new되는 것 처럼 보인다.


1======================
OldSingleton
2======================
hi
3======================
4======================

하지만 위에서 말했듯이 compile-time constant라서 정상인것처럼 보였지만 코드를 아래 처럼 변경 해주면


 final static String NAME = new String("OldSingleton");

아래 처럼 OldSingleton.NAME 참조 되는 순간 객체가 생성 되는 것이 보인다.

1======================
hi
OldSingleton
2======================
3======================
4======================
true

참조