백엔드/Java

JAVA - 자바 Long(Wrapper class) 타입 비교 == 와 equals 를 사용하는 이유

dami97 2023. 11. 6. 22:31
반응형

 

Long 타입 값 비교를 하다 보면 true를 제대로 반환할 때도 있고 false를 반환하는 경우도 만난다.

 

 

이유

Java는 -128 ~ 127 범위의 Long , Integer 객체는 내부적으로 캐싱하여 동일한 객체로 취급 하기 때문에 == 비교를 해도 true가 나온다.

// -128 ~ 127 은 == 로 비교가능
Long a = 127L;
Long b = 127L;
Long _a = -128L;
Long _b = -128L;

boolean resultA = a == b;
boolean resultB = _a == _b;

System.out.println("a == b = " + resultA);      // a == b = true
System.out.println("_a == _b = " + resultB);    // _a == _b = true

 

주의할점

범위를 벗어난 Wrapper Type 값을 == 비교를 한다면 false 가 나온다. 당연하게도 값이 같지만 다른 주소값을 참조하고 있는 객체이기 때문이다.

// -128 ~ 127 를 벗어난 수 == 비교
Long c = 128L;
Long d = 128L;
Long _c = -129L;
Long _d = -129L;

boolean resultC = c == d;
boolean resultD = _c == _d;

System.out.println("c == d = " + resultC);      // c == d = false
System.out.println("_c == _d = " + resultD);    // _c == _d = false

 

결론

Wrapper Type 의 값은 equals()를 사용해 비교하면 오류를 방지할 수 있다.

// -128 ~ 127 이 아닌 수는 .equals()를 사용하자
Long c = 128L;
Long d = 128L;
Long _c = -129L;
Long _d = -129L;


boolean resultE = c.equals(d);
boolean resultF = _c.equals(_d);
System.out.println("c.equals(d) = " + resultE);      // c.equals(d) = true
System.out.println("_c.equals(_d) = " + resultF);    // _c.equals(_d) = true

 

 

추가

eqauls() 비교를 값을 직접 넣어 할 때 뒤에 L을 빠뜨리지 않도록 주의

Long a = 200L;

boolean resultA = a.equals(200);
boolean resultB = a.equals(200L);

System.out.println("a.equals(200) = " + resultA);   // a.equals(200) = false
System.out.println("a.equals(200L) = " + resultB);   // a.equals(200) = true
반응형