일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- OrientalUnity
- DBDocs
- Scheduler
- spring
- 회고
- Naver Cloud
- junit
- papago
- 네이버 클라우드
- React
- Thymeleaf
- NaverCloudPlatform
- Naver Cloud Platform
- ncloud
- AssertJ
- object storage
- Pinpoint
- 네이버클라우드
- navercloud
- Enum
- NooBLoL
- Java
- ngrinder
- 에프랩
- docker
- NCP
- mybatis
- Database
- F-Lab
- spring boot
- Today
- Total
DevJong12
[refactor]Integer의 equals와 ==의 차이점 본문
내가 프로젝트를 제작하면서 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가 각각 어떤 값이 들어가는지를 알면 해당 포스트를 볼 필요가 없다. 이미 해당 지식을 알고 계시기 떄문이다.
먼저 답부터 기록을 하자면 아래와 같다.
- true
- true
- false
- 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에 있으니 직접 봐도 좋을 듯 하다.
'프로젝트 > NoobLoL' 카테고리의 다른 글
[Issue]Static주소를 입력시 발생하는 No Handler Exception (0) | 2022.09.21 |
---|---|
[Issue] Embedded-redis의 slf4j 의존성 이슈 (0) | 2022.09.15 |
[Issue] 회원가입 인증 메일의 방식 수정 (0) | 2022.09.10 |
[Issue] H2사용시 ON DUPLICATE KEY UPDATE 오류사항 (0) | 2022.09.09 |
개발서버 구성 - 사양이슈 (0) | 2022.08.02 |