자바 Obejct 클래스에 대해 탐구해보도록 하겠습니다.
java.lang.Object 클래스는 자바에서 최상위 클래스로 모든 클래스는 Object 클래스를 상속받습니다.
따라서, 모든 클래스는 Object 클래스의 메소드를 사용할 수 있고 override 할 수도 있습니다.
그럼, 몇 가지 메소드들을 자세히 알아보겠습니다.
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()는 객체가 논리적으로 동일한지 판단하기 위해 함께 재정의하여 사용합니다.
참고
'JAVA' 카테고리의 다른 글
StringBuilder와 StringBuffer (0) | 2021.08.05 |
---|