개요
모든 클래스의 최상위 부모 클래스이다.
자바에서 모든 클래스는 암묵적으로 Object 클래스를 상속 받는다.
즉, 자바에서 직접 상속을 명시하지 않더라도 모든 클래스는 Object를 상속 받는다.
이를 통해 모든 객체는 Object 클래스에서 정의된 기본적인 메서드를 사용할 수 있다.
자바에서 Object 클래스는 여러 중요한 메서드를 제공하며, 이를 통해 모든 객체가 공통으로 사용할 수 있는 동작을 정의할 수 있다.
Object 클래스에서 제공하는 주요 메서드는 다음과 같다.
메서드 | 설명 |
equals(Object obj) | 객체 비교. 기본적으로 참조 비교를 하지만 오버라이드 가능 |
hashCode() | 객체의 해시 코드 반환. equals()와 함께 오버라이드 필요 |
toString() | 객체를 문자열로 반환. 오버라이드하여 내용을 표현할 수 있음 |
getClass() | 객체의 런타임 클래스 정보를 반환 |
clone() | 객체 복제 (얕은 복사). Cloneable 인터페이스 구현 필요 |
finalize() | 객체가 GC로 제거되기 전에 호출 (권장되지 않음) |
이러한 메서드를 오버라이드하여 객체의 특정 동작을 정의할 수 있다.
Object 클래스는 자바의 모든 클래스가 상속하는 최상위 클래스이므로, 자바의 객체 지향 프로그래밍에서 중요한 역할을 한다.
equals(Object obj)
객체의 동등성 비교를 위해 사용된다.
기본적으로, equals() 메서드는 참조 비교를 수행하며, 두 객체가 동일한 메모리 위치를 가리키는지 확인한다.
두 객체의 내용이 같은지 비교하려면 equals() 메서드를 오버라이드하여 내용 비교를 하도록 정의해야 한다.
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true; // 동일한 객체 참조일 경우
if (obj == null || getClass() != obj.getClass()) return false; // null 또는 다른 클래스일 경우
Person person = (Person) obj; // Person 객체로 캐스팅
return name.equals(person.name) && age == person.age; // 내용 비교
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("Alice", 25);
Person p2 = new Person("Alice", 25);
Person p3 = p1;
System.out.println(p1.equals(p2)); // true (내용 비교)
System.out.println(p1.equals(p3)); // true (참조 비교)
}
}
만약 equals함수를 Person클래스 내부에서 오버라이딩 하지 않았다면 내용 비교에서는 false가 출력될 것이다.
p1과 p2는 동일한 name과 age를 갖고 있지만 메모리 상에서 동일한 주소를 갖지는 않는다.
하지만 오버라이딩을 통해 name과 age가 같다면 true를 리턴하므로 p1과 p2는 동일하다고 출력한다.
hashCode()
객체의 해시 코드를 반환한다.
hashCode()는 객체의 메모리 주소나 내용을 기반으로 생성된 정수값을 반환한다.
equals()와 hashCode() 규칙: equals()가 두 객체가 같다고 판단하는 경우, hashCode() 값도 같아야 한다.
반대로, hashCode() 값이 다르면 두 객체는 다르다고 판단한다.
toString()
객체를 문자열로 표현할 때 사용
toString() 메서드는 기본적으로 클래스 이름과 해시 코드를 반환하지만, 자주 사용되는 객체의 경우 이 메서드를 오버라이드하여 객체의 정보를 사람이 읽을 수 있는 형태로 반환하도록 할 수 있다.
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("Alice", 25);
System.out.println(p1.toString()); // Person{name='Alice', age=25}
}
}
getClass()
객체의 런타임 클래스 정보를 반환
이를 통해 객체가 어떤 클래스로 생성되었는지 알 수 있다.
class Person {
// Some code
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
System.out.println(p1.getClass().getName()); // Person
}
}
clone()
객체를 복제(복사)하는 메서드
기본적으로 얕은 복사(shallow copy)를 수행하며, 객체의 Cloneable 인터페이스를 구현해야한다.
clone() 메서드는 Object 클래스에서 정의되었지만, 얕은 복사이기 때문에 깊은 복사를 원할 경우 오버라이드해야 한다.
class Person implements Cloneable {
String name;
Person(String name) {
this.name = name;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Person p1 = new Person("Alice");
Person p2 = (Person) p1.clone(); // 객체 복제
System.out.println(p1 != p2); // true (다른 객체)
System.out.println(p1.name.equals(p2.name)); // true (내용은 같음)
}
}
clone을 통해 p1을 복제하여 p2객체를 생성하였다.
두 객체는 다른 주소값을 사용하므로 다른 객체가 맞다.
equals를 통해 name을 비교했을 경우 동일하므로 true를 출력하게 된다.
finalize()
객체가 GC(가비지 컬렉션)에 의해 메모리에서 제거될 때 호출되는 메서드
하지만 가비지 컬렉션을 명시적으로 제어할 수 없기 때문에 권장되지 않는 메서드이다.
try-with-resources 같은 자원을 해제하는 다른 방식이 선호된다.
'웹(WEB) > 자바(Java)' 카테고리의 다른 글
[Java] 자바 Generics (0) | 2024.12.30 |
---|---|
[Java] 자바 인터페이스 (0) | 2024.12.30 |
[Java] 자바 제한자 (0) | 2024.12.30 |
[Java] 자바 package, import (0) | 2024.12.29 |
[Java] 자바 객체지향 프로그래밍 (0) | 2024.12.29 |