본문으로 건너뛰기
Advertisement

9.1 Object 클래스 (The Object Class)

안내: 이 문서는 Java 21 버전을 기준으로 작성되었습니다. 심도 있는 세부 내용은 공식 Java Documentation을 참고해주세요.

자바에서는 여러분이 무언가를 만들기 위해 class를 선언하면, 자동으로 숨겨진 상속이 하나 발생합니다. 프로그래머가 명시적으로 extends 키워드를 사용해 다른 부모를 상속받지 않는 한, 자바의 모든 클래스는 기본적으로 java.lang.Object 클래스를 상속받습니다.

결론적으로 자바의 모든 객체는 이 Object 클래스의 자손이며, Object가 제공하는 유용한 11개의 기본 메서드들을 공통적으로 사용할 수 있습니다. 이번 장에서는 그중에서도 가장 자주 폭넓게 쓰이는 핵심 메서드 3가지를 정리해보겠습니다.

1. 객체의 정보를 문자열로 반환: toString()

toString() 메서드는 생성된 객체에 대한 간략한 정보를 문자열(String) 로 반환해줍니다.

보통 System.out.println(객체이름)을 실행하면 화면에 알 수 없는 영어와 숫자의 조합(예: Person@15db9742)이 뜨는 것을 보셨을 텐데, 이는 println() 내부에서 객체의 toString()을 자동으로 호출하기 때문입니다.

원래 ObjecttoString()클래스이름@객체의해시코드(16진수)를 반환하게 설계되어 있지만, 보통 클래스를 설계할 때 이 메서드를 내가 원하는 정보가 나오게끔 오버라이딩(Overriding) 해서 씁니다.

class Book {
String title;
String author;

Book(String title, String author) {
this.title = title;
this.author = author;
}

// Object 클래스의 toString() 메서드를 재정의
@Override
public String toString() {
return "책 제목: " + title + ", 저자: " + author;
}
}

public class ObjectExample {
public static void main(String[] args) {
Book myBook = new Book("자바의 정석", "남궁성");
// myBook.toString()이 자동으로 호출됨
System.out.println(myBook);
}
}

[실행 결과]

책 제목: 자바의 정석, 저자: 남궁성

2. 객체의 내용물 비교: equals(Object obj)

자바에서 쌍둥이처럼 똑같이 생긴 두 객체가 있다고 칩시다. 이때 == 연산자로 두 객체를 비교하면 자바는 "메모리 주소"가 같은지를 비교하기 때문에 100% false라고 대답합니다 (서로 다른 곳에 각각 집을 지었으므로).

"안에 든 내용물(데이터)이 같은지" 를 비교하고 싶다면 equals() 메서드를 써야 합니다. 단, 이 기능도 기본적으로는 ==와 똑같이 주소값을 비교하도록 동작하기 때문에, 프로그래머가 자신의 기준에 맞게 오버라이딩 해야 합니다! (특히 String 클래스에서 문자열 비교에 무조건 equals()를 쓰는 이유가 바로, String 내부에서 글자가 같으면 true가 나오도록 이 메서드를 이미 오버라이딩해 두었기 때문입니다.)

class User {
long id; // 주민등록번호

User(long id) {
this.id = id;
}

// Object의 equals()를 오버라이딩하여 내용물을 비교하도록 수정
@Override
public boolean equals(Object obj) {
// 들어온 비교대상이 User 타입이고 안전하게 형변환이 가능한가?
if (obj instanceof User) {
User other = (User) obj;
return this.id == other.id; // 본인의 id와 비교 대상의 id가 같으면 true
}
return false;
}
}

public class EqualsExample {
public static void main(String[] args) {
User u1 = new User(8001011111111L);
User u2 = new User(8001011111111L);

System.out.println(u1 == u2); // false (메모리 주소가 다름)
System.out.println(u1.equals(u2)); // true (오버라이딩 덕분에 내용이 같아서 true)
}
}

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

hashCode() 메서드는 객체를 식별하기 위한 하나의 고유한 정수값(해시코드)을 반환합니다. 자바 시스템이 메모리 저장 속도를 극대화할 때(특히 HashMap, HashSet 등에서) 데이터를 찾아가는 열쇠(Key)로 사용됩니다.

  • 일반적으로 Object의 기본 함수는 메모리 주소값을 기준으로 해시코드를 만들어냅니다.
  • 중요 규칙: 앞서 설명한 equals() 메서드를 오버라이딩해서 "두 객체가 같다"고 정의했다면, 반드시 hashCode() 메서드도 오버라이딩 해서 "이 똑같은 두 객체는 해시코드 번호도 완전히 똑같다"고 자바 시스템에게 알려주어야 합니다. (그렇지 않으면 자료구조에서 큰 버그가 발생합니다!)

이처럼 자바의 최상위 조상 Object 클래스는 프로그래밍 도중 꼭 필요한 "주민등록, 인쇄, 비교" 같은 굵직한 핵심 기능들의 뼈대를 모아둔 엄청나게 유용한 도구 상자입니다.

Advertisement