equals() 메서드와 == 연산자 비교
equals()
- 객체의 내용물을 비교한다. 객체들을 논리적으로 비교했을 때 동등하다면 동등하다고 판단한다.
- Object 클래스에 속한 메서드이므로 기본 자료형에 사용할 수 없다.
- 클래스마다 오버라이딩하여 작동 방식이 다 다를 수 있으므로 ==보다 실행 속도가 느릴 수 있다.
- 커스텀 객체의 동등성 비교, 컬렉션 등에 사용한다.
== 연산자
- 객체의 참조값을 비교한다. 객체들의 메모리 위치가 동일하면 동등하다고 판단한다.
- 자바가 기본적으로 제공하는 연산자이므로 기본 자료형에 사용할 수 있다.
- 기본 자료형에 적용할 경우 값을 비교한다.
- 언제나 동일한 방식(값 비교)으로 작동하므로 실행 속도가 빠르다.
- 기본 자료형의 동등성 비교, null 확인 등에 사용한다.
- 예외적인 경우
- Enum은 언제나 singleton 패턴으로 상수를 생성하므로 == 연산자를 사용할 수 있다.
- String의 경우 String Pool에 저장되었느냐 아니냐에 따라 결과가 달라질 수 있다.
➕ equals()를 오버라이딩할 때 지켜야 할 규칙
- 재귀성: x.equals(x)가 true여야 한다.
- 대칭성: x.equals(y)와 y.equals(x)의 결과가 동일해야 한다.
- 이행성: x.equals(y)이고 y.equals(z)인 경우, x.equals(z)는 앞선 식들과 결과가 동일해야 한다.
- 일관성: 여러 번 호출해도 그 결과가 동일해야 한다.
- null 확인: x.equals(null)가 false여야 한다.