hashCode(),toString()
hashCode()
- 객체의 주소
- 객체의 해시코드 를 반환하는메서드
-
Object 클래스의 hashCode()는 객체의 주소를 int 변환해서 반환
- equals()를 오버라이딩하면 따로 hashCode()도 오버라이딩해야한다
- equals() 의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문
-
equals() 는 iv 를 이용하니까
- System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일.
-
객체마다 다른해시코드를 반환하는해시코드
class Ex9_3 { public static void main(String[] args) { String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1.equals(str2)); //true System.out.println(str1.hashCode()); // 96354 System.out.println(str2.hashCode()); // 96354 System.out.println(System.identityHashCode(str1)); //3526918 System.out.println(System.identityHashCode(str2)); //7699183 } }
32비트 JVM 주소 int
64비트 자바머신으로 바뀌면서 주소값이 겹칠수도있다
toStirng(), toString()의 오버라이딩 문자열
- toString() : iv 객체를 문자열(String)으로 변환하기위한 메서드
- Object > toString(),equals() 메서드등을 이외의 다른것들도 가지고있는 모든클래스의 조상클래스
-
클래스들은 자식이기때문에 Object안의 많은기능들 사용가능
public Stirng toString() { return getClass().getName() + "@" + Integer.toHexString(hashcode()); } // 설계도객체.클래스이름 + 위치(at) + 16진 객체주소
equals() 오버라이딩 String 값이 같은지 true,false로 확인
-
Object 클래스에서는 equals(), hashCode(), toString(), clone(), wait(), notify(), notifyAll() 등의 메서드를 제공
- 오버라이딩 : 메서드는 부모 클래스 의 메서드와 메서드 이름, 매개변수 타입, 리턴 타입이 모두 동일해야 합니다.
부모보다 접근제어자를 더 넓게 생성할수없다. -
오버라이딩을 하려면 선언부가 일치해야한다 그러니 Object < equals(Object obj)로 감싸줘야한다
public boolean equals(Object obj) { if (!(obj instanceof Card)) // instanceof 부모자식관계인지 형변환물어보기 참트루로 반환됨 return false; Card c = (Card)obj; // 형변환 객체의은닉성으로인해서 c 에서사용할수있는 리모컨의멤버갯수를 줄였다 (object의 기능들은포함) return this.kind.equals(c.kind) && this.number == c.number; // }
String 클래스안에 equals(),toString()이 존재한다라고생각
instanceof
- 참, 거짓을 반환한다
- 부모 자식관계 인지 확인해본다 ( 누가 부모이건 자식이던 상관없음 )
(false (문자열로 바뀌었을뿐 주소는 다르다) (주소를같게하기위해) // true로 이퀄스를 감싸기위해 equals로 true를 만들려고한다)
(== 메모리상에 올려진 주소가같은지 위치를 가리키고
equal()는 변수로올라간 실제 내포한 값 :spade 를 가르킨다
&& 논리연산자로 boolean 값에대한 계산발동 양쪽둘다 true면 true
== 비교연산자로 두값이 서로같은지 true )
여기까지는 컴파일러창에 보여진 문자열의값만같다 주소값은다르다
true
kind:SPADE, number:1 // 1429302 주소값은다르다
kind:SPADE, number:1 // 2039441 주소값 다름
그러니 equals()+hashCode() 같이해야한다
hashCode() 오버라이딩 주소값 같게
public int hashCode() {
return Objects.hash(kind,number)
}
이제 주소값이 같다
- equals()를 오버라이딩하면 hashCode()도 overriding한다
- equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문
Leave a comment