티스토리 뷰

반응형

동등 연산자(==)을 사용한 비교의 문제점

Integer integer1 = 100;
Integer integer2 = 100;

System.out.println(integer1 == integer2); // true

 위의 코드를 실행했을 때 integer1과 integer2는 동일하다고 나온다.

 

Integer integer1 = 1_000;
Integer integer2 = 1_000;

System.out.println(integer1 == integer2); // false

 

 integer1, integer2 값이 4였을 때와는 달리 위의 코드는 integer1과 integer2를 비교했을 때 다르다는 결과가 출력된다. Integer 값을 동등 연산자(==)을 사용했을 때 정확하게 비교할 수 있는 값은 ~128~127까지의 범위만 가능하다.

 Integer 클래스를 열어보면 내부에 IntegerCache라는 내부 클래스가 있다. 이 클래스는 -128~127까지의 범위만 autoboxing을 제공한다고 되어 있다. 캐시로 인해서 -128~127 사이의 값을 가지는 Integer는 같은 객체를 참조하는 것이다. 따라서 1000은 해당 범위를 벗어나기 때문에 다른 객체를 참조 하고 있기 때문에 false가 리턴된다.

 그럼 동등 연산자(==)로 바로 Integer을 비교하는 것은 적절한 방법이 아니다.

 

 

Integer가 동등한지 비교하는 방법

Integer 비교 방법 1 - intValue 사용

intValue 내부 구현

 intValue를 사용하면 Integer의 값을 int로 반환한다고 되어 있다.

 

Integer integer1 = 1_000;
Integer integer2 = 1_000;

System.out.println(integer1.intValue() == integer2.intValue()); // true

 intValue 메서드는 Integer이 아니라 int를 반환한다. 이렇게 반환받은 int 값을 동등 연산자를 통해서 비교하면 된다.

 

Integer 비교 방법 2 - equals 사용

Integer의 equals 내부 구현

 equals는 내부에서 intValue를 통해서 int 값을 비교하고 있다. equals를 통해서 true 혹은 false로 비교 결과를 받을 수 있다.

 

Integer 비교 방법 3 - compare, compareTo 사용

compare 내부 구현
comepareTo 내부 구현

Integer integer1 = 1_000;
Integer integer2 = 1_000;

System.out.println(integer1.compareTo(integer2)); // 0
System.out.println(Integer.compare(integer1, integer1)); // 0

 

 compare, compareTo 메서드를 통해서도 비교할 수 있다. (compareTo는 내부적으로 compare을 호출한다) 이 메서드들을 사용하면 boolean 값이 아니라 -1, 0, 1 값을 반환한다. 비교하는 대상이 자기보다 크면 -1, 같다면 0, 그외의 경우(비교 대상이 자기보다 큰 경우)에는 1을 반환한다.

 

 

참고

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함