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판)을 참고하자.
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;
}
}