자바 Wrapper Class == 비교

·2023년 1월 4일
0

발단

https://school.programmers.co.kr/learn/courses/30/lessons/147354

위의 문제를 풀고 있었다.
문제에서 주어진 조건대로 정렬을 하면 되는데, 해당 정렬 과정에서 기대한 대로 정렬이 되지 않았다.


기존 코드(실패)

o1과 o2는 모두 List<Integer> 타입이다.

o1.get(col-1) == o2.get(col-1)

위의 코드에서 양쪽은 Wrapper Class인 Integer 인스턴스를 같이 비교하게 된다.
Wrapper 특성상 자동으로 인스턴스가 unboxing 되어 Primitive 타입으로 바뀌어서 비교된다고 알고 있었고, 따라서 정상적으로 대소 비교가 가능하다고 생각했다....

하지만 반은 맞고 반은 틀리다..


원인

(Stack Overflow에서 가져옴)

자바에서 primitive 타입을 대입할 때는 JVM의 상수풀에 해당 값을 저장하기 때문에 ==연산을 사용해도 지장이 없다.
하지만 List<Integer>에 요소들을 추가할 때 Boxed Primitive 타입으로 생성된 객체가 들어갔다면, 그리고 비교하는 두 대상이 모두 객체라면, 그때의 == 연산자는 객체 주소를 비교하게 되어 값이 같더라도 False를 반환하게 된다.

객체(Wrapper 포함)끼리의 == 사용은 의도되지 않은 주소값 비교 상황이 연출될 수 있다.


수정된 코드

이렇게 == 없이 각 케이스마다 구현하거나,

이렇게 equals() 메서드를 사용해준다.
사실 문자열 비교를 할 때는 항상 equals()compareTo()를 사용했지만, Wrapper Class도 두 메서드가 있는지 몰랐다.

profile
渽晛

0개의 댓글