본문 바로가기

JAVA

JAVA Collection Framework 3: HashSet을 통한 Hash 탐구

hashCode()와 equals()의 오버라이딩.

도대체 다른 컬렉션들은 안하는 짓을 왜! 귀찮게 HashSet을 구현할 땐 해야하는지 의문이 생겨 찾아보게 되었다.

찾다보니 설명을 다 들었던 것이라는 걸 깨달아서 놀랐다.

내가 이해를 못하고 들었을 뿐.

 

 

 

HashSet은 동일한 값을 허용하지 않는다.

이를 위해서 기존에 가지고 있는 값에 동일한 것이 있는지 확인이 필요하다.

 

특히 HashSet에 넣는 값이 객체라면,

Object 객체로부터 내려오는 equals(), hashCode() 메서드를 오버라이딩 해야 하는데 그 이유는

객체 자신과 Object를 비교하고 

  1. 객체의  hashCode() 를 호출해 비교하고 그 값이 같다면,

  2. equals() 를 호출해 동일한 객체인지 확인하기 때문이다.

  (즉, 동일객체는 각 객체의 hashCode가 일치하고,

equals 매서드로 인스턴스변수를 하나하나 비교 시 모두 일치하면 true/불일치 false)

 

  • Object의 public int hashCode(Object obj) : 해당 객체의 "주소값"을 10진수 형태로 만들어 고유한 정수 반환

  오버라이딩 후, "실제 담긴 문자열"을 가지고 10진수 형태로 만들어 반환

  객체의 "실제 각 필드에 담긴 데이터"가 일치하면 동일한 10진수 반환

 

  • Object의 public boolean equals() : 두 객체의 "주소값"을 비교, 일치하면 true/불일치 false 반환

  오버라이딩후, "실제 담긴 문자열"을 가지고 동등비교를 진행하여 일치 true/불일치 false 반환

  객체의 "실제 각 필드에 담긴 데이터" 가 다 일치하면 true/일치하지 않으면 false

 

만약 두 메서드를 오버라이딩 하지 않으면,

객체 안의 인스턴스 변수 값이 같다고 하더라도 다른 객체로 인식하게 된다.

 

 

 

좀 더 명확한 이해는 자료구조를 공부해야 할 것 같다😥

할수록 모르는 것만 많아지는 느낌