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
반응형
'코딩 삽질' 카테고리의 다른 글
ubuntu 커널 에러 Code: 91059283 52800020 1400016f 17ffffa0 (d4210000) (0) | 2022.06.10 |
---|---|
[mybatis, java, spring] It's likely that neither a Result Type nor a Result Map was specified. (0) | 2022.05.19 |
[ubuntu, docker, tomcat] manage log files (0) | 2022.04.26 |
[java, selenium] web crawling (웹 크롤링) (0) | 2022.04.26 |
docker 컨테이너의 환경설정 (0) | 2022.04.05 |