Java

[Java]Object 클래스의 toString 메서드

DevStory 2022. 9. 2.

Object 클래스의 toString 메서드

Java의 모든 클래스는 최상위 클래스인 Object에서 파생됩니다. 그리고 Object 클래스에는 toString() 메서드가 존재하므로 모든 클래스의 인스턴스는 toString() 메서드를 호출할 수 있습니다.

 

여기서 주의할 점은 java.lang 패키지에 존재하는 Object와 java.util 패키지의 Objects는 엄연히 다른 클래스입니다. 최상위 클래스인 Object는 java.lang 패키지에 존재합니다.

 

이번 포스팅은 Object 클래스에 존재하는 toString() 메서드의 기본 동작과 toString() 메서드를 올바르게 사용하는 방법을 설명합니다. 


기본 동작 

java.lang 패키지에 존재하는 Object 클래스의 toString() 메서드 구문은 다음과 같습니다.

public String toString() {
  return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

현재 "클래스 이름 + 특수문자 @ + 해시 코드를 16진수로 표현"을 문자열로 반환합니다. 따라서, Object 클래스에서 파생된 클래스에서 toString() 메서드를 재정의하지 않으면, 다음 예제처럼 알 수 없는 문자열이 반환됩니다.

public static void main(String args[]) {
  Object obj = new Object();
  System.out.println("obj.toString(): " + obj.toString());

  Person person = new Person();
  System.out.println("person.toString(): " + person.toString());
}

[실행 결과]

obj.toString(): java.lang.Object@42a57993
person.toString(): Person@75b84c92

toString 메서드 재정의

Object 클래스에서 제공하는 toString() 메서드가 반환하는 값은 의미 있는 값일까요?

 

전혀, 그렇지 않습니다.

 

정말 쓸모없는 값이므로 클래스를 구현할 때, toString() 메서드를 재정의하여 의미 있는 문자열을 반환하도록 소스 코드를 작성하는 것이 좋습니다.

※ 참고
Java에서 제공하는 일부 클래스는 의미 있는 문자열을 반환하기 위해 toString() 메서드를 재정의합니다. 예를 들어, 래퍼 클래스, 컬렉션에 존재하는 일부 클래스, String 클래스, StringBuffer 클래스, StringBuilder 클래스가 있습니다.

클래스에서 toString 메서드 재정의

Person이라는 클래스는 Name, Age라는 두 개의 필드가 존재합니다. Person 클래스의 인스턴스에서 toString() 메서드를 호출하면, Name, Age 필드를 문자열로 반환하도록 toString() 메서드를 재정의합니다.

public class Person {
  private String Name;
  private Integer Age;

  public Person(String name, Integer age) {
    Name = name;
    Age = age;
  }
}

Eclipse, IntelliJ와 같은 개발 툴을 사용한다면, 클릭 몇 번으로 손쉽게 toString() 메서드를 재정의할 수 있습니다.

 

저는 IntelliJ를 사용하므로 IntelliJ에서 toString() 메서드를 재정의하는 방법을 소개합니다.

 

순서 1. 클래스에서 마우스 우클릭 Generate... 클릭

순서 2. toString() 클릭

순서 3. toString() 메서드에서 문자열로 표현하고 싶은 필드를 선택하고 OK 버튼 클릭

위 순서를 따라 하셨다면, 다음 소스 코드처럼 toString() 메서드가 재정의됩니다. 개발자가 직접 toString() 메서드를 재정의하는 소스 코드를 작성해도 상관없습니다.

public class Person {
  private String Name;
  private Integer Age;

  public Person(String name, Integer age) {
    Name = name;
    Age = age;
  }
  
  @Override
  public String toString() {
    return "Person{" +
            "Name='" + Name + '\'' +
            ", Age=" + Age +
            '}';
  }
}

 

다음 예제는 toString() 메서드가 재정의된 Person 클래스의 인스턴스에서 toString() 메서드를 호출합니다.

public static void main(String args[]) {
  Person person1 = new Person("둘리", 10);
  Person person2 = new Person("마이콜", 20);

  System.out.println("person1.toString(): " + person1.toString());
  System.out.println("person2.toString(): " + person2.toString());
}

[실행 결과]

person1.toString(): Person{Name='둘리', Age=10}
person2.toString(): Person{Name='마이콜', Age=20}
반응형

댓글