Object class

 

✔ Object class

: 모든 클래스의 최고 조상. 11개의 메서드만 가지고있음.

: iv, cv는 없음

: notify(), wait() 등은 쓰레드와 관련된 메서드

public void notifyAll() 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다
public void wait()
public void wait(long timeout)
public void wait(long timeout, int nanos)
다른 쓰레드가 notify()나 noftifyAll()을 호출할때까지 현재 쓰레드를 무한히 or 지정된시간(nanos)동안 기다리게 한다.

* protected는 오버라이딩을 통해 public으로 변경되어야 사용 가능

protected Object clone() 객체 자신의 복사본 반환
protected void finalize() 객체가 소멸될 때 가비지 컬렉터에 의해 자동호출.
이때 수행되어야하는 코드가 있을때 오버라이딩.
(생성자의 반대. 거의 사용안함)

 

 

✔ boolean equals(Object obj)

: 객체 자신(this)과 주어진 객체(obj)를 비교.
: 같으면 true, 다르면 false

: Object class의 equals()는 객체의 주소를 비교 (참조변수 값 비교)

👉 public boolean equals(Object obj) { return (this == obj); }

class Value {
	int value;
	Value(int value){
    this.value=value;}}
    
class Ex{
	public static void main(String[] args){
    value v1 = new Value(10);
    value v2 = new Value(10);
    System.out.println(v1.equals(v2)); } // 주소비교이므로 false반환.
// 각자 다른 객체라 참조변수에 들어가있는 주소값이 다름

--------------------------------------------------

class Value {
	int value;
	Value(int value){
    this.value=value;
    }
    
    // Object 의 equals()를 오버라이딩해서 값을 비교함
    public boolean equals(Object obj){
    
    // 참조변수의 형변환 전에는 반드시 instanceof로 확인해야함
    if(!(obj instnaceof Value)) return false;
    
    Value v = (Value) obj; // obj를 value로 형변환
	return this.value == v.value; 
    // this.value == obj.value 였는데 형변환 처리함
    // 값을 비교해서 true값을 끌어내야 하는데 this(v1)은 value값이 있고 obj는 없어서 형변환으로 value와 연결해줌 
}

✔ HashCode()

: 객체의 해시코드(hashcode)를 반환하는 메서드

: 해시코드란? 정수값으로 해싱알고리즘에서 사용하는 것.

: Object class의 hashCode()는 객체의 주소를 int로 변환해서 반환 = 객체마다 다른 값을 갖는다. (객체의 지문)

 

public class Object{
	public native int hashCode(); // native method(): Os가 가지고 있는 메서드. 주로 c언어.
    //해시코드가 이미 작성되어있는 native method를 가져오므로 구현부가 없음

 

 

: equals()를 오버라이딩하면( 주소값이 아니라 iv로 비교하도록 만들면) hashCode()도 오버라이딩 해야한다.

👉 equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문

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.identityHashCode(Object obj) 는 Object class의 hashCode()와 동일. 원래 객체는 각자 다른 주소값을 가지므로 equals()를 오버라이딩 안한버전이나 다름없음.

 

 

✔ toString()

: 객체를 문자열로 변환하기 위한 메서드

 

public String toString(){ // Object class 의 toString()

  return getClass().getName()+"@"+Integer.toHexString(hashCode()); }

             설계도 객체.클래스이름+@(위치)+16진수(객체주소)

 

객체==iv 집합이므로 객체를 문자열로 변환한다는 것은 iv의 값을 문자열로 변환한다는 것과 같다

 

import java.util.Objects;

class Card {
	String kind;
	int number;

	Card() {
		this("SPADE", 1);
	}

	Card(String kind, int number) {
		this.kind = kind;
		this.number = number;
	}
	
	// equals를 오버라이딩하면 hashcode도 오버라이딩해야한다
	public int hashCode() {
		return Objects.hash(kind,number);
	}
	
	public boolean equals(Object obj) {
		if(!(obj instanceof Card))
			return false;
		
		Card c=(Card)obj;
		return this.kind==c.kind && this.number==c.number;
	}
	
	// Object class의 toString()을 오버라이딩해서 객체를 문자열로 바꿈
    // 이 부분이 없다면 마지막 c1.toString()은 기본역할대로 주소값을 반환한다. Card@92282b5d
	public String toString() {	
		return "kind:" + kind+", number:"+number;
	}
}

class Ex9_4 {
	public static void main(String[] args) {
		Card c1 = new Card();
		Card c2 = new Card();
		
		System.out.println(c1.equals(c2));

		System.out.println(c1.toString());
		System.out.println(c2.toString());
	}
}

+ Recent posts