티스토리 뷰

Object클래스

  • 모든 클래스들의 최고 조상. 오직 11개의 메서드만을 가지고 있다.
  • notify, wait() 등은 쓰레드와 관련된 메서드이다.

 

더보기
대부분의 메서드들은 오버라이딩해야 한다.
public Class getClass()            객체 자신의 클래스 정보를 담고 있는 Class인스턴스를 반환한다.
class Class {   }

클래스 중에 첫 글자가 대문자인 Class가 있다. 클래스의 정보를 담기 위한 클래스다.

 자바 소스파일을 컴파일 하면 클래스 파일(*.class)이 나온다. 예를 들어, Hello.java 파일을 컴파일하면 Hello.class파일이 생긴다. 이 클래스 파일이 메모리에 올라갈 때 Hello클래스의 Class객체가 자동으로 생성된다. 이게 바로 Hello클래스의 Class객체이다. 이 객체엔 Hello클래스의 정보가 담겨있다. (iv가 몇 개 있고, 조상이 누구이고, 메서드가 몇 개 있고, 생성자가 뭐가 있고 등) 이런 모든 정보가 Class객체에 들어있다. 즉, Class객체는 '설계도 객체'이다. 그래서 어떤 객체에 대해서 getClass()를 호출하면 설계도 객체를 반환한다. 이 설계도 객체를 통해 무엇을 알수 있냐면

 

설계도 객체

  • 객체 생성할 수 있다.
  • 객체 정보를 얻을 수 있다.
  • Hello.class파일에 있는 내용들을 사용하기 쉽게 정리해서 저장해놨다고 보면 된다.
  • 이 설계도를 가지고 객체 생성도 하고 객체 정보도 얻을 수 있게 해놓은 것을 ReflectionAPI라 한다.

ReflectionAPI

  • 설계도를 이용해 객체 생성 및 객체 정보를 얻을 수 있게 해놓은 것
  • 자바 기본 API에 포함되어 있다.
  • 이 관련 클래스들을 이용하면, 여러분이 할 수 있는 일들이 훨씬 더 많아진다. 실행 중 객체를 여러 번 생성한다든지, 어떤 객체에 대한 정보를 가지고 할 수 있는 일들이 많아진다. ReflectionAPI는 난이도가 있기 때문에 자바의 정석 기초편에서는 뺐지만, 좀 더 자세한 내용은 자바의 정석 3판(4판)을 참고하자.

 

equals(Object obj)

  • 객체 자신(this)과 주어진 객체(obj)를 비교한다. (반환타입 : boolean - 같으면 true, 다르면 false)
  • Object클래스의 equals는 객체의 주소를 비교한다.(참조변수 값 비교)

 

더보기

Value객체가 가진 iv값을 가지고 같고 다름을 비교하려면, equals()를 오버라이딩해야 한다. 그렇게 해야 v1과 v2를 equals()로 비교한 결과가 true가 나오기 때문이다.

예제 9-1

Ex9_1 실습하기

 

더보기
class Value {
    int value;

    Value(int value) {
        this.value = value;
    }
    // Object의 equals를 오버라이딩해서 주소가 아닌 value를 비교
    public boolean equals(Object obj) {
//      return this == obj;             // 주소 비교. 서로 다른 객체는 항상 거짓
//      return this.value == obj.value; // 두 객체의 value값을 비교하려면, this.value와 obj.value를 비교해야 한다
//      하지만, obj에는 value라는 iv가 없기 때문에 형변환을 해줘야 한다(다형성)
        // 참조변수의 형변환 전에는 반드시 instanceof로 확인해야 함
        if(!(obj instanceof Value)) return false;
        Value v = (Value)obj; // obj를 Value로 형변환
        return this.value == v.value;
    }
}

결과

v1과 v2는 같습니다.

 

equals(Object obj)의 오버라이딩

  • iv 값을 비교하도록 equals()를 오버라이딩해야 한다.

 

더보기

'두 객체가 다르다'는 것은 'iv값이 다르다'는 뜻이다. cv와 달리, iv값은 객체마다 다르기 때문이다. 객체는 iv를 가지고 비교해야 한다. 그러기 위해서, equals메서드를 오버라이딩해야 한다.

예제 9-2

Ex9_2 실습하기
댓글
공지사항