모래블로그

[Java] Object toString() 본문

Language/Java

[Java] Object toString()

별모래 2024. 7. 23. 07:05
728x90

 

5. toString()

 

toString()

Object.toString() 메서드는 객체의 정보를 문자열 형태로 제공한다. 그래서 디버깅과 로깅에 유용하게 사용된다.

이 메서드는 Object 클래스에 정의되므로 모든 클래스에서 상속 받아 사용할 수 있다.

public class ToStringMain1 {
  public static void main(String[] args) {
    Object object = new Object();
    String string = object.toString();

    // toString() 반환값 출력
    System.out.println(string);

    // object 직접 출력
    System.out.println(object);
  }
}
 

실행 결과

둘이 같은 결과가 나왔다.

클래스 정보@참조값 형태로 출력됨

 

Object.toString()

Object가 제공하는 toString() 메서드는 기본적으로 패키지를 포함한 객체의 이름과 객체의 참조값(해시코드)를 16진수로 제공한다.

해시코드(hasCode())에 대한 정확한 내용은 이후에 별도로 다룸. 지금은 객체의 참조값 정도로 생각하면 됨

 

 

println()과 toString()

그런데 toString()의 결과를 출력한 코드와 objectprintln()에 직접 출력한 코드의 결과가 완전히 같다.

// toString() 반환값 출력
String string = object.toString();
System.out.println(string);

// object 직접 출력
System.out.println(object);
 
System.out.println() 메서드는 사실 내부에서 toString()을 호출한다.

Object 타입(자식 포함)이 println()에 인수로 전달되면 내부에서 obj.toString() 메서드를 호출해서 결과를 출력한다.

 

println 메서드 내부

 

valueOf 메서드 내부

따라서 println()을 사용할 때, toString()을 직접 호출할 필요 없이 객체를 바로 전달하면 객체의 정보를 출력할 수 있다.

 

 

toString() 오버라이딩

Object.toString() 메서드가 클래스 정보와 참조값을 제공하지만 이 정보만으로는 객체의 상태를 적절하게 나타내지 못한다.

(-> java.lang.Object@b4c966a 이걸 가지고 안에 어떤 값을 가지고 있는지알 수 없으므로)

그래서 보통 toString()재정의(오버라이딩)해서 보다 유용한 정보를 제공하는 것이 일반적이다.

 

 

Car

public class Car {
  private String carName;

  public Car(String carName) {
    this.carName = carName;
  }
}
 

Car 에는 toString()을 재정의 하지 않음

 

Dog

public class Dog {
  private String dogName;
  private int age;

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

  @Override
  public String toString() {
    return "Dog{" +
        "dogName='" + dogName + '\'' +
        ", age=" + age +
        '}';
  }
}
 

Dog에는 toString()을 재정의함

 

ObjectPrinter

public class ObjectPrinter {
  public static void print(Object obj) {
    String string = "객체 정보 출력: " + obj.toString();
    System.out.println(string);
  }
}
 

 

ToStringMain2

public class ToStringMain2 {
  public static void main(String[] args) {
    Car car = new Car("Model Y");
    Dog dog1 = new Dog("멍멍이1", 2);
    Dog dog2 = new Dog("멍멍이2", 5);

    System.out.println("1. 단순 toString 호출");
    System.out.println(car.toString());
    System.out.println(dog1.toString());
    System.out.println(dog2.toString());

    System.out.println("2. println 내부에서 toString 호출");
    System.out.println(car);
    System.out.println(dog1);
    System.out.println(dog2);

    System.out.println("3. Object 다형성 활용");
    ObjectPrinter.print(car);
    ObjectPrinter.print(dog1);
    ObjectPrinter.print(dog2);
  }
}
 

실행 결과

 
Car 인스턴스는 toString()을 재정의하지 않았으므로 Object가 제공하는 기본 toString() 메서드를 사용한다.

Dog 인스턴스는 toString()을 재정의 한 덕분에 객체의 상태를 명확하게 확인할 수 있다.

 

 

ObjectPrinter.print(Object obj) 분석 - Car 인스턴스(toString() 재정의 X)

 

 

  • Object obj의 인수로 car(Car) 가 전달 된다.
  • 메서드 내부에서 obj.toString()을 호출한다.
  • objObject 타입이다. 따라서 Object 에 있는 toString() 을 찾는다.
  • 이때 자식에 재정의(오버라이딩) 된 메서드가 있는지 찾아본다. 재정의된 메서드가 없다.
  • Object.toString()을 실행한다.

 

ObjectPrinter.print(Object obj) 분석 - Dog 인스턴스(toString() 재정의 O)

  • Object obj의 인수로 dog(Dog) 가 전달 된다.
  • 메서드 내부에서 obj.toString()을 호출한다.
  • objObject 타입이다. 따라서 Object 에 있는 toString() 을 찾는다.
  • 이때 자식에 재정의(오버라이딩) 된 메서드가 있는지 찾아본다. Dog에 재정의된 메서드가 있다.
  • Dog.toString()을 실행한다.

 

 

참고- 객체의 참조값 직접 출력

toString()은 기본적으로 객체의 참조값을 출력한다.

그런데, toString()이나 hashCode()재정의하 객체의 참조값을 출력할 수 없다.

(-> 예를 들어, toString()을 재정의한 Dog의 경우 ObjectPrinter.print(dog1); 를 했을 때, 참조값이 아닌 Dog{dogName='멍멍이1', age=2}가 출력됐었음)

이때는 다음 코드를 사용하면 객체의 참조값을 출력할 수 있다.

String refValue = Integer.toHexString(System.identityHashCode(dog1));
System.out.println("refValue = " + refValue);
 

System.identityHashCode를 사용하면 참조값이 나오는데, 보통 16진수로 나타내므로 Integer.toHexString까지 해줌

 

실행결과

 

 

 

참고 강의 : 김영한 - 실전 자바 중급 1편

 

 

728x90

'Language > Java' 카테고리의 다른 글

[Java] java.lang 패키지  (0) 2024.07.15
Map, MultiValueMap의 차이  (1) 2024.06.11
JAVA (자바)  (0) 2023.11.22