Java에서 Integer 비교할 때 주의할 점

프로그래밍/자바2020. 7. 30. 15:56

오늘 알고리즘 공부 중에 또 새로운 것을 배웠습니다.

 

List<Integer> o1와 List<Integer> o2가 있을 때 Comparator를 통해 비교를 하기 위해 아래의 코드를 작성했었습니다.

class MyComparator implements Comparator<List<Integer>>{

	@Override
	public int compare(List<Integer> o1, List<Integer> o2) {
		if(o1.get(0) != o2.get(0)){
			return o1.get(0)-o2.get(0); //x좌표 기준으로 오름차순
		}else{
			return o1.get(1)-o2.get(1); //높이 기준으로 오름차순
		}
	}

}

그런데 이상하게 정렬이 제대로 수행되지 않았습니다.

범위를 하나하나 좁혀가니.. 두 Integer가 서로 같은 값을 가짐에도 o1.get(0)과 o2.get(0)을 비교하면 false로 나왔습니다. 저는 Integer가 자동으로 unboxing이 되어서 int값으로 비교가 될 것이라고 생각했는데 그렇지 않았습니다. 클래스의 reference를 비교하게 되어 제가 원하던 동작이 되지 않았습니다.

 

https://stackoverflow.com/questions/1514910/how-to-properly-compare-two-integers-in-java

위의 스택오버플로우 글에 의하면,

 

if (x.intValue() == y.intValue())

혹은

if (x.equals(y))

와 같은 코드를 사용하라고 합니다. equals를 사용하는 걸 보니 String을 비교하는 것이 생각이 나네요.

 

또한 한 가지 주목해서 봐야할 점은..

Integer a = 10;
Integer b = 10;

System.out.println(a == b); //prints true

Integer c = new Integer(10);
Integer d = new Integer(10);

System.out.println(c == d); //prints false

바로 위의 예제입니다.

 

Integer를 초기화할 때 생성자가 아닌 상수를 사용한 경우에는 비교가 잘 된다고 하네요.(그런데 작업 환경에 따라 다른 경우가 있나봐요)

 

Integer를 비교할 때는 equals를 사용하거나 intValue 함수를 사용하도록 합시다.

작성자

Posted by 드리머즈

관련 글

댓글 영역