[Java] 127과 128의 차이 (feat. IntegerCache)

주현·2026년 4월 8일

JAVA

목록 보기
13/13

시험에서 이런 내용이 있어서 정리해볼 겸 작성하려고합니다.

1️⃣

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

이는 당연하게도 true가 나올 것이다.

2️⃣

int a = 127;
Integer b = 127;
System.out.println(a == b);

해당 값은 뭘까? true이다. 이는 내부적으로 b.intValue()가 발생하여 Integer → int로 자동 변환하기 때문에 int비교로 값을 비교하게 되기떄문에 true가 나옵니다.

3️⃣

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

이는 어떻게 될까 이는 true가 나옵니다. Integer는 주소값을 비교하기 때문에 false가 나오지않을까? 라는 생각을 잠시했었던 것 같습니다. 순간 헷갈리더군요..

4️⃣

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

이는 어떻게 될까.. false가 나옵니다. 왜일까여

5️⃣

Integer a = 127;
Integer b = new Integer(127);
System.out.println(a == b);

false가 나옵니다.

원인 : Java IntegerCache

Java는 Integer 객체에 대해 Integer Cache 기능을 제공합니다!

Integer a = 127;를 하게되면, 컴파일러가 자동으로 선언을 해주게됩니다.

Integer a = Integer.valueOf(127);

Integer.valueOf(int i) 내부 로직은

if (i >= -128 && i <= 127) {
    return IntegerCache[i]; // 이미 만들어진 객체 반환
} else {
    return new Integer(i); // 새로 생성
}

으로 -128~ 127 정수를 선언하게 되면, 기존에 만든 Int 객체 중 동일한 값이 있다면 미리 만들어 둔 객체를 참조하게 되어, 3️⃣번은 true가 나오게 됩니다.

4️⃣번은 128로 선언해주기때문에, 이미 만들어진 객체를 반환해주는 것이 아닌, 새로운 객체를 반환해주기 때문에 ==로 비교연산을 하게되면 주소값을 비교하게 되기때문에 equals()연산으로 비교해줘야 true를 반환해주게 됩니다.

5️⃣번은 new를 통해서 새로운 객체를 만들었기 때문에, ==로 하면false가 나오겠죠


이런 간단한 문제를 고민해서 못 풀었던 내 자신... 후

1개의 댓글

comment-user-thumbnail
2026년 4월 29일

좋은글 감사합니다~!!

답글 달기