[Java] 3. Object 클래스 (toString, equals, hashCode, clone)

2026. 1. 28. 15:33·프로젝트/Java

1. Object 클래스

  • 정의: 모든 자바 클래스가 상속하는 최상위 클래스
  • 자바의 모든 클래스는 별도의 선언 없이도 Object 클래스를 상속받게 된다.
  • 자바의 모든 클래스가 이 기능을 가지므로, 각 메소드를 적절히 override하여 사용하는 것이 중요하다.

2. toString 메소드

  • 정의: 해당 클래스에 대한 설명을 문자열 타입으로 반환하는 메소드.
  • 보통 객체의 필드 값을 확인하기위해 override하여 사용한다.
  • IntelliJ - Code - Generate에서 자동 생성할 수 있다.
public class Person {
    private String name;
    private int age;

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

    @Override
    public String toString() {
        return "Name: " + name + ", Age: " + age;
    }
}

// 사용 예시
Person p = new Person("Kim", 25);
System.out.println(p.toString()); // 출력: Name: Kim, Age: 25

 


3. equals, hashCode 메소드

  • 자바에서 객체를 비교할 때 Identity, 동일비교(==)와 Equality, 동등비교(equals)를 구분한다.
  • equals(): 두 객체의 내용(속성)이 같은지 비교한다.
  • hashCode(): 객체를 식별하는 고유한 정수 값을 반환한다.
  • 논리적으로 같은 객체라면 반드시 같은 hashCode를 가져야하므로 `equals`를 override할 때는 `hashCode`도 함께 override한다.
  • IntelliJ - Code - Generate에서 자동 생성할 수 있다.
public class Person {
	private String name;
    private int age;
    public Person(String name, int age) {
    	this.name = name;
        this.age = age;
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true; // 주소가 같으면 true
        if (!(o instanceof Person)) return false; // 타입 체크
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name); // 속성 비교
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // 속성을 이용해 해시값 생성 
    }
}

4. clone 메소드

  • 정의: 현재 객체와 동일한 상태를 가진 새로운 인스턴스를 생성해 그 참조값을 반환한다.
  • 사용 조건: 복제를 허용하려는 클래스는 반드시 Cloneable 인터페이스를 implements 해야한다.
    그렇지않으면 `ClonNotSupportedException`이 발생한다.
  • 주의사항: 기본 clone()은 얕은복사를 수행한다. 따라서 깊은복사를 위해서는 override해서 직접구현해야한다.
public class User implements Cloneable {
    private String name;

    @Override
    public Object clone() throws CloneNotSupportedException {
        // 부모의 clone()은 protected이므로 외부 사용을 위해 public으로 재정의 
        return super.clone(); 
    }
}

 

 

* Cloneable 인터페이스와 마커 인터페이스(Marker Interface)

Cloneable 인터페이스는 실제로는 이렇게 생겼다. 

public interface Cloneable {

}

 

실제 Cloneable 인터페이스에는 아무 내용도 정의되어있지 않은데 이런 인터페이스를 마커 인터페이스(Marker Interface)라고 한다.

 

마커 인터페이스는 클래스가 특정한 능력을 갖추고 있음을 명시적으로 컴파일러나 JVM에 알려주는 표식 역할을 한다.

 

Cloneable이라는 인터페이스를 implements한 것을 통해 구현 클래스가 clone이 override되었다는 것을 명시하는 역할을 한다.

(이 객체는 복제해도 안전하다라는 것을 나타냄)

 

즉, 마커 인터페이스는 어노테이션과 비슷한 역할을 한다.

(어노테이션: 이 코드가 누구에의해 어떻게 처리돼야하는지 컴파일러에게 알려주는 힌트, @Override)

 

'프로젝트 > Java' 카테고리의 다른 글

[Java] 6. 예외처리  (0) 2026.02.06
[Java] 5. 문자열 (String, StringBuilder, StringBuffer), 자바 표준 입출력  (0) 2026.01.29
[Java] 4. 추상 클래스, 인터페이스  (0) 2026.01.28
[Java] 2. this, super / 다형성 (Up-casting, Down-casting)  (0) 2026.01.14
[Java] 1. JVM 메모리 구조 / static, final 키워드  (0) 2026.01.14
'프로젝트/Java' 카테고리의 다른 글
  • [Java] 5. 문자열 (String, StringBuilder, StringBuffer), 자바 표준 입출력
  • [Java] 4. 추상 클래스, 인터페이스
  • [Java] 2. this, super / 다형성 (Up-casting, Down-casting)
  • [Java] 1. JVM 메모리 구조 / static, final 키워드
sophon
sophon
sophon 님의 블로그 입니다.
  • sophon
    sophon 님의 블로그
    sophon
    • 카테고리 (172) N
      • 컴퓨터공학 (36)
        • 데이터베이스 (19)
        • 네트워크 (15)
        • 기타 이슈 (2)
      • 프로젝트 (16) N
        • Java (8)
        • Spring (4) N
        • Docker (4)
      • 코딩테스트 (95) N
        • BOJ (74)
        • 프로그래머스 (7)
        • 프로그래머스 SQL (12) N
        • PS Snippets (2)
      • 🌱 잡담 (22)
        • 자격증 (7)
        • 좋은 시 모음 (12)
        • 책과 영화 (3)
        • 기록 (0)
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sophon
[Java] 3. Object 클래스 (toString, equals, hashCode, clone)
상단으로

티스토리툴바