자바 Long 비교 시 ('==' vs 'equals') ?

용용학생·2024년 1월 28일

자바

목록 보기
1/32

개요..

백준 문제 절댓값 힙 을 푸는 중에 Long 값을 비교하는 데에서 예상치 못한 개념 부족 상황이 발생!

위의 문제를 우선순위 큐를 이용하여 절댓값이 같다면 음수를 우선순위가 높게 두는 코드를 만들었다.

오류가 발생한 코드

static PriorityQueue<Long> absValQueue = new PriorityQueue<>((o1, o2) -> {
        Long abs1 = Math.abs(o1);
        Long abs2 = Math.abs(o2);


        // 입력 예시 : 3 2147483647 -2147483647 0 
        if(abs1 == abs2) { // 여기서 2147483647 과 -2147483647의 비교값이 false가 나옴
            return o1 < o2 ? -1 : 1;
        }else { // 절대값이 다르다면 절대값이 작은 게 우선
            return abs1 < abs2 ? -1 : 1;
        }
        
        
         

원인

기본적으로 동일성 비교인 ==은 메모리 주소값을 비교하기 때문에 값이 같더라도 메모리 위치가 다르면 false를 반환한다.

-128 ~ 127 까지는 Integer와 Long 객체를 캐싱하여 동일한 객체로 취급하지만 이 범위 밖의 값들은 동등성 비교인 equals()를 사용해야 한다!!

해결 방법

static PriorityQueue<Long> absValQueue = new PriorityQueue<>((o1, o2) -> {
        Long abs1 = Math.abs(o1);
        Long abs2 = Math.abs(o2);

		// Reference Type인 Long은 동등성 비교를 통해 값 비교하기!
        if(abs1.equals(abs2)) { // 두 개의 절대값이 같다면 음수가 우선순위
            return o1 < o2 ? -1 : 1;
        }else { // 절대값이 다르다면 절대값이 작은 게 우선
            return abs1 < abs2 ? -1 : 1;
        }

Reference Type들은 동등성 비교를 통해 값을 비교하자!!!!
동일성 비교를 사용하면 값이 아닌 객체를 비교하기 때문에 원하는 결과가 나오지 않는다.

P.S) int는 왜 동일성 비교가 가능해?

Primitive Type인 int 형은 객체가 없기 때문에 주소가 없다. 그래서 == 연산자를 사용했을 때 값만 같다면 동일하다고 말한다.

profile
자바 스프링 공부하는 정리 블로그!

0개의 댓글