[Java]-set 오브젝트 중복 삽입될 때
일단 Set은 중복값은 삽입이 안된다.
프로그래머스 - 방문길이. 좌표문제 코드를 예시로 가져온다.
부분 코드
import java.util.*;
class Solution {
public class Node{
int x;
int y;
int mx;
int my;
public Node(int x, int y, int mx, int my){//생성자
this.x = x;
this.y = y;
this.mx = mx;
this.my = my;
}
}
}
좌표를 set에 담아주기 위해 Node클래스를 새로만들었다.
set.add(new Node(1,2,3,4));
set.add(new Node(1,2,3,4));
그다음 객체를 추가해 주었다.
그러면 Set에는 중복값을 저장할 수 없으니 객체가 한개만 저장된다?
아니다. 두 객체 모두 저장된다. 서로 다른 객체가 추가 되기 때문에 같은 값을 가진 것은 판단하지 않기 때문이다. 서로 다른 객체이고 주소값이 같지 않아서 인거같다.
그럼 객체를 중복하지 않고 저장하고 싶다면 어떻게 할까? Node클래스에서 hashCode(), equals() 메소드를 오버라이딩 해줘야 한다.
public class Node{
int x;
int y;
int mx;
int my;
public Node(int x, int y, int mx, int my){//생성자
this.x = x;
this.y = y;
this.mx = mx;
this.my = my;
}
@Override
public int hashCode(){
return (""+this.x+this.y+this.mx+this.my).hashCode();
}
@Override
public boolean equals(Object obj){
if(obj instanceof Node){
Node k = (Node)obj;
return this.hashCode() == k.hashCode();
}
return false;
}
}
hashCode의 원리
참조변수를 비교할 때 주소값을 문자열 형태로 비교하게 된다. 즉 문자열 형태의 주소값을 hashCode 메소드를 통해 해쉬코드 값으로 변환시킨다.
이것을 이용해 Node클래스 내의 멤버변수 값을 비교할 수 있게 멤버변수들을 문자열로 결합해 주고 결합된 문자열의 해쉬코드 값을 비교하게 구조를 바꿔준다.
요약
- instanceof는 자식이나 자기자신이면 true
- 언젠가 쓸모있어질 부분이겠지.