일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 개발자취업
- try-catch-finally 블록
- throws 키워드
- 실행 예외
- 예외
- 다중 catch 블록
- 코딩테스트준비
- 로켓펀치 #취준컴퍼니 #취업 #일상 #취준생
- 99클럽
- 항해99
- 예외 처리
- 예외클래스
- til
- 일반 예외
- Today
- Total
innn
기본 API 클래스 - Object 클래스의 hashCode() 메소드 본문
객체 해시코드(hashCode())
객체 해시코드란 객체를 식별하는 하나의 정수값을 말한다. Object 클래스의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있다. 논리적 동등 비교 시 hashCode()를 오버라이딩할 필요가 있는데, 컬렉션 프레임워크에서 HashSet, HashMap, Hashtable은 다음과 같은 방법으로 두 객체가 동등한 지 비교한다. ((( 추후에 컬렉션 프레임워크도 정리해서 링크를 걸어두겠습니다 ! )))
우선 hashCode() 메소드를 실행해서 리턴된 해시코드 값이 같은지를 본다. 해시코드 값이 다르면 다른 객체로 판단하고, 해시코드 값이 같으면 equals() 메소드로 다시 비교한다. 그렇기 때문에 hashCode() 메소드가 true가 나와도 equals()의 리턴값이 다르면 다른 객체가 된다.
** hashCode를 equals와 함께 재정의하지 않으면 코드가 예상과 다르게 작동하는 위와 같은 문제를 일으킨다. hash 값을 사용하는 Collection(HashSet, HashMap, HashTable)을 사용할 때 문제가 발생한다.
아래의 예제를 보면 Key 클래스는 equals() 메소드를 재정의해서 number 필드값이 같으면 true를 리턴하도록 했다. 그러나 hashCode() 메소드는 재정의하지 않았기 때문에 Object의 hashCode() 메소드가 사용된다.
이런 경우 HashMap의 식별키로 Key 객체를 사용하면 저장된 값을 찾아오지 못한다. 왜냐하면 number 필드값이 같더라도 hashCode() 메소드에서 리턴하는 해시코드가 다르므로 다른 식별키로 인식하기 때문이다.
다음 예제에서 new Key(1) 객체로 "홍길동"을 저장하고, 다시 new Key(1) 객체로 저장된 "홍길동"을 읽으려고 했지만 결과는 null이 나온다.
의도한 대로 "홍길동"을 읽으려면 다음과 같이 재정의한 hashCode() 메소드를 Key 클래스에 추가하면 된다. hashCode()의 리턴값을 number 필드값으로 했기 때문에 저장할 때의 new Key(1) 와 읽을 때의 new Key(1)로 같은 해시코드가 리턴된다.
저장할 때의 new Key(1)와 읽을 때의 new Key(1)은 서로 다른 객체이지만 HashMap은 hashCode()의 리턴값이 같고, equals()의 리턴값이 true가 되기 때문에 동등한 객체로 평가한다. 즉, 같은 식별키로 인식한다는 뜻이다. 결론적으로 말해서 객체의 동등 비교를 위해서는 Object의 equals() 메소드만 재정의하지 말고 hashCode() 메소드도 재정의해서 논리적으로 동등한 객체일 경우 동일한 해시코드가 리턴되도록 해야한다.
아래는 이전 예제에서 사용한 Member 클래스를 보완하기 위해 hashCode() 메소드를 재정의한 것이다. id 필드값이 같을 경우 같은 해시코드를 리터하도록 하기 위해 String의 hashCode() 메소드의 리턴값을 활용했다. String의 hashCode()는 같은 문자열일 경우 동일한 해시코드를 리턴한다.
'JAVA > 자바' 카테고리의 다른 글
기본 API 클래스 - System 클래스 (0) | 2022.09.27 |
---|---|
기본 API 클래스 - Object 클래스의 toString() 메소드 (0) | 2022.09.27 |
기본 API 클래스 - Object 클래스의 equals() 메소드 (0) | 2022.09.27 |
API 도큐먼트 읽는 방법 (0) | 2022.09.27 |
예외 처리 (0) | 2022.09.26 |