기본 콘텐츠로 건너뛰기

라벨이 동일성인 게시물 표시

Java에서 ==와 equals는 언제 다르게 동작할까

Java에서 ==와 equals는 언제 다르게 동작할까 빠른 답 객체에서 == 는 두 변수가 같은 객체를 가리키는지 확인하는 참조 비교다. equals 는 클래스가 정한 논리적 동등성 기준을 실행하는 메서드다. 직접 만든 값 객체에서 equals 를 재정의했다면 hashCode 도 같은 기준으로 맞춰야 한다. String 과 Integer 에서 == 가 true 로 보일 때가 있지만, 캐싱과 재사용의 결과일 수 있어 값 비교 기준으로 삼기 어렵다. 목차 왜 헷갈릴까 한눈에 비교 시간 흐름으로 이해하기 직접 만든 객체의 동등성 기준 String 비교에서 결과가 갈리는 이유 Integer와 래퍼 클래스의 캐싱 hashCode를 함께 맞춰야 하는 이유 값 객체라면 record도 선택지가 된다 흔한 오해 왜 헷갈릴까 Java에서 “같다”는 말은 두 가지 질문으로 나뉜다. 하나는 “두 변수가 같은 객체를 가리키는가?”이고, 다른 하나는 “두 객체를 같은 값으로 볼 수 있는가?”이다. 예를 들어 new Apple(100) 을 두 번 호출하면 무게가 같은 사과 객체 두 개가 생긴다. 이 둘은 값 관점에서는 같다고 볼 수 있지만, 객체 자체는 서로 다르다. == 는 앞의 질문, 즉 같은 객체인지 묻는다. equals 는 뒤의 질문, 즉 클래스가 정의한 값 기준에 따라 같은지 묻는다. 이 차이는 문법 암기보다 런타임 의미에 가깝다. 변수에는 객체가 직접 들어 있는 것이 아니라 객체를 가리키는 참조가 들어 있고, equals 는 그 참조가 가리키는 객체의 메서드로 실행된다. 한눈에 비교 비교 기준 == 는 참조를 비교하고, equals 는 클래스가 정의한 동등성 기준을 비교한다. 기본 동작 Object.equals 는 기본적으로 this == obj 와 같은 참조 비교 의미를 가진다. 변경 가능성 == 의 동작은 바꿀 수 없지만, equals 는 클래스에서 재정의할 수 있다. 컬렉션 영향 HashSet , HashMap 은 hashCode 로 후보 위치를...