Object 클래스는 java.lang 패키지에서 제일 많이 사용되는 클래스로써 자바의 다른 모든 클래스들의 최고 조상 클래스이다. 따라서 자바의 모든 클래스들은 Object의 메서드를 사용할 수 있다. 그리고 Object 클래스는 필드는 없지만 11개의 메서드로 이루어져있다. 그림에서는 9개의 메서드지만 wait 메서드가 오버로딩으로 인해 총 3개의 wait 메서드가 포함되어있다.

📌 .toString() 메서드 / String toString()
해당 인스턴스를 문자열로 반환해준다. 기본적으로, Object 클래스의 toString() 메서드는 인스턴스의 클래스 이름과 구분자 "@", 및 인스턴스의 해시 코드를 문자열로 반환합니다. 이 문자열은 일반적으로 디버깅 목적으로 사용됩니다.
Car car01 = new Car(); System.out.println(car01.toString()); //출력 Car@15db9742
📌 .clone() 메서드 / protected Object clone()
해당 인스턴스를 복사해 새로운 인스턴스를 생성해준다. 이때, 복제된 인스턴스와 원본 인스턴스는 서로 다른 메모리 공간에 존재하게된다. 하지만 Object 클래스의 clone() 메소드는 단지 필드의 값만을 복사하므로, 필드의 값이 배열이나 인스턴스면 제대로 복제할 수 없다. 또한, 원본 인스턴스의 수정이 가능해진다. 그래서 이를 방지하기 위해, 복제하려는 해당 클래스에서 clone() 메소드를 오버라이딩하여, 복제가 제대로 이루어지도록 재정의해야 한다. 이러한 clone() 메소드는 데이터의 보호를 이유로 Cloneable 인터페이스를 구현한 클래스의 인스턴스만이 사용할 수 있다.
// Cloneable 인터페이스를 구현한 클래스 public class MyClass implements Cloneable { private int value; public MyClass(int value) { this.value = value; } public void setValue(int value) { this.value = value; } public int getValue() { return value; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } //main 메서드 MyClass obj1 = new MyClass(10); MyClass obj2 = null; try { obj2 = (MyClass) obj1.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } System.out.println("obj1 value: " + obj1.getValue()); System.out.println("obj2 value: " + obj2.getValue()); obj1.setValue(20); System.out.println("obj1 value: " + obj1.getValue()); System.out.println("obj2 value: " + obj2.getValue()); //출력 obj1 value: 10 obj2 value: 10 obj1 value: 20 obj1 value: 10
📌 .equals() 메서드 / boolean equals(Object Obj)
두 개의 인스턴스가 동일한지 여부를 확인하는 메서드이다. 두 인스턴스가 가지고 있는 참조 변수의 값을 비교하여 동일하면 true를 반환하고, 그렇지 않은 경우 false를 반환한다. 또한, equals() 메서드를 하위 클래스에서 오버라이드할 때는 반드시 hashCode() 메서드도 함께 오버라이드하여 일관성있는 동등성 판단이 가능하도록 해야 한다.
Car car01 = new Car(); Car car02 = new Car(); System.out.println(car01.equals(car02)); car01 = car02; // 두 참조 변수가 같은 주소를 가리킴. System.out.println(car01.equals(car02)); //출력 false true
📌 .hashCode() / int hashCode()
해당 인스턴스의 해시 코드값을 반환한다. JVM은 모든 객체에 대하여 해시 코드라는 고유 번호를 만든다. Object 클래스에 의해 정의된 hashCode() 메서드는 객체에 대해 고유한 정수를 반환하는데 이것은 일반적으로 객체의 내부 주소를 정수로 변환한 것이다. 여기서 주의할 점은, 해시코드는 객체의 주소 값이 아니다. 해시 코드는 객체를 식별하기 위한 숫자로, 객체가 가지고 있는 모든 필드 값들을 기반으로 계산된다. hashCode() 메서드는 동일한 객체에 대해 여러 번 호출될 때마다 동일한 해시 코드를 반환해야 한다. JVM(Java Virtual Machine)은 객체를 HashSet, HashMap, Hashtable 등과 같은 해싱 관련 데이터 구조에 저장할 때, 해시코드 방식을 사용한다. 해시코드를 기반으로 객체를 저장할 때 가장 큰 장점은 검색이 쉽다는 것이다.
또한, hashCode() 메서드를 하위 클래스에서 오버라이드할 때는 반드시 equals() 메서드도 함께 오버라이드하여 일관성있는 동등성 판단이 가능하도록 해야 한다.public class Person { private String name; private int age; // 생성자, getter/setter 생략 @Override public int hashCode() { int result = 17; result = 31 * result + name.hashCode(); result = 31 * result + age; return result; } @Override public boolean equals(Object obj) { if (obj == null) return false; if (this == obj) return true; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (!name.equals(other.name)) return false; if (age != other.age) return false; return true; } }
📌 .getClass() / Class<'T'> getClass()
해당 객체의 클래스 타입을 반환한다. getClass() 메서드는 현재 객체의 클래스 정보를 나타내는 Class 객체를 반환해준다. 이 Class 객체를 이용하면 클래스의 이름, 필드, 메서드, 생성자 등의 정보를 알아낼 수 있다. getClass() 메서드는 주로 다형성(polymorphism)을 구현하기 위해 사용된다. 상위 클래스 타입으로 선언된 객체의 경우, getClass() 메서드를 이용하여 실제로 어떤 하위 클래스의 객체인지를 확인할 수 있다.
public class Test { public static void main(String[] args) { Object obj = new String("GeeksForGeeks"); Class c = obj.getClass(); System.out.println("Class of Object obj is : "+ c.getName()); } } //출력 Class of Object obj is : java.lang.String
📌 .finalize() / protected void finalize()
finalize() 메서드는 더 이상 사용되지 않는 데이터를 램(메모리 영역)에서 자동적으로 제거하는 Java의 가비지 컬렉터(Garbage Collector)에 의해 객체가 소멸되기 직전에, 마지막으로 호출되는 메서드이다. 가비지 컬렉터가 객체가 더 이상 사용되지 않는 다고 판단한다면 가비지 컬렉터가 finalize() 메서드를 호출한다. 그 후, finalize() 메서드는 객체의 리소스를 해제하고 객체는 소멸된다.
public class Test { public static void main(String[] args) { Test t = new Test(); System.out.println(t.hashCode()); t = null; // calling garbage collector System.gc(); System.out.println("end"); } @Override protected void finalize() { System.out.println("finalize method called"); } } //출력 1510467688 end finalize method called
더 많은 정보와 다른 메서드들은 출처 확인!
📓 오늘 느낀 점 한줄 요약
"모든 클래스 위에 있는 클래스" 🔢
20230410 TIL