[Java] - Object 클래스 (equals, hashCode, toString)

janjanee·2021년 6월 11일
0

Java

목록 보기
5/19
post-thumbnail

equals(Object obj)

public boolean equals(Object obj) {
    return (this == obj);
}

매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean값으로 알려준다.

예제코드

public class EqualsEx {
    public static void main(String[] args) {
        Member m1 = new Member(30);
        Member m2 = new Member(30);

        if (m1.equals(m2))
            System.out.println("m1과 m2는 같다.");
        else
            System.out.println("m1과 m2는 다르다.");

        m2 = m1;

        if (m1.equals(m2))
            System.out.println("m1과 m2는 같다.");
        else
            System.out.println("m1과 m2는 다르다.");
    }
}

class Member {
    int age;

    Member(int age) {
        this.age = age;
    }
}

결과

v1과 v2는 다르다.
v1과 v2는 같다.

첫 번째 결과는 두 인스턴스의 주소값이 다르므로 false의 결과가 출력되고
두 번째는 m2 == m1를 수행한 후 두 참조변수가 참조하는 인스턴스 주소값이 같으므로 true가 된다.

다음은 주소값이 아닌 Member 클래스의 age 값으로 같은 객체인지 아닌지 비교하는 방법이다.

예제코드

public class EqualsEx {
    public static void main(String[] args) {
        Member m1 = new Member(30);
        Member m2 = new Member(30);

        if (m1 == m2)
            System.out.println("m1과 m2는 같다.");
        else
            System.out.println("m1과 m2는 다르다.");

        if (m1.equals(m2))
            System.out.println("m1과 m2는 같다.");
        else
            System.out.println("m1과 m2는 다르다.");
    }
}

class Member {
    int age;

    Member(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof Member)
            return age == ((Member)o).age;
        else
            return false;
    }
}

결과

m1과 m2는 다르다.
m1과 m2는 같다.

equals 메소드를 오버라이딩하여 주소가 아닌 객체에 저장된 내용을 비교하도록 변경하면 된다.

String 클래스도 Object 클래스의 equals 메소드를 그대로 사용하는 것이 아니라
오버라이딩해서 문자열 값을 비교하도록 되어있다.
따라서 같은 문자열을 가진 두 개의 String 인스턴스에 equals를 사용하면 항상 값이 true인 것이다.

// String.java

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String aString = (String)anObject;
        if (!COMPACT_STRINGS || this.coder == aString.coder) {
            return StringLatin1.equals(value, aString.value);
        }
    }
    return false;
}

hashCode()

해싱기법에 사용되는 해시함수(hash function) 를 구현한 것이다.
클래스의 인스턴스변수 값으로 객체의 같고 다름을 판단해야하는 경우라면 equals 메소드 뿐 만 아니라
hashCode메소드도 적절히 오버라이딩해야한다.
equals()의 결과가 같은 객체라면 hashCode 메소드를 호출했을 때의 결과값인 해시코드도 같아야 하기 때문이다.

예제코드

public class HashCodeEx {
    public static void main(String[] args) {
        String s1 = new String("hi");
        String s2 = new String("hi");

        System.out.println(s1.equals(s2));
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));
    }
}

결과

true
3329
3329
1828972342
1452126962

String 클래스는 문자열의 내용이 같으면 동일한 해시코드를 반환하도록 hashCode 메소드가 오버라이딩 되어있다.
따라서 위의 예제 결과 해시코드가 동일한 3329라는 같은 값을 얻을 수 있다.

참고로 System.identityHashCode(Object x)는 Object클래스의 hashCode 메소드처럼
객체의 주소값으로 해시코드를 생성하기 때문에 모든 객체에 대해 항상 다른 해시코드값을 반환할 것을 보장한다.


toString()

인스턴스에 대한 정보를 문자열(String)로 제공할 목적으로 정의한 것이다.
바로 예제코드 부터 살펴보자.

예제코드

public class ToStringEx {
    public static void main(String[] args) {
        Member m1 = new Member("춘식이", 10);
        System.out.println(m1);
    }
}

새로운 Member 인스턴스를 만들고 출력해보자.
원하는 결과는 인스턴스 이름, 나이 정보가 출력되기를 바란다.
그러나 결과는 아래와 같이 나온다.

com.jihan.javastudycode.lang.Member@6068d5f0

Object 클래스의 toString() 메소드가 호출되어 나온 값인데 메소드를 살펴보면 다음과 같다.

// Object.java

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

클래스 이름 + @ + 16진수 해시코드를 합한 문자열을 리턴한다. 그래서 위와같은 값이 나온것이다.
그럼 어떻게 원하는 인스턴스 정보를 출력할 수 있도록 하는지 알아보자.

class Member {

    String name;
    int age;

    @Override
    public String toString() {
        return "Member{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    ...
}

결과

Member{name='춘식이', age=30}

Object 클래스의 toString() 메소드를 오버라이딩하면 원하는 정보를 출력할 수 있다.


References

  • 남궁성, 『자바의 정석』, 도우출판(2016)
profile
얍얍 개발 펀치

0개의 댓글