DevJong12

[refactor]Integer의 equals와 ==의 차이점 본문

프로젝트/NoobLoL

[refactor]Integer의 equals와 ==의 차이점

Jong12 2022. 9. 11. 15:02
728x90

내가 프로젝트를 제작하면서 int를 대신하여 Integer를 사용하는 경우가 많았다.

 

보통의 경우라면 숫자를 사용할 때 int를 사용하겠지만 Integer를 사용했던 이유는 int의 경우에는 Null에 대한 표현이 불가능하지만 Integer의 경우에는 Null을 담을 수 있기 때문에 애용을 했다.

 

Integer를 사용하면서 int를 사용할 때는 없던 equals가 존재했고 equals와 ==의 차이점에 대해서 알게되어 추후라도 Integer를 사용할 때 주의를 하고자 한다.


문제의 내용

먼저 코드를 보여주면서 문제를 보고자한다.

1
2
3
4
5
6
7
8
9
10
Integer integerA = 1000;
Integer integerB = 1000;
int intA = 1000;
int intB = 1000;
 
 
System.out.println(integerA.equals(intA)); //1
System.out.println(integerA == intA); //2
System.out.println(integerA == integerB); //3
System.out.println(integerA.equals(integerB)); //4
cs
 
   

 

해당 코드의 1,2,3,4가 각각 어떤 값이 들어가는지를 알면 해당 포스트를 볼 필요가 없다. 이미 해당 지식을 알고 계시기 떄문이다.

 

먼저 답부터 기록을 하자면 아래와 같다.

  1. true
  2. true
  3. false
  4. true

여기서 왜 3번과 4번은 같은 결과인데 왜 false지? 라고 생각이 들수도 있지만 엄연히 다르다.

 

 

==를 사용하게 될 경우 Integer에서는 valueOf메소드를 사용하게 된다.. 해당 소스부터 보자면 아래처럼 이루어져 있다.

 

여기서 low는 음수 128, high는 양수 127로 -128 ~ 127까지의 숫자인 경우에는 int값으로 Return을 하고 있다.

그리고 그 범위 외의 숫자인 경우에는 new Integer로 객체를 다시 생성해서 변환을 하고 있다.

 

 

즉 아까 3번의 false가 나온 소스코드는 다음과 같다.

1
2
3
Integer integerA = 1000;
boolean result =  integerA == new Integer(1000);
System.out.println(result);
cs

이미 결과를 알지만 당연히 false다.


False가 나오는 이유

new Integer를 하는 경우 false가 나오는 이유를 알기전에 동등성과 동일성에 대해서 알면 좋을 듯 하다.

위에서 설명했듯 IntegerCache의 범위의 밖의 숫자의 경우에 Integer간의 비교의 경우에는 해당 두객체가 동등한지를 비교하는게 아니라 객체가 동일한지를 비교하는 문제다.

 

즉 아래의 3가지를 알면 좋을 듯 하다.

1. ==를 사용한 비교를 할 때 둘 중 하나라도 기본 타입(int)가 있는 경우에는 두 객체가 동등한지를 비교한다.

2. ==를 사용한 비교를 할 때  두 개의 객체가 모두 Wrapper Class(Integer)인 경우에는 두 객체가 동일한지를 비교한다.

3. .equals를 사용한 비교를 할 때 두 객체 또는 한객체라도 Integer를 사용한 경우, 두 객체는 동등한지를 비교한다

 

위의 내용들로 인하여, Integer를 사용하는 경우에는 equals를 사용한 비교가 정신건강에 이롭다.


글을 마치며

나 역시도 Integer를 사용한 이후 ==를 사용한 값비교를 주로 하고 있었으나, 해당 사실을 알게된 후 소스코드를 제작하면서 해당 부분에 대해서 생각하며 작성할 수 있는 기회를 가지게 되었다.

 

동등성과 동일성은 중요하니 계속 꼭 머리속에 기억하는게 좋을 듯하다... 과거에 공부하고서 그다지 크게 신경을 안썻다가 큰일날 뻔했다...


※ 혹시나 valueOf에서 나온 IntegerCache가 궁금할 수도 있기에 소스코드 전문은 아래와 같다. JDK의 Integer에 있으니 직접 봐도 좋을 듯 하다.

 

 

728x90
Comments