본문 바로가기

강의 내용 정리/JAVA 기초 정리

4-10강 Set 인터페이스의 이해

# Set 인터페이스

- 중복 X

- 단일 요소 꺼내지 못함 ( 전체 꺼내야함 )

 

 

# 예시 상황( 출력 2 )

 

이 때 안의 emiail, nickname은 같지만 다른 객체 이므로 set.add(customer); set.add(customer); 에서는 처음 add만 작동 하지만 아예 다른 Customer를 new한 뒤 add 하면 들어간다.  ( 다른 객체 이기 때문 )

-> Customer 클래스에서 email, nickname 같으면 같은 객체라는 설정을 해주어야한다.  ( email만 같으면 같은 객체로 볼건지 ) -> 우리가 결정

 

인텔리제이의 기능 자동생성으로 equls, hashCode 를 생성하면 email, nickname이 같으면 같은 객체로 본다.

 

 

Hashcode를 사용하는 이유

Hashcode를 사용하는 이유 중에 하나는, 객체를 비교할 때 드는 비용을 낮추기 위해서 입니다. 자바에서 2개의 객체가 같은지 비교할 때 equals()를 사용하는데, 여러 객체를 비교할 때 equals()를 사용하면 Integer를 비교하는 것에 비해 많은 시간이 소요됩니다. Java에서 hashcode는 Integer이며, hashcode를 이용하여 객체를 비교하면 equals()를 이용하는 것보다 시간이 단축됩니다. 보통 HashMap에서 hashcode를 이용하여 객체를 매핑하며 객체를 찾을 때 사용합니다.

두 객체의 hashcode가 다르면 두 객체는 같지 않습니다. 따라서, 객체를 비교할 때 먼저 hashcode를 비교하면, 절대 같을 수 없는 경우를 빠른 연산으로 확인할 수 있습니다. 그리고 hashcode가 같을 때는 equals()로 두 객체가 같은지 비교할 수 있습니다.

  • hashcode가 다르면, 두개의 객체가 같지 않다
  • hashcode가 같으면, 두개의 객체가 같거나 다를 수 있다

 

 

hashCode()의 주석을 보면 아래 두가지 규칙을 소개하고 있습니다.

  • 두 객체가 같으면(equals()가 true 리턴), hashCode()는 같은 값을 리턴해야 합니다.
  • 두 객체가 같지 않을 때 (hashCode()가 false), hashCode()가 꼭 다른 값을 리턴해야하는 것은 아닙니다. 하지만 다른 값을 리턴하면 hash table의 성능이 향상됩니다.

첫번째 규칙은 equals()가 같을 때 hashCode()도 같은 값을 리턴해야하는 것인데요. 즉, equals()를 오버라이드하여 재정의하면, hashCode()도 재정의하여 같은 객체에 대해서 같은 값을 리턴하도록 구현해야 합니다. 커스텀 클래스가 hash table을 사용하지 않고 자신의 코드 내에서 equals()만 사용할 때는 hashCode()를 오버라이드 하지 않아도 문제는 없겠지만, 나중에 HashMap에서 사용될 때 문제가 될 수 있습니다.

두번째 규칙은 객체가 달라도 계산된 hashcode가 같을 가능성이 있다는 것인데요. hashcode가 같으면 equals()로 같은 값을 찾기 때문에 문제가 되지는 않습니다. 하지만 hashing 알고리즘이 중복된 hashcode를 적게 만들 수록 hash table의 equals()를 적게 사용하여 hash table의 성능이 향상될 수 있다는 것으로 해석할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 자료를 참고하였습니다.

 

 

꾸준히 다시보자.

 

1. 220725

2. 220814

3. 220910

Recent Posts
Popular Posts
Recent Comments