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로 하는 것이 좋지 않을까? 라는 피드백을 하려다 그래도 혹시 모르니 좀 더 찾아봤습니다.
어 안되네;;
그럼 왜 위의 i1 == i2 는 true가 나왔을까 궁금하여 찾아봤습니다.
wrapper 클래스는 기본값을 wrapping 할 때 valueOf 을 사용하게 된답니다.
이때 객체 생성 비용과 메모리를 아끼기 위하여 일정 범위의 값의 인스턴스는 미리 생성해 놓고
해당 범위 내의 기본 값이라면 미리 생성한 인스턴스를 반환하여 줍니다.
그래서 동등(==)연산에서 true가 나온 거였습니다. 같은 인스턴스니까요.
이때 값의 범위는 -128~127 입니다.
범위 밖의 기본 값은 new를 통해 새로 인스턴스를 생성하여 반환해 줍니다.
그래서 범위 밖의 비교에서는 동등 연산에서 false가 나온다고 하네요.
결론
그냥 객체는 equals 씁시다