728x90
반응형

Integer인 각각의 A, B의 값이 같은지 비교하여, 다른 경우 C의 값을 2로 변경하는 코드가 있다.

그런데 A, B 모두 200 이었는데 C 값이 변경이 2로 변경된게 발견 되었다.

동일한 Integer이고, 둘다 200인데 왜 내 의도와 다른 결과가 나왔을까?

 

디버깅을 해봐도 분명 200으로 같은 값인데 뭐가 문제인가 싶어 검색을 해보니

두개의 Integer의 비교 시 == 또는 != 사용시 변수의 주소값을 비교하기 때문 이었다.

 

아래는 이를 보여주는 단순한 예시코드다

* 예시코드

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
public class TestCode {
    
    public static void main(String[] args) {
        
        Integer integerA = 1;
        Integer integerB = 1;
        Integer integerC = new Integer(1);
        int intA = 1;
        int intB = 1;
        
        System.out.println("integerA : " + integerA);
        System.out.println("integerB : " + integerB);
        System.out.println("integerC : " + integerC);
        System.out.println("intA : " + intA);
        System.out.println("intB : " + intB);
        System.out.println("#################");
        System.out.println(integerA == 1);
        System.out.println(intA == 1);
        System.out.println(integerA == integerB);
        System.out.println(integerA == integerC);
        System.out.println(intA == intB);
        System.out.println(integerA == intA);
        System.out.println("#################");
        System.out.println(integerA.equals(1));
        System.out.println(integerA.equals(integerB));
        System.out.println(integerA.equals(integerC));
        System.out.println(integerA.equals(intA));
    }
}
cs

* 출력된 결과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
integerA : 1
integerB : 1
integerC : 1
intA : 1
intB : 1
#################
true
true
true
false
true
true
#################
true
true
true
true
cs

분명 같은 1을 갖고 있음에도 소스코드 20번 라인의 실행결과는 false로 나오고 있다.

그러므로 Integer 값에 대해 동일여부를 확인할때 == 또는 !=를 사용하고 있다면, 

내 의도와 다른 결과가 나올 수 있으므로 equals을 사용하자.

(더 곤란한건 exception도 없이 소스는 잘 돌아간다.)

 

 

추가로,

사실 이 이슈는 단순히 주소값 비교로 설명하면 안 된다.

Primitive Type, boxed Primitive Type, wrapper class 라는 개념에 관련된 내용이다.

이 내용을 설명하기에는 너무 길어지니 자세한 내용은 구글 검색을 추천!

728x90
반응형

+ Recent posts