[JAVA] 참조형 변수(Reference Type) 비교하기 ("==" vs equals())(Feat. Cache, Integer, Long)
2023. 7. 9.
반응형

 

 

자바에는 자료형이 기본형과 참조형으로 나눈다.

 

쉽게 말하자면 int는 기본형이고 Integer는 참조형이다.

둘은 똑같이 int범위 내의 정수를 담아내는 변수이다.

그러나 int는 그냥 우리가 아는 숫자 변수이고, Integer는 Object를 상속받은, 즉 객체이다.

여기서 문제가 발생한다.

 

참조형은 -128 ~ 127 범위 내에서는 cache를 한다. 

쉽게 설명하자면 아래와 같다.

 

 

 
 
 

 

Integer x = 127;
Integer y = 127;
System.out.println(x == y); //true

x = 128;
y = 128;
System.out.println(x == y); //false

 

 

 

이런 대참사가 발생해버린다. 그렇기 때문에 참조형 변수를 썼다면 '=='는 지향하는 것이 좋다.

여느 객체들과 같이(String 등) equals를 사용해주면 모든 수를 비교할 수 있다.

 

 

 

 

 

 

 

 

Integer x = 127;
Integer y = 127;
System.out.println(x.equals(y)); //true

x = 128;
y = 128;
System.out.println(x.equals(y)); //true

 

 

나같은 경우에는 개발을 하다가 id를 Long으로 한 걸 까먹고 long으로 한 줄 알고 그냥 '=='를 쓰고 있었고 회원번호가 127번까지는 문제없이 코드가 작동하기 때문에, 심지어는 어떤 런타임 에러 또한 나지 않았기 때문에 몰랐는데 직접 127번이 넘는 회원을 필터링해서 조회하다가 조회가 이상하게 되는 문제를 발견하고 나서야 이 문제를 인지했다...

 

정말 개념의, 기초의 중요성^^ 여러분을 저처럼 실수하지 마세요!

 

 

 

반응형
myoskin