https://www.acmicpc.net/problem/3009

문제를 풀다 새로운 것을 이해했다.

public class Main {
    public static void main(String[] args){
        Integer A = 3;
        Integer B = 3;
        System.out.println("A == B ? "+(A==B));
        Integer C = 128;
        Integer D = 128;
        System.out.println("C == D ? "+(C==D));
    }
}

두개의 결과는 모두 참일까? 그렇지 않다.

첫 번째의 비교는 True, 두 번째의 비교는 False가 나온다.

늘 자바에서 문자열이 아닐 때에는 ==비교를 했는데, 이상하게도 결과가 false가 나왔다.

 

왜 그럴까?

자바에서 int는 primitive type이고, Integer는 객체다.

그래서 primitive type끼리는 ==를 해도 되지만, 객체끼리의 비교는 ==을 쓰면 안된다.(String에서 ==를 안 쓰고 equals를 쓰는 이유와 동일하다.)

그런데, 자바의 내부 동작 구조 원리상 Integer는 -128 ~ 127까지만 동일 객체의 캐시를 가져다 쓰기 때문에

그 전과 그 후의 값들은 주소값이 달라 ==비교가 불가능한 것이다.

 

 

 

참고)

https://romcanrom.tistory.com/177

 

java/ Integer를 '==' 연산자가 아닌 'equals' 메서드로 비교해야 하는 이유 (Integer Cache)

Integer 값을 비교할 때 'equals' 메서드를 사용하지 않고 '==' 연산자를 사용해 코드를 작성한 경우, 일부 값은 정확하게 비교가 되는 반면 일부 값에 대해서는 같은 값임에도 false를 반환하는 경우가

romcanrom.tistory.com

 

+ Recent posts