while(1) work();
article thumbnail
반응형

문제

class Q3 {
    public static void main(String[] args) {
        Integer a = 200;
        Integer b = 200;

        System.out.println(a == b);

        Integer c = 100;
        Integer d = 100;

        System.out.println(c == d);
    }
}

출력값은 무엇인가?

(1) true true

(2) false false

(3) true false

(4) false true

(5) 런타임 에러

(6) 컴파일 에러

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

정답

답은 4번. false true 이다.

 

Integer은 객체 래퍼(wrapper) 타입이기 때문에 두 객체는 동등성(equality)은 일치하지만 동일성(identity)은 달라야 할 것 처럼 보인다.

따라서 false false가 정답이어야 할 것 같다.

 

그런데 true true도 아니고 false true가 나온 이유가 무엇일까?

 

JAVA는 "자주 사용 될 것으로 예상되는 값"에 대해 캐싱을 한다.

Integer같은 경우 -128 ~ 127 영역의 값을 가지는 객체는 캐싱되어, 새 객체 생성 요청(Integer d = 100)이 오면

기존의 객체를 반환한다.

 

캐싱 로직

 

(참고로, 캐싱은 static inner class의 static 블록 내에 위치해있다. 따라서 JVM 구동 시 캐시 객체들이 생성되는 것은 아니고 lazy하게 생성된다.)

 

따라서 c와 d는 동등성/동일성이 모두 만족되는 객체(캐싱되어있는 객체)이고

a와 b는 캐싱 범위를 벗어났으므로, 동등하지만 동일하지 않은 객체이다.

반응형
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그