티스토리 뷰
JAVA
[JAVA] HashMap 에서 Key 값을 사용자 정의 자료형(커스텀 자료형)으로 하고 싶을 때 해야하는 것. (equals, hashCode)
개발중인 감자 2023. 10. 9. 03:03만약 좌표를 담을 수 있는 Pair 객체가 있다고 가정해보자.
class Pair {
int x, y;
Pair(int x, int y) {
this.x = x;
this.y = y;
}
만약 HashMap에 같은 좌표값을 가진 Pair 객체를 여러번 넣어 value를 갱신시키고 싶을 때 이런 방법을 쓸 것이다.
import java.util.*;
public class Test {
public static void main(String[] args) {
HashMap<Pair, Integer> hm = new HashMap<>();
hm.put(new Pair(1, 3), 0);
hm.put(new Pair(1, 3), 1);
hm.put(new Pair(1, 3), 2);
for (Pair p : hm.keySet()) {
System.out.println(p.toString());
}
}
}
우리가 원하는 것은 HashMap에 키 값이 1개만 들어가는 것이지만,
아래와 같이 new 로 생성된 Pair 객체들이 모두 들어간다.
이유는 hashmap은 key 값을 찾을 때, 기본 자료형인 int, boolean는 다르게 참조 자료형들은 주솟값을 가지고 동일한지 판단한다.
그래서, 사용자 정의 자료형인 Pair를 같게 만들어주고 싶다면,
좌표값이 같다면 주소를 같게 만들어주는 과정이 필요하다.
⭐️ 그 과정이 Object 클래스의 메소드인 equlas(Object o), hashCode() 를 오버라이딩 해주면 된다!!
equals : 객체가 같은지 비교해주는 메소드. 주솟값을 통해 비교하지만, 밑에처럼 논리적으로 바꿔 반환 가능.
hashCode : 객체의 주소를 반환.
@Override
public boolean equals(Object o) {
if (o instanceof Pair) {
Pair p = (Pair) o;
return (this.x == p.x) && (this.y == p.y);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
결과는 이렇다.
이 방법은 2차원 배열을 활용한 bfs 같은 곳에서 유용하게 쓰이니 기억할 것!
'JAVA' 카테고리의 다른 글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 채팅기능개발
- 카카오API
- 그룹스터디워크샵
- 국비지원캠프
- TiL
- Java
- 백준
- be
- 자료구조
- 패스트캠퍼스강의
- 패스트캠퍼스
- 프로젝트후기
- springboot
- 스터디후기
- 국비지원
- 자료구조 #스택 #큐 #덱 #선형자료구조
- 커리어멘토링
- 그룹스터디
- #국비지원취업
- qjzl
- 부트캠프
- 국비지원취업
- 데이터베이스
- boj
- 과정중간회고
- 야놀자X패스트캠퍼스부트캠프
- 야놀자
- 백엔드개발자
- 백엔드
- 백엔드부트캠프
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
글 보관함