BE전문가 프로젝트

14. Object 클래스(hashcode() 및 equals()) 본문

JAVA

14. Object 클래스(hashcode() 및 equals())

원호보고서 2023. 11. 15. 00:26

Object

자바의 모든 클래스는 Object 클래스로부터 오기 때문에 자바의 최상위 부모 클래스라고 볼 수 있다. 그 중 자주 사용하는 Object의 메소드를 살펴보자

 

equals()

equals의 매개 값의 타입은 Object이다. 앞에서 말했듯 자바에서 제공하는 클래스의 최상위 클래스는 Object이기 때문에 자동 타입 변환으로 인해 어떠한 변수를 매개변수로 사용해도 된다.

 

equals를 오버라이딩하지 않고 사용하게 되면 같이 주소값을 비교하는 ==와 동일한 기능을 갖는다. 이는 Object의 equals 메소드를 그대로 사용하기 때문이다. 여기서 하나의 의문점을 가지게 되는데 어떻게 String은 참조 변수임에도 불구하고 equals를 사용했을때 주소 값이 아닌 문자열을 비교했을까?

답은 이미 String 클래스에서는 equals라는 메소드를 재정의 하였기 때문에 문자열을 비교할 수 있던 것이다.

 

따라서 우리가 클래스를 정의할때 객체를 논리적으로 비교하고 싶다면 String과 같이 equals 메소드를 재정의(Override)해야한다.

public class Anonymous {

    public String id;
    
    public Anonymous(String id) {
        this.id = id;
    }
    
    @Override
    public boolean equals(Object object){
        if(object instanceof Anonymous) {
            Anonymous anm = (Anonymous) object;
            if(id.equals(anm.id)){
                return true;
            }
        }
        return false;
    }
}

 

hashcode()

객체 해시코드는 객체를 식별하는 하나의 정수값이다. 쉽게 말하면 객체의 고유 값이라고 보면 된다.

 

이 메소드도 객체를 논리적으로 비교하고 싶다면 equals와 마찬가지로 재정의를 해줘야한다. Object에서 제공하는 hashcode() 메소드는 객체의 주소값을 이용하여 해시코드를 만들어 낸다.

public class HelloWorld {

    public static void main(String[] args) {
        Anonymous a1 = new Anonymous("하하");
        Anonymous a2 = new Anonymous("하하");
        Anonymous a3 = new Anonymous("하하");

        System.out.println("a1의 해시코드 = " + a1.hashCode());
        System.out.println("a2의 해시코드 = " + a2.hashCode());
        System.out.println("a3의 해시코드 = " + a3.hashCode());
    }
}
a1의 해시코드 = 2083562754
a2의 해시코드 = 1627960023
a3의 해시코드 = 357863579

위에 결과를 보면 알 수 있듯이 값이 같더라도 다른 해시값을 가지고 있는 것을 확인할 수 있다. String으로 비교시에는 같은 값이 나오는 것을 확인할 수 있는데 그 이유는 equals와 마찬가지로 String 클래스에 이미 재정의 되어있기 때문이다.

 

HashSet, HashMap, HashTable은 hashcode()를 사용해서 해시코드 값을 비교한다. 같은 코드값이 나오면 equals로 비교하여 동등한 객체인지 판단한다.

 

 

'JAVA' 카테고리의 다른 글

16-1. 스레드 - 멀티스레드  (2) 2023.11.20
15. java.lang에 대하여  (0) 2023.11.15
13. 익명 객체  (0) 2023.11.11
12. 중첩 클래스 및 인터페이스  (0) 2023.11.10
11. 추상 클래스와 인터페이스의 차이  (0) 2023.11.09
Comments