Java의 Object 클래스와 메서드
Object 클래스는 모든 클래스 상속 계층도의 최상위에 있는 부모 클래스이다. 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스를 상속 받게 된다. 예를 들어 문자열을 나타내는 String 클래스도 찾아보면 Object 클래스를 상속 받고 있다.
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
아래 바이트코드에서 Child 클래스의 부모 클래스인 Parent 클래스에 컴파일러가 자동으로 Object 클래스를 추가한 것을 볼 수 있다. 이미 어떤 클래스로부터 상속을 받는 클래스에 대해서는 컴파일러가 따로 Object 클래스를 추가하지 않아 Child 클래스는 Parent 클래스를 상속 받는 것을 확인할 수 있다.
Object 클래스에는 멤버 변수 없이 오직 11개의 메서드만 있다.
매개변수로 객체의 참조 변수를 받아서 비교하여 그 결과를 boolean값으로 알려 준다. Object 클래스에 아래와 같이 정의되어 있다. this
를 출력해보면 클래스의 FQCN과 16진수의 해시 코드(고유값)를 확인할 수 있다.
public boolean equals(Object obj) { return (this == obj); }
두 개의 참조 변수가 같은 객체를 참조하고 있는지를 참조 변수의 고유값으로 판단하기 때문에 서로 다른 객체가 같은 내용을 가질지라도 비교 결과는 false
가 된다.
class Value {
int value;
Value(int value) {
System.out.println(this);
this.value = value;
}
}
public class ObjectTest {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
System.out.println("v1.equals(v2): " + v1.equals(v2));
v2 = v1;
System.out.println("v2: " + v2);
System.out.println("v1.equals(v2): " + v1.equals(v2));
}
}
해싱(hashing) 기법에 사용되는 해시 함수(hash function)를 구현한 메서드이다. 해시 함수는 찾고자하는 값을 입력하면 그 값이 저장된 위치를 알려주는 해시 코드(hash code)를 반환한다. 일반적으로 해시 코드가 같은 두 객체가 존재할 수 있지만 Object 클래스에 정의된 hashCode()는 객체의 고유 정수값을 이용한 해시 코드를 반환하기 때문에 서로 다른 객체는 결코 같은 해시 코드를 가질 수 없다.
public native int hashCode();
native
메서드는 다른 프로그래밍 언어로 작성된 플랫폼에 종속적인 메서드이다.class Value {
int value;
Value(int value) {
System.out.println(this);
this.value = value;
}
}
public class ObjectTest {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
System.out.println("v1.hashCode(): " + v1.hashCode());
System.out.println("v2.hashCode(): " + v2.hashCode());
v2 = v1;
System.out.println("v2.hashCode(): " + v2.hashCode());
System.out.println("v2: " + Integer.decode(String.valueOf(v2.hashCode())));
}
}
객체 값은 사실 해당 객체의 해시 코드를 16진수로 표현한 값임을 알 수 있다.
인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의된 메서드이다. 인스턴스 변수에 저장된 값을 문자열로 표현할 때 사용되는데 아래와 같이 Object 클래스에 정의된 내용은 클래스명과 해시코드만 나올 뿐 다른 정보는 보여주지 않는다. 따라서 클래스를 작성할 때 해당 클래스에 맞게 오버라이딩해주어야 한다.
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
class Value {
int value;
String name;
Value(int value, String name) {
this.value = value;
this.name = name;
}
@Override
public String toString() {
return "Value{" +
"value=" + value +
", name='" + name + '\'' +
'}';
}
}
public class ObjectTest {
public static void main(String[] args) {
Value v1 = new Value(10, "v1");
Value v2 = new Value(20, "v2");
System.out.println(v1.toString());
System.out.println(v2.toString());
}
}
public
으로 오버라이딩 되었다.