Boxed Type 비교는 무엇으로?
사이드 프로젝트할 때 Boxed Type(Integer, Long) 비교에 대해 선배 개발자 분에게 질문을 했다. 현재 작업에서 == 과 equals 비교 모두 내가 원하는 결과값(True, False)을 주고 있는 상황이었지만 Boxed Type은 Object였기에 equals을 사용해야할 것 같았기 때문이다.
== 비교가 True가 나왔던 이유
Boxed Type의 경우 Object이기에 == 비교는 주소값의 동일 유무를 따진다. 하지만 Integer 내부에서는 -128 ~ 127의 값은 Cache를 해뒀다가 해당 값이 들어올 경우 저장해둔 Integer 객체를 반환해준다. 그러기에 -128 ~ 127 사이의 값을 사용할 경우 같의 값의 경우 같은 객체를 가져 == 비교는 True가 나오게 된다. 프로젝트에서 저 비교가 100이하에 값들만 사용되는 곳에 쓰였기 때문에 문제가 없어보였던 것이다.
equals을 사용하자
Boxed Type(Integer, Long)의 실제 값의 비교를 위해서는 == 를 사용하는 것은 좋지 않다. Cache 범위 밖의 값을 만날 경우 문제가 생기기 때문이다. 아래 코드(Java Integer equals)와 같이 실제 값을 비교해주는 equals를 사용하는 것이 좋다.
// Java Integer 클래스 내부 equals 코드
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
'개발공부' 카테고리의 다른 글
[ JAVA SPRING ] JavaSpring에서 STOMP 설정 (0) | 2023.05.28 |
---|---|
[ JPA ] QueryDSL Select에 DTO 사용하는 경우 자동 조인 (0) | 2023.05.21 |
[ Java Spring ] List 정렬하기 (0) | 2022.12.19 |
[ Java Spring ] CRUD Repository vs JPA Repository (0) | 2022.12.04 |
DB 외부 접속 포트 포워딩 문제 (0) | 2022.11.21 |