Object Class

mskimdev·2026년 3월 13일

Java OOP-Advanced

목록 보기
7/8

Object 클래스

자바를 배우다 보면 모든 클래스가 자동으로 무언가를 "상속받고 있다"는 말을 듣게 된다. 그 무언가가 바로 Object 클래스다. 이번 글에서는 Object 클래스가 무엇인지, 왜 중요한지를 쉽게 풀어보려 한다.


Object 클래스란?

Object 클래스는 자바의 모든 클래스의 최상위 부모 클래스다.

내가 만든 클래스든, 자바가 제공하는 클래스든, 모든 클래스는 Object를 조상으로 둔다. 직접 extends Object를 쓰지 않아도 자바 컴파일러가 자동으로 추가해준다.

// 아래 두 코드는 완전히 동일하다
public class Dog { }
public class Dog extends Object { }

마치 모든 사람이 "인간"이라는 공통 조상에서 출발하는 것처럼, 자바의 모든 클래스는 Object에서 출발한다.


Object 클래스가 중요한 이유

Object를 최상위로 두면 자바의 모든 객체를 Object 타입 하나로 다룰 수 있다.

Object obj1 = new Dog();
Object obj2 = new String("안녕");
Object obj3 = new Integer(42);

// 종류가 달라도 Object 배열 하나에 모두 담을 수 있다
Object[] anything = { new Dog(), "안녕", 42 };

또한 Object가 제공하는 메서드들을 모든 클래스에서 기본으로 사용할 수 있다.


Object의 주요 메서드

Object 클래스는 모든 클래스가 공통으로 가져야 할 기본 메서드들을 제공한다. 그중 자주 쓰이는 3가지를 살펴보자.

1. toString() — 객체를 문자열로 표현하기

toString()은 객체를 문자열로 표현할 때 호출된다. System.out.println(객체) 를 하면 자동으로 이 메서드가 호출된다.

기본 구현은 클래스명@해시코드 형태라 사람이 읽기 어렵다. 그래서 보통 오버라이딩해서 의미 있는 정보를 출력하도록 바꾼다.

public class Dog {
    String name;
    int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // toString()을 오버라이딩하지 않으면 Dog@1a2b3c 같은 값이 출력된다
    @Override
    public String toString() {
        return "강아지 이름: " + name + ", 나이: " + age;
    }
}

Dog dog = new Dog("멍멍이", 3);
System.out.println(dog); // 강아지 이름: 멍멍이, 나이: 3

2. equals() — 객체의 내용이 같은지 비교하기

== 연산자는 두 변수가 같은 객체를 가리키는지(주소 비교)를 확인한다. 반면 equals()객체의 내용이 같은지를 비교하기 위해 사용한다.

기본 구현은 ==과 동일하게 주소를 비교한다. 내용 비교가 필요하다면 오버라이딩해야 한다.

String a = new String("hello");
String b = new String("hello");

System.out.println(a == b);       // false (서로 다른 객체)
System.out.println(a.equals(b));  // true  (내용이 같음, String은 이미 오버라이딩되어 있음)
public class Dog {
    String name;

    public Dog(String name) { this.name = name; }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof Dog)) return false;
        Dog other = (Dog) obj;
        return this.name.equals(other.name); // 이름이 같으면 같은 강아지로 본다
    }
}

Dog dog1 = new Dog("멍멍이");
Dog dog2 = new Dog("멍멍이");

System.out.println(dog1.equals(dog2)); // true

3. hashCode() — 객체의 고유 번호

hashCode()는 객체를 식별하는 정수값을 반환한다. HashMap, HashSet 같은 자료구조가 객체를 빠르게 찾을 때 내부적으로 사용한다.

중요한 규칙: equals()를 오버라이딩했다면 hashCode()도 반드시 함께 오버라이딩해야 한다.
equals()true인 두 객체는 반드시 같은 hashCode()를 가져야 하기 때문이다.

@Override
public int hashCode() {
    return name.hashCode(); // 이름을 기준으로 해시코드 생성
}

equals()와 hashCode()는 왜 함께 오버라이딩해야 할까?

HashSet은 중복을 허용하지 않는다. 중복 여부를 확인할 때 먼저 hashCode()로 같은 버킷을 찾고, 그 안에서 equals()로 최종 비교한다.

hashCode()를 오버라이딩하지 않으면, 내용이 같은 두 객체가 서로 다른 해시코드를 가져 중복으로 인식되지 않는 문제가 생긴다.

Set<Dog> dogs = new HashSet<>();
dogs.add(new Dog("멍멍이"));
dogs.add(new Dog("멍멍이")); // equals()만 오버라이딩 시 중복으로 인식 못 함

// equals()와 hashCode() 모두 오버라이딩했을 때
System.out.println(dogs.size()); // 1 (중복 제거됨)

자주 쓰이는 그 외 메서드

메서드설명
getClass()객체의 실제 클래스 정보를 반환한다
clone()객체를 복사한다 (사용하려면 Cloneable 인터페이스 구현 필요)
finalize()객체가 GC(가비지 컬렉터)에 의해 소멸되기 직전에 호출된다 (Java 9부터 deprecated)

마무리

Object 클래스는 평소에 의식하지 않아도 항상 우리 곁에 있는 존재다.

toString(), equals(), hashCode()는 자바 개발에서 가장 자주 오버라이딩하는 메서드들이다. 단순히 문법을 외우기보다, "왜 이 메서드가 필요한가" 를 이해하고 나면 훨씬 자연스럽게 사용하게 될 것이다.

profile
<- 개발 공부하는 나

0개의 댓글