Object란?
자바에서 모든 클래스의 조상
Object는 자바에서 존재하는 모든 클래스의 ‘최상위(Top) 클래스’입니다.
자바에서는 우리가 새로 만드는 클래스들이 특별히 상속을 명시하지 않아도,
자동으로 java.lang.Object 클래스를 상속받습니다.
public class MyClass {
// Object를 명시적으로 상속하지 않아도 자동 상속!
}
위 코드도 실제로는 아래처럼 됩니다👇
public class MyClass extends Object {
}
즉, 우리가 사용하는 String, Integer, ArrayList, Scanner, File 등 모든 클래스는 Object의 자식이에요.
클래스 계층 구조 예시
Object
├── String
├── Integer
├── ArrayList
│ └── 요소들도 결국 Object를 상속받은 클래스들
└── MyClass (사용자 정의 클래스)
👉 이러한 계층 구조 덕분에 자바의 모든 객체는 Object 클래스의 기능을 공통으로 사용할 수 있어요.
왜 이렇게 설계했을까요?
공통 기능을 모든 객체가 사용할 수 있도록 하기 위해서입니다.
Object 클래스에 공통 기능을 정의해 두면,
모든 클래스가 이 기능을 자동으로 사용할 수 있어요.
예를 들어,
- 모든 객체는 toString()으로 문자열 표현이 가능하고,
- equals()로 다른 객체와 비교할 수 있고,
- getClass()로 클래스 정보를 확인할 수 있어요.
이런 메서드들은 전부 Object 클래스에 정의돼 있기 때문에,
모든 객체가 아무 설정 없이도 사용할 수 있는 거예요.
주요 메서드
자바에서 모든 클래스는 Object 클래스를 자동으로 상속받습니다.
Object 클래스는 다음과 같은 기본 메서드들을 정의하고 있어요.
| 메서드 | 설명 |
| toString() | 객체를 문자열로 표현 |
| equals() | 두 객체가 같은지 비교 |
| hashCode() | 객체의 해시코드 반환 |
| getClass() | 클래스 정보 반환 |
| clone() | 객체 복제 (복사) |
| wait()/notify() | 쓰레드 동기화 관련 메서드 |
✅ 이 메서드들은 모든 클래스에서 기본으로 사용할 수 있으며,
필요에 따라 오버라이딩(재정의) 하여 클래스에 맞게 수정할 수 있어요.
💡 clone()과 wait()/notify()는 고급 주제로, 추후 학습에서 다시 자세히 다루겠습니다.
예시 코드
* 사용자 클래스 (MyClass)
public class MyClass {
private int id;
private String name;
public MyClass(int id, String name) {
this.id = id;
this.name = name;
}
// toString() 오버라이딩 – 객체를 문자열로 표현
@Override
public String toString() {
return "MyClass { id=" + id + ", name='" + name + "' }";
}
// equals() 오버라이딩 – 논리적 비교
@Override
public boolean equals(Object obj) {
if (this == obj) return true; // 주소가 같으면 true
if (!(obj instanceof MyClass)) return false; // 타입 다르면 false
MyClass other = (MyClass) obj;
return this.id == other.id && this.name.equals(other.name);
}
// hashCode() 오버라이딩 – equals와 같이 사용해야 함
@Override
public int hashCode() {
return id * 31 + name.hashCode();
}
}
* 실행 클래스
public class TestMain {
public static void main(String[] args) {
MyClass obj1 = new MyClass(1, "우진");
MyClass obj2 = new MyClass(1, "우진");
MyClass obj3 = new MyClass(2, "현수");
System.out.println("toString() 출력:");
System.out.println(obj1); // MyClass { id=1, name='우진' }
System.out.println("\nequals() 비교:");
System.out.println("obj1 == obj2: " + (obj1 == obj2)); // false (주소 비교)
System.out.println("obj1.equals(obj2): " + obj1.equals(obj2)); // true (내용 비교)
System.out.println("\nhashCode() 비교:");
System.out.println("obj1.hashCode(): " + obj1.hashCode());
System.out.println("obj2.hashCode(): " + obj2.hashCode());
System.out.println("obj3.hashCode(): " + obj3.hashCode());
}
}
- 출력 결과 -
toString() 출력:
MyClass { id=1, name='우진' }
equals() 비교:
obj1 == obj2: false
obj1.equals(obj2): true
hashCode() 비교:
obj1.hashCode(): 12345678
obj2.hashCode(): 12345678
obj3.hashCode(): 87654321
* 해시코드는 실행에 따라 값이 달라집니다
💡 헷갈리기 쉬운 포인트!
== vs equals() 차이
| 비교 방법 | 의미 | 예시 설명 |
| == | 두 객체의 주소(위치) 가 같은지 비교 | "진짜 똑같은 물건인지?" 확인 |
| equals() | 두 객체 안의 값(내용) 이 같은지 비교 | "다른 물건이지만 내용물이 같은지?" 확인 |
예시로 풀어볼게요!
MyClass a = new MyClass(1, "우진");
MyClass b = new MyClass(1, "우진");
System.out.println(a == b); // false 👉 주소가 다름
System.out.println(a.equals(b)); // true 👉 값이 같음 (내용 비교)
👉 a와 b는 서로 다른 객체(다른 상자) 이지만, 안에 담긴 값은 같기 때문에 equals()는 true가 됩니다.
반면 ==는 서로 다른 상자이기 때문에 false입니다.
요약하자면,
== 👉 "같은 객체냐?" (같은 주소)
equals() 👉 "같은 값이냐?" (내용 비교)
요약정리
| 항목 | 설명 |
| 최상위 클래스 | Object |
| 자동 상속 | 모든 클래스는 Object를 상속받음 |
| 주요 메서드 | toString(), equals(), hashCode() 등 |
| 활용 이유 | 공통 기능 제공, 오버라이딩으로 다양한 객체 비교/출력 가능 |
읽어주셔서 감사합니다 😊
'프로그래밍 언어 > Java' 카테고리의 다른 글
| [Java] 44. 제네릭스(Generics)의 와일드카드<?> (0) | 2025.05.13 |
|---|---|
| [Java] 43. 제네릭스란?(Generics) - 제네릭 클래스와 제네릭 메서드 만들기 (0) | 2025.05.12 |
| [Java] 41. Arrays 클래스 vs Collections 클래스 (1) | 2025.05.08 |
| [Java] 40. 반복자 Iterator란? (Iterator, ListIterator, Enumeration) (0) | 2025.05.08 |
| [Java] 39. Map이란? (HashMap, LinkedHashMap, TreeMap) (1) | 2025.05.07 |
