Java

Object 클래스 / HashCode

공부처음하는사람 2024. 7. 9. 20:02

 

클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속한다.

따라서 자바의 모든 클래스는 Object 의 자식이거나 자손 클래스이다.

 

 

Object가 가진 메소드는 모든 객체에서 사용할 수 있다.

Object가 가진 주요 메소드

 

boolean equals(Object obj) :  객체의 참조값을 비교하고 결과 리턴

int hashCode() :  객체의 해시코드 리턴

String toString() : 객체 문자 정보 리턴

 

객체 동등비교

package ch12.sec03.ex01;

public class Member {
    public String id;

    public Member(String id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Member target) {
            if (id.equals(target.id)) {
                return true;
            }
        }
        return false;
    }
}
package ch12.sec03.ex01;

public class EqualsEx {
    public static void main(String[] args) {
        Member obj1 = new Member("blue");
        Member obj2 = new Member("blue");
        Member obj3 = new Member("red");

        if (obj1.equals(obj2)) {
            System.out.println("obj1 == obj2");
        } else {
            System.out.println("obj1 != obj2");
        }

        if (obj1.equals(obj3)) {
            System.out.println("obj1 == obj3");
        } else {
            System.out.println("obj1 != obj3");
        }
    }
}

 

boolean equals 메소드를 사용해 참조값 비교하는 코드

 

 

객체 해시코드

객체 해시코드란 객체를 식별하는 정수를 말한다. Object의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 

해시코드를 생성하기 때문에 객체마다 다른 정수값을 리턴한다. equals 메소드와 비슷한데 두 객체가 동등한지 비교할 때 주로 사용한다.

 

자바는 두 객체가 동등함을 비교할 때 hashCode()와 equals() 메소드를 같이 사용하는 경우가 많다.

우선 hashCode() 가 리턴하는 정수값이 같은지 확인하고, 그 다음 equals() 가 true를 리턴하는지 확인한다.

 

package ch12.sec03.ex02;

public class Student {
    private int no;
    private String name;

    public Student(int no, String name) {
        this.name = name;
        this.no = no;
    }

    public int getNo() {
        return no;
    }

    public String getName() {
        return name;
    }

    @Override
    public int hashCode() {
        int hashCode = no + name.hashCode();
        return hashCode;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Student target) {
            if (no == target.getNo() && name.equals(target.getName())) {
                return true;
            }
        }
        return false;
    }
}

 

package ch12.sec03.ex02;

public class HashCodeEx {
    public static void main(String[] args) {

        Student s1 = new Student(1, "홍길동");
        Student s2 = new Student(2, "김성현");

        if (s1.hashCode() == s2.hashCode()) {
            if (s1.equals(s2)) {
                System.out.println("동등 객체");
            } else {
                System.out.println("데이터가 다르므로 동등 객체 아님");
            }
        } else {
            System.out.println("해시코드가 다르므로 동등 객체 아님");
        }
    }
}

 

HashSet

 

컬렉션에서 배울 HashSet은 동등객체를 중복 저장하지 않는다. HashSet은 hashCode와 equals 메소드를 이용해서 

동등객체인지 판단한다.

 

package ch12.sec03.ex02;

import java.util.HashSet;

public class HashSetEx {
    public static void main(String[] args) {

        HashSet hashSet = new HashSet();

        Student s1 = new Student(1, "김성현");
        hashSet.add(s1);
        System.out.println("저장된 객체수: " + hashSet.size());

        Student s2 = new Student(1, "김성현");
        hashSet.add(s2);
        System.out.println("저장된 객체수: " + hashSet.size());

        Student s3 = new Student(2, "김성현");
        hashSet.add(s3);
        System.out.println("저장된 객체수: " + hashSet.size());
    }
}

 

실행결과는 저장된 객체수 2로 나온다. (s1, s2객체는 번호와 이름이 같기에 동등 객체임)

 

 

Student 클래스의 hashCode를 오버라이딩하지 않으면 객체 번지로 해시코드를 생성하므로 객체가 다를 경우 해시코드도 달라진다.

따라서 s1, s2는 동등객체가 아니므로 따로 저장된다.

'Java' 카테고리의 다른 글

레코드 선언  (0) 2024.07.09
객체 문자정보 - toString()  (0) 2024.07.09
예외  (1) 2024.07.09
익명 객체  (0) 2024.07.06
중첩 인터페이스  (0) 2024.07.06