상세코드
public String toString(){
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
- getClass()
* 현재 객체의 실제 클래스 정보를 반환
* 다형성 상황에서도 정확한 클래스가 나옴
- getName()
* 클래스의 전체 경로 포함 이름 반환
예: com.example.Student
- "@" : 구분자
- hashCode()
* 객체의 고유한 정수값(int)
* 기본 구현에서는 보통 객체의 메모리 주소 기반
- Integer.toHexString(hashCode())
* 메모리 주소 표현 방식이랑 친숙
* 길이가 짧고 개발자들이 보기 편함
위의 코드의 결과는
com.example.Student@3f99bd52
이런 식으로 나오게 된다.
이건 쉽게 말해서, " 나는 com.example.Student 클래스에서 만들어진 객체이고, 이 해시값을 가진 인스턴스야" 라는 뜻을 가진다.
여기서 나타나는 이 문장이 실제 중요한 의미를 가지기는 어렵다.
따라서 우리는 이걸 Overriding을 해서 우리가 넣고 싶은 의미를 알 수 있게 만든다.
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + "}";
}
public boolean equals(Object obj){
return (this == obj);
}
기본 equals() 메서드는 두 객체의 참조값(메모리 주소) 이 동일한지를 비교하므로,
동작 자체는 == 연산자와 동일하다.
하지만 String과 같은 일부 클래스는 equals() 메서드를 오버라이딩하여 객체의 값(value) 을 비교하도록 구현되어 있다.
이 때문에 같은 문자열 값을 가지는 서로 다른 객체라도 equals()는 true를 반환할 수 있다.
따라서 일반적으로 다음과 같이 이해할 수 있다.
== → 같은 객체인가? (주소 비교)
equals() → 논리적으로 같은 값인가? (내용 비교)
단, 사용자 정의 클래스에서는 equals()를 오버라이딩하지 않으면
equals() 역시 주소 비교를 수행한다.
cf) hashcode : 객체를 식별하는 정수형 값
- 객체를 빠르게 검색하거나 비교할 때 사용
- 기본적으로 메모리 주소 기반으로 생성하지만 재정의 가능
: 객체의 런타임 클래스 정보를 반환
public class Main{
public static void main(String[] args){
String str = "Hello";
System.out.println(str.getClass()); // class java.lang.String
}
}