Notice
Recent Posts
Recent Comments
Link
쯔이's Dev
containsKey(f)(equals, hashcode 오버라이딩) 본문
반응형
컬렉션 | 키-값 구조사용 | 메서드 | 설명 |
Map | ✅ 있음 | containsKey(key) | 키가 있는지 확인 |
Set | ❌ 없음 | contains(value) | 값이 존재하는지 확인 |
List | ❌ 없음 | contains(value) | 해당 요소가 존재하는지 확인 |
“List는 equals만, Set/Map은 equals + hashCode 둘 다!”
컬렉션 | 사용 메서드 | 필수 오버라이딩 |
List | equals()만 사용 | ✅ equals() |
Set (HashSet) | hashCode() → equals() | ✅ 둘 다 |
Map (HashMap) | hashCode() → equals() | ✅ 둘 다 |
>> containsKey(key)란?
Map에서 주어진 키가 존재하는지를 검사하는 메서드
if (hMap.containsKey(f)) {
return false;
}
이 containsKey(f)는 내부적으로 자동으로 이렇게 작동해요
실제로는 이런 순서로 작동함:
- f.hashCode() 호출
- 해당 해시코드에 해당하는 bucket(슬롯)에 접근
- 거기에 있는 키들과 equals()로 비교
- true면 이미 존재하는 키, false면 새로운 키로 인식
* hashCode() → equals() 순서로 비교함
@Override
public int hashCode() {
return Objects.hash(this.getKind());
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Farm) {
Farm f = ((Farm)obj);
return f.getKind().equals(this.getKind());
}
return false;
}
이 코드 덕분에 Map은
- new Farm("과일")과
- 또 다른 new Farm("과일")을
같은 키라고 인식하게 되는 거예요.
Map이나 Set을 쓸 때 주의할 점
꼭 해야 할 일 | 이유 |
equals()와 hashCode() 오버라이딩 | 객체를 키로 쓸 때 중복 여부를 정확히 판단하기 위해 |
equals()만 있고 hashCode() 없으면? | 버그 발생 위험! Map에서 찾지를 못함 |
반대로 hashCode()만 있고 equals() 없으면? | 같은 해시값이라도 다른 객체로 인식될 수 있음 |
정리 요약
- Map.containsKey(f)는 내부적으로 hashCode() + equals()를 자동 호출해서 비교함
- Farm 클래스에서 이 둘을 잘 오버라이딩해놨기 때문에, 중복 키가 잘 걸러짐
- 그래서 .equals()를 코드에서 직접 호출할 필요는 없음
List<Farm> farmList = new ArrayList<>();
farmList.add(new Farm("견과"));
System.out.println(farmList.contains(new Farm("견과"))); // true ✅
- List는 순서대로 하나하나 비교하면서 equals()만 사용
- hashCode()는 사용하지 않음 (해시 기반이 아니기 때문)
비교 요약
컬렉션 | contains() 내부 동작 | 사용하는 메서드 |
HashSet / HashMap | hashCode() → equals() | 둘 다 사용 |
ArrayList | 순차 탐색 → equals()만 사용 | equals()만 사용 |
TreeSet | 정렬 기반 → compareTo() 사용 | Comparable 구현 필요 |
꼭 기억할 것!
- Set, Map에서 contains() 또는 containsKey() 사용하려면
→ hashCode()와 equals() 반드시 올바르게 오버라이딩해야 함 - List는 hashCode() 안 쓰지만 equals()는 필수!
728x90
반응형
'JAVA' 카테고리의 다른 글
String vs StringBuilder (0) | 2025.02.14 |
---|---|
StringTokenizer vs split() (1) | 2025.01.30 |
3-tier 아키텍처(service > dao > db) (2) | 2024.09.30 |