[CS 지식] Java 내 == 과 equals 간의 차이점

Kim Hyen Su·2024년 11월 27일

면접질문

목록 보기
21/27
post-thumbnail

==는 연산자로써, 원시타입을 비교 시 값을 비교하고, 참조타입을 비교 시 참조값을 비교한다.

equals는 Object 클래스 내 정의된 메서드이다. 기본적으로 == 연산자와 동일하게 동작하지만, 객체 내부의 값들의 같음 여부를 확인하도록 하기 위해서는 equals 메서드를 재정의하여 사용한다. 일반적으로 인스턴스 간의 비교 시 Object 객체의 equals()와 hashCode() 메서드를 재정의하여 사용한다.

String 객체는 == 연산자로는 비교할 수 없는가?

== 연산자로 비교는 가능하지만, String 객체 생성 방식에 따라서 다른 결과를 가져올 수 있다.
리터럴로 String 객체 생성 시 String Pool을 확인하여 존재할 경우, 해당 객체를 재사용하고, 없는 경우 생성하는 식으로 동작한다. 따라서, 동일한 문자열 리터럴인 경우, 같다라는 결과를 반환하게 된다. 하지만, new String()을 통해서 생성하게 된다면, 문자열을 저장한 참조값을 비교하기 때문에, 같지 않다라는 결과를 반환하게 된다. 이처럼 다른 결과를 가져오기 때문에 일반적으로 equals()로 비교하는 것이 좋다.

왜 equals()와 hashCode() 둘 다 재정의해야 하나요?

Java의 Collection Framework 중 HashSet과 HashMap과 같은 해시 기반 컬렉션을 사용 시 문제가 발생할 수 있기 때문이다. Java 규약에 따르면, equals()로 같다고 판단되는 두 객체는 반드시 같은 hashCode()를 가져야 한다. HashMap의 조회 과정을 보면, hashCode()로 객체가 저장된 버킷을 찾고, equals()로 객체 동일 여부를 확인하기 때문에, hashCode()를 재정의하지 않을 경우, 내용이 같은 두 객체라도 다른 버킷에 저장될 수 있으므로, HashSet이나 HashMap에서 예상치 못한 동작이 발생할 수 있다. 따라서, equals()와 hashCode() 모두 재정의해줘야 한다.

profile
백엔드 서버 엔지니어

0개의 댓글