본문 바로가기

JAVA

자바 Object 클래스 탐구

자바 Obejct 클래스에 대해 탐구해보도록 하겠습니다.

 

java.lang.Object 클래스는 자바에서 최상위 클래스로 모든 클래스는 Object 클래스를 상속받습니다.

따라서, 모든 클래스는 Object 클래스의 메소드를 사용할 수 있고 override 할 수도 있습니다.

 

Object 클래스의 모든 메소드

 

그럼, 몇 가지 메소드들을 자세히 알아보겠습니다.

 

1. toString()
- 기본 동작: 객체의 해시코드 출력
- override 목적: 객체의 정보를 문자열 형태로 표현하고자 할 때

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

> Task :Main.main() User@2d363fb3​​

override 하지 않고 사용하면 '클래스풀네임@해시코드' 출력됩니다.

그럼 toString() 메소드를 override 해볼까요?

@Override
public String toString() {
    return "name:" + name +",age:"+age;
}

 

> Task :Main.main()
name:name,age:11


이렇게 객체의 정보를 표현해야 할 때, toString() 을 override 해서 사용하면 됩니다.

2. equals()
- 기본 동작: '==' 연산 결과 반환
- override 목적: 물리적으로 다른 메모리에 위치하는 객체여도 논리적으로 동일함을 구현하기 위해

public class Main{
    public static void main(String[] args) {
        User userA = new User("A",10);
        User userB = new User("A",10);

        System.out.println(userA.equals(userB));
    }
}

 

> Task :Main.main()
false​

 결과는 false가 나옵니다. userA와 userB가 각각 다른 메모리에 할당된 객체를 참조하기 때문에 연산 결과로 false가 나온 것입니다. 물리적으로 다르더라도 논리적으로는 같은 객체라는 결과를 얻길 원한다면 override 하여 논리적으로 동일성을 확보할 수 있습니다.

원하는 결과인 true 가 나오도록 override 해보겠습니다.

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    User user = (User) o;
    return age == user.age && Objects.equals(name, user.name);
}​

 

> Task :Main.main()
true​

 

equasl()를 override 함으로써 두 객체가 논리적으로 같은지 비교할 수 있게 되었습니다.


3. hashCode()
- 기본 동작: JVM이 부여한 코드값. 인스턴스가 저장된 가상머신의 주소를 10진수로 반환
- override 목적: 두 개의 서로 다른 메모리에 위치한 객체가 동일성을 갖기 위해

public class Main{
    public static void main(String[] args) {
        User userA = new User("A",10);
        User userB = new User("A",10);

        System.out.println(userA.hashCode());
        System.out.println(userB.hashCode());
    }
}

 

> Task :Main.main()
758529971
2104457164

지금은 userA와 userB가 서로 다른 해시코드를 반환합니다.
자바에서는 같은 객체임을 보장받기 위해 equasl()에 hashCode()도 override 해야합니다.

@Override
public int hashCode() {
    return Objects.hash(name, age);
}​

 

> Task :Main.main()
2986
2986​

hashCode()를 재정의함으로써 물리적으로 다른 메모리에 저장되어 있지만, 논리적으로 같은 두 객체가 같은 hashCode를 반환하게 되었습니다.

 

정리하자면, Object 클래스는 모든 클래스의 최상위 클래스이고, 주요 메소드들 중

toString() 은 객체를 정보를 문자열로 표현하고자 할 때 사용하고,

equasl()와 hashCode()는 객체가 논리적으로 동일한지 판단하기 위해 함께 재정의하여 사용합니다.

 

참고

https://atoz-develop.tistory.com/entry/%EC%9E%90%EB%B0%94-Object-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%A0%95%EB%A6%AC-toString-equals-hashCode-clone

'JAVA' 카테고리의 다른 글

StringBuilder와 StringBuffer  (0) 2021.08.05