1. 자바에서 동일성과 동등성 이해하기
객체 지향 프로그래밍에서 동일성(Identity)과 동등성(Equality)은 객체를 비교하는 두 가지 중요한 개념이다.
2. 동일성(Identity)
동일성은 두 객체가 메모리 상에서 같은 위치를 차지하고 있는지, 즉 같은 객체인지를 판단한다.
자바에서는 `==` 연산자를 사용하여 동일성을 확인한다.
예를 들어,
Integer a = new Integer(1);
Integer b = a;
System.out.println(a == b); // true
이 경우 a와 b는 동일한 객체를 참조하므로 true를 반환한다.
3. 동등성(Equality)
동등성은 두 객체의 내용이나 상태가 같은지를 비교한다.
자바에서는 `equals()` 메소드를 사용하여 동등성을 확인한다.
예를 들어,
Integer c = new Integer(1);
Integer d = new Integer(1);
System.out.println(c.equals(d)); // true
c와 d는 서로 다른 객체이지만 내용이 같으므로 equals() 메소드는 true를 반환한다.
4. equals() 메소드
equals() 메소드는 Object 클래스에 정의되어 있지만,
많은 클래스에서 이를 오버라이딩하여 자신만의 동등성 비교 로직을 구현한다.
왜냐하면, Object 클래스에 정의되어 있는 것은 `==` 비교를 하기 때문에 동일성을 비교하기 때문이다.
따라서, 동일성 비교를 해주기 위해 직접 구현해야 하는 것이다.
equals() 메소드를 올바르게 구현하기 위해서는 반사성, 대칭성, 추이성, 일관성의 네 가지 규칙을 따라야 하는데,
보통은 IDE에서 제공하는 로직을 차용하거나 라이브러리를 사용하여 구현한다.
5. hashCode() 메소드
equals() 메소드를 오버라이딩할 떄는 반드시 hashCode() 메소드도 함께 오버라이딩해야 한다.
이는 자바의 일반 규약으로,
equals()로 비교해 true가 나오는 두 객체는 반드시 같은 hashCode() 값을 반환해야 한다.
hashCode() 메소드는 객체를 식별하는 정수값을 반환하며,
이는 해시 기반의 컬렉션(예: HashMap, HashSet)에서 객체를 효율적으로 관리하는 데 사용된다.
결론
동일성과 동등성을 올바르게 이해하고 구현하는 것은 자바 프로그래밍에서 매우 중요하다.
`==` 연산자는 객체의 동일성을, equals() 메소드는 객체의 동등성을 비교하는 데 사용된다.
또한, equals() 메소드를 오버라이딩할 때는 반드시 hashCode() 메소드도 함께 오버라이딩해야 한다.
References
https://www.maeil-mail.kr/question/71
https://f-lab.kr/insight/understanding-equality-and-identity-in-java
https://www.linkedin.com/advice/0/how-do-you-implement-equals-hashcode-methods
'백엔드 면접 질문' 카테고리의 다른 글
웹 브라우저에 www.google.com 을 입력했을 때 어떤 과정이 이뤄지나요? (0) | 2024.12.31 |
---|---|
데이터베이스 커넥션 풀(Connection Pool)을 사용하지 않으면 어떤 문제가 발생할 수 있나요? (0) | 2024.12.26 |
equals와 hashCode는 왜 함께 재정의 해야 하나요? (0) | 2024.12.16 |
JPA에서 ID 생성 전략에 대해서 설명해주세요. (1) | 2024.12.07 |
얕은 복사와 깊은 복사에 대해서 설명해주세요. (0) | 2024.12.04 |