자바에서 정수 값을 비교 할 때, 은근히 헷갈리는 경우가 많습니다.
관련 내용을 간략하게 정리해 보겠습니다.
==
연산자는 원시타입을 비교할 때 사용합니다.
객체타입을 비교하면 결과 값은 무조건 false
가 됩니다.
원시타입 = Primitive Type = int 객체타입 = Wrapper Class = Integer
int A = 1000; int B = 1000; if (A == B) System.out.println(true); else System.out.println(false); Output - true
Integer
형일 경우 127 까지는 ==
연산자로 처리 되지만, 128부터는 처리가 되지 않습니다.
자바에서 -128 ~ 127 사이의 Integer 값을 캐쉬하기 때문입니다.
Integer A = 127; Integer B = 127; if (A == B) System.out.println(true); else System.out.println(false); Output - true
Integer A = 128; Integer B = 128; if (A == B) System.out.println(true); else System.out.println(false); Output - false
equals
는 객체타입을 비교할 때 사용합니다.
그래서 원시타입을 비교하면 오류가 발생합니다.
Integer A = 1000; Integer B = 1000; if (A.equals(B)) System.out.println(true); else System.out.println(false); Output - true
원시 타입 int를 비교하면 참조할 수 없다고 오류가 발생합니다.
int A = 1000; int B = 1000; if (A.equals(B)) System.out.println(true); else System.out.println(false); Output - java: int cannot be dereferenced
객체타입을 원시타입으로 바꿔서 비교할 수도 있습니다.
하나의 값만 변환이 필요할 때 사용하면 유용한 방법입니다.
Integer A = 128; Integer B = 128; if (A.intValue() == B.intValue()) System.out.println(true); else System.out.println(false); Output - true
추가로 Integer에 대해 알아보겠습니다.
동일한 Integer 형인데 new Integer()
로 대입하면, 주소 값이 달라집니다.
Integer A = 127; Integer B = new Integer(127); if (A == B) System.out.println(true); else System.out.println(false); Output - false
만약, ==
연산자를 쓰고 싶으면 Integer 대입 방식을 바꿔주면 됩니다.
Integer A = 127; Integer B = Integer.valueOf(127); if (A == B) System.out.println(true); else System.out.println(false); Output - true
근데 Integer는 ==
연산자로 -128 ~ 127 사이만 비교가 가능합니다.
그냥 객체타입은 equals를 쓰는게 좋습니다.
Integer A = 128; Integer B = new Integer(128); if (A.equals(B)) System.out.println(true); else System.out.println(false); Output - true
참고로 Integer(int)
는 Java 버전 9부터 제거 대상입니다.
그래서 이제는 굳이 사용 할 이유가 없습니다.
해당 코드를 사용하면 친절한 안내 문구를 볼 수 있습니다.