programming/프로젝트

Wrapper class 동등(==)연산

yhsim98 2022. 9. 5. 23:29

프로젝트 코드 리뷰 도중 wrapper class를 동등연산한 것을 보았습니다.

id == selectedCategoryByName.getId()
// 둘 다 Integer 입니다

wrapper 클래스는 primitive 값이 아닌데 동등 연산을 해도 되나? 라는 생각이 들었고 

 

혹시 될 수도 있으니까 직접 테스트 해보았습니다.

Integer i1 = 1;
Integer i2 = 1;

Sout(i1 == i2); // true

어 되네;;

 

되는구나... 싶다가도 그래도 객체니까 equals로 하는 것이 좋지 않을까? 라는 피드백을 하려다 그래도 혹시 모르니 좀 더 찾아봤습니다.

 

 

http://www.tcpschool.com/java/java_api_wrapper

어 안되네;;

 

그럼 왜 위의 i1 == i2 는 true가 나왔을까 궁금하여 찾아봤습니다.

 

wrapper 클래스는 기본값을 wrapping 할 때 valueOf 을 사용하게 된답니다.

 

이때 객체 생성 비용과 메모리를 아끼기 위하여 일정 범위의 값의 인스턴스는 미리 생성해 놓고
해당 범위 내의 기본 값이라면 미리 생성한 인스턴스를 반환하여 줍니다.

 

그래서 동등(==)연산에서 true가 나온 거였습니다. 같은 인스턴스니까요.

 

이때 값의 범위는 -128~127 입니다.


범위 밖의 기본 값은 new를 통해 새로 인스턴스를 생성하여 반환해 줍니다.
그래서 범위 밖의 비교에서는 동등 연산에서 false가 나온다고 하네요.

 

결론

그냥 객체는 equals 씁시다