Object Class
Java의 최상위 클래스
- 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.
- 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
- toString(), equals(Object obj), hashCode(),…
toString()
- 객체의 문자 정보를 리턴한다.
- 객체 문자 정보 : 객체를 문자열로 표현한 값
- 기본적으로 Object 클래스의 toString() 메서드는 “클래스명@16진수해시코드” 로 구성된 문자 정보를 리턴
- Object의 하위 클래스는 toString() 메서드를 오버라이딩 하여 간결하고 유익한 정보를 리턴하도록 되어 있다.
- System.out.println() 메서드의 매개변수로 참조타입을 넘겨주면 객체의 toString() 메서드를 호출하여 리턴값을 받아서 출력하도록 되어 있다.
equals(Object obj)
- 객체를 비교하여 참 거짓을 리턴한다.
- 객체의 주소를 비교
- 객체의 인스턴스 변수의 값을 비교하고자 한다면 오버라이딩 해야한다.
hashCode()
- 실행중에 객체의 유일한 integer값을 반환한다.
- Object클래스에서는 heap에 저장된 객체의 메모리 주소를 반환하도록 되어있다.
- public native int hashCode();
- native란?
- OS가 가지고 있는 메서드(C언어로 작성되어있는 경우가 많음)
- JNI
- OS가 가진 메서드를 java 메서드와 연결해준다.
- java메서드를 호출할 시 , C나 C++로 작성된 함수가 실행됨
- OS가 가진 메서드를 java 메서드와 연결해준다.
- OS가 가지고 있는 메서드가 객체의 주소를 int 값으로 반환해준다! 자바에서는 그걸 사용할 뿐!
- 그러므로 객체의 지문이라고함
- 객체마다 다른 값을 가지기 때문
- equals()를 오버라이딩 하면, hashCode()도 오버라이딩 해야한다.
- 두 함수의 공통점은 객체의 주소를 가지고 작업을 한다는 것이다.
- equals는 보통 주소가 아니라 객체의 멤버변수를 가지고 작업하도록 오버라이딩 한다.
- 그렇게 되면 hashCode()도 멤버변수를 가지고 작업하도록 오버라이딩 해야한다.
- equals() 결과가 true 이면 두 객체의 해시코드는 같아야한다.
- 그렇게 되면 hashCode()도 멤버변수를 가지고 작업하도록 오버라이딩 해야한다.
왜 그럴까?
hash 값을 사용하는 Collection(HashSet, HashMap, HashTable)을 사용할 때 문제가 발생한다.
hash값을 사용하는 Collection은 객체가 논리적으로 같은지 비교할 때 위의 과정을 거친다.
- hashCode 메서드의 리턴값이 우선 일치하고 equals 메서드의 리턴 값이 true여야 논리적으로 같은 객체라고 판단함.
그렇다면 무조건 같이 재정의 해줘야할까?
- hash 값을 사용하는 Collection을 사용하지 않는다면 equals와 hashCode를 같이 재정의 하지 않아도 된다라고 생각할 수 있지만
- 요구사항은 항상 변하고,협업환경에서 무조건(hashSet, HashMap, HashTable 사용안할거야!!!)이라는건 없다.
- 굳이 위험한 코드를 안고 가지말고 항상 같이 재정의 해줘야 한다고 생각한다.
'Computer science > JAVA' 카테고리의 다른 글
Thread (1) | 2023.01.02 |
---|---|
Casting (0) | 2023.01.01 |
String Class (0) | 2023.01.01 |
Serialization(직렬화) (0) | 2022.12.25 |
오토 박싱 & 오토 언박싱 (0) | 2022.12.25 |