어흥

[Java] Class 비교 본문

Java

[Java] Class 비교

라이언납시오 2021. 4. 1. 13:41
728x90
반응형

1. Class 설정

public static class Info{
	int num;
    	String name;

	public Info(int num, String name){
    	this.num = num;
        this.name = name;
    }
};

 

2. HashSet 설정 + 클래스의 값 비교

public static void main (String[] args){
	HashSet<Info> hs = new HashSet<>();
	hs.add(new Info(1,"Eric"));
        System.out.println(hs.contains(new Info(1,"Eric")));		//false

        Info ii = new Info(2,"Andrew");
        hs.add(ii);
        System.out.println(hs.contains(ii));		//True
}

: 코드를 작성하다보면 다음과 같은 상황에 직면하게 되는 경우가 있다. 

위의 경우, 주소값을 비교하기 때문에 같은 주소값을 가지는 ii는 True를 반환하고 새로운 주소값을 생성한 new Info의 경우는 False를 반환한다. 위의 문제를 해결하기 위해 3번을 수행해야 한다

 

3. Equals 재정의 + HashCode 재정의

: Equals 를 재정의한 클래스에는 HashCode도 반드시 재정의해야 한다.

 

[Equals 재정의 X, HashCode 재정의 O]

→ 객체가 저장된 버킷을 찾을 수 있다

→ 해당 객체가 자신과 같은 객체인지 비교할 수 없다

→ null 리턴한다

 

[Equals 재정의 O, HashCode 재정의 X]

→ 같은 값을 가진 객체가 서로 다른 HashCode 값을 가질 수 있다

→ 해시테이블에 해당 객체가 저장된 버킷을 찾을 수 없다

public static class Info{
	int num;
    	String name;

	public Info(int num, String name){
    	this.num = num;
        this.name = name;
    }
    
    @Override
    public boolean equals(Object o){
    	if (this == o)	return true;
        if (!(o instanceof Info))	return false;
        Info si = (Info)o;
        return num == si.num && Objects.equals(name,si.name);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(num, name);
    }
};

 

 

참고한 자료

- velog.io/@sonypark/Java-equals-hascode-%EB%A9%94%EC%84%9C%EB%93%9C%EB%8A%94-%EC%96%B8%EC%A0%9C-%EC%9E%AC%EC%A0%95%EC%9D%98%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C

- www.w3schools.com/java/ref_string_hashcode.asp

- www.w3schools.com/java/ref_string_equals.asp

 

728x90
반응형

'Java' 카테고리의 다른 글

[Java] Checked vs Unchecked Exception  (0) 2021.08.29
[Java] 문자열 자르기  (0) 2021.03.30
[Java] Java 핵심 내용  (0) 2020.05.21
Comments