wrapper 클래스 & 오토박싱

1.1 Object 클래스

object 클래스는 모든 클래스의 최고 조상이므로 object 클래스의 멤버들은 모든 클래스에서 바로 사용 가능

Object 클래스는 멤버변수는 없고 오직 11개의 메서드만 가지고 있음

Object 클래스의 메서드 설명
protected Object clone() 객체 자신의 복사본을 반환
public boolean equals(object obj) 객체 자신과 객체 obj가 같은 객체인지 알려줌(같으면 true)
protected void finalize() 객체가 소멸될 때 가비지컬렉터에 의해 자동적으로 호출됨
이 때 수행되어야하는 코드가 있을 때 오버라이딩 함(거의 사용X)
public class getClass() 객체 자신의 클래스 정보를 담고 있는 class 인스턴스를 반환
public int hashCode() 객체 자신의 해시코드를 반환
public String toString 객체 자신의 정보를 문자열을 반환
public void notify() 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨움
public void notifyAll() 객체 자신을 사용하려고 기다리는 모든 쓰레드를 하나만 깨움
public void wait()
public void wait(long timeout)
public void wait(long timeout, int nanos) 다른 쓰레드가 notify()notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 혹은 지정된 시간(timeout, nanos)동안 기다리게 함

중요한 메서드 4가지

1. equals(Object obj)

매개변수로 객체의 참조변수를 받아 비교하여 그 결과를 boolean 값으로 알려주는 역할

public boolean equals(Object obj) {
	return (this == obj);
}
public class EqualsEx1 {
    public static void main(String[] args) {
        Value v1 = new Value(10);
        Value v2 = new Value(10);

        if (v1.equals(v2))
            System.out.println("v1과 v2는 같음"); 
        else
            System.out.println("v1과 v2는 다름"); // 다른 객체를 참조(다른 주소를 가짐)

        v2 = v1; // v2가 v1이 참조하는 객체(값 10)를 바라봄

        if (v1.equals(v2))
            System.out.println("v1과 v2는 같음");
        else
            System.out.println("v1과 v2는 다름"); // true 반환
    }
}

class Value {
    int value;
    Value(int value) {
        this.value = value;
    }
}

equals 메서드는 두 개의 참조변수가 같은 객체를 참조하고 있는지(갖고있는 있는 주소값)만 비교했다

그렇다면, equals메서드로 Value 인스턴스가 가지고 있는 value 값을 비교하도록 할 수 없을까?

Value 클래스에서 equals 메서드를 오버라이딩하여 주소가 아닌 객체에 저장된 내용을 비교하도록 변경할 수 있음

class Person {
    long id;
    public boolean equals(Object obj) {
        if (obj instanceof Person) // 타입이 person이 아니면 값 비교할 필요 x
            return id == ((Person)obj).id; // obj가 Object타입이므로 id값을 참조하기 위해 Person 타입으로 형변환 필요
                                            // id의 값을 비교함
        else
            return false; // 타입이 person이 아니면 값 비교할 필요 x
    }
    Person(long id) {
        this.id = id;
    }
}

public class EqualsEx2 {
    public static void main(String[] args) {
        Person p1 = new Person(1L);
        Person p2 = new Person(1L);

        if(p1==p2)
            System.out.println("p1과 p2는 같은 사람");
        else
            System.out.println("p1과 p2는 다른 사람"); // 주소가 다름
        if(p1.equals(p2))
            System.out.println("p1과 p2는 같은 사람"); // 오버라이딩한 equlas()는 멤버변수 값을 비교하므로 같은 값
        else
            System.out.println("p1과 p2는 다른 사람");
    }
}