본문 바로가기
언어(Language)/Java

[Java] Object 클래스

by 송기동 2025. 6. 8.
728x90

Object 클래스

- 자동으로 모든 클래스의 조상이 되는 클래스

- 클래스 계층 구조에서 루트가 되는 클래스

- 모든 클래스는 자동으로 Object 클래스를 상속받음

- 주요 메소드로 clone(), equals(), hashCode(), toString() 등이 있음

 

toString( ) 메소드

 

- 객체의 정보를 문자열로 표현해주는 메서드

- 객체를 출력할 때 자동으로 호출됨

- 주로 디버깅용, 로그 출력용으로 오버라이딩해서 많이 사용

 

- 자식 클래스에서 재정의 가능(String, Integer 클래스 등에서 재정의되어 있음)

// 기본형 (오버라이딩 안 했을 때)
Object obj = new Object();
System.out.println(obj.toString());
// 출력 
// java.lang.Object@6d06d69c (클래스명@해시코드)

// 오버라이딩 예
class Person {
    String name;
    Person(String name) { this.name = name; }

    @Override
    public String toString() {
        return "이름: " + name;
    }
}

Person p = new Person("홍길동");
System.out.println(p);  
// 출력 
// 이름: 홍길동

equals( ) 메소드

- 두 객체가 "같은 값"인지 비교할 때 사용하는 메서드

- 단순히 == 로 비교하면 주소(참조값)를 비교하지만, equals()는 내용(값)을 비교하도록 오버라이딩 할 수 있음

- 자식 클래스에서 재정의 가능(String, Integer 클래스 등에서 재정의되어 있음)

// 예시 1. 기본형 vs 참조형 비교
int a = 10;
int b = 10;

System.out.println(a == b);       // true (값이 같음)
// 기본형은 == 로 비교해도 값이 같으면 true
// 예시 2. String 비교 - == vs equals()
String str1 = new String("hello");
String str2 = new String("hello");

System.out.println(str1 == str2);         // false (주소가 다름)
System.out.println(str1.equals(str2));    // true (내용이 같음)

// 🔥 문자열 비교는 항상 equals()를 써야 해요!
// ==은 메모리 위치(주소)를 비교하고, equals()는 실제 문자 내용을 비교
// 예시 3. 사용자 정의 클래스에서의 equals()
// 클래스를 직접 만들면 equals()를 오버라이딩하지 않는 한 ==처럼 작동

// 오버라이딩 안 했을 경우
class Person {
    String name;

    Person(String name) {
        this.name = name;
    }
}

Person p1 = new Person("홍길동");
Person p2 = new Person("홍길동");

System.out.println(p1.equals(p2));  // false (주소 다름)

// 오버라이딩한 경우
class Person {
    String name;

    Person(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof Person)) return false;
        Person p = (Person) obj;
        return this.name.equals(p.name);
    }
}

Person p1 = new Person("홍길동");
Person p2 = new Person("홍길동");

System.out.println(p1.equals(p2));  // true (값이 같음)
// 예시 4. null 과 비교할 때 주의점
String str = null;

System.out.println("hello".equals(str));  // false
// str.equals("hello");  ← NullPointerException 발생!

// 📌 항상 "리터럴.equals(변수)" 형태로 비교하면 안전

clone( ) 메소드

 

- 현재 객체와 똑같은 값을 가진 객체를 새로 생성

- 기본적으로 얕은 복사(shallow copy)를 수행

- Cloneable 인터페이스를 반드시 구현해야 사용 가능

- 직접 오버라이딩하여 public으로 열어야 함

 

- 예외처리(CloneNotSupportedException)를 해줘야 함

class Person implements Cloneable {
    String name;

    Person(String name) {
        this.name = name;
    }

    @Override
    public Person clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

Person p1 = new Person("홍길동");
Person p2 = p1.clone();

System.out.println(p1 == p2);             // false (다른 객체)
System.out.println(p1.name.equals(p2.name)); // true (내용 같음)

getClass( ) 메소드

- 객체가 어떤 클래스의 인스턴스인지 확인할 때 사용

- 리턴값은 class<?> 타입 객체(메타데이터)

String s = "Hello";
System.out.println(s.getClass().getName());  

// 출력
// java.lang.String

// 프레임워크(Spring 등)나 리플렉션(reflection)에서 클래스 정보를 읽어올 때 자주 사용

hashCode( ) 메소드

 

- 객체의 정수 해시코드(식별용 숫자) 를 반환

- 주로 HashMap, HashSet 등의 자료구조에서 객체의 위치를 결정할 때 사용

- equals()와 함께 오버라이딩해서 동등성 비교 기준으로 활용됨

String a = "hello";
String b = "hello";

System.out.println(a.equals(b));     // true
System.out.println(a.hashCode());    // 같음
System.out.println(b.hashCode());    // 같음

 

// 사용자 정의 클래스에서 오버라이딩 예
@Override
public int hashCode() {
    return name.hashCode();  // 주요 필드를 기준으로 해시값 계산
}

// equals()를 오버라이딩하면 hashCode()도 반드시 같이 오버라이딩해야 해요!
// 그렇지 않으면 HashMap, HashSet에서 제대로 동작하지 않아요.
728x90

'언어(Language) > Java' 카테고리의 다른 글

[Java] StringBuffer 클래스  (0) 2025.06.08
[Java] java.lang 패키지  (0) 2025.06.08
[Java] 패키지  (1) 2025.05.09
[Java] 람다식  (0) 2025.05.03
[Java] 제네릭  (0) 2025.05.03