Home > Java > Java > ☕️[Java] toString()

☕️[Java] toString()
Java Programming Language Backend

☕️[Java] toString()

1️⃣ toString()

  • 'Object.toString()' 메서드는 객체의 정보를 문자열 형태로 제공합니다.
    • 그래서 디버깅과 로깅에 유용하게 사용됩니다.
  • 이 메서드는 'Object' 클래스에 정의되므로 모든 클래스에서 상속받아 사용할 수 있습니다.
package langReview.object.tostring;

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);
	}
}

실행 결과

java.lang.Object@b4c966a
java.lang.Object@b4c966a

1️⃣ Object.toString()

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

2️⃣ println()과 toString()

  • 'toString()' 의 결과를 출력한 코드와 'object''println()' 에 직접 출력한 코드의 결과가 완전히 같습니다.
Object object = new Object();
String string = object.toString();

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

// object 직접 출력
System.out.println(object);
  • 'System.out.println' 메서드는 사실 내부에서 'toString()' 을 호출합니다.
    • 'Object' 타입(자식 포함)이 'println()' 에 인수로 전달되면 내부에서 'obj.toString()' 메서드를 호출해서 결과를 출력합니다.


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

2️⃣ toString() 오버라이딩.

  • 'Object.toString()' 메서드가 클래스 정보와 참조값을 제공하지만 이 정보만으로는 객체의 상태를 적절히 나타내지 못합니다.
    • 그래서 보통 'toString()' 을 재정의(Overriding, 오버라이딩)해서 보다 유용한 정보를 제공하는 것이 일반적입니다.

package langReview.object.tostring;

public class Car {

	private String carName;

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

package langReview.object.tostring;

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 +
				'}';
	}
}

package langReview.object.tostring;

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

package langReview.object.tostring;

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("=================================");
		System.out.println("2. println 내부에서 toString 호출");
		System.out.println(car);
		System.out.println(dog1);
		System.out.println(dog2);
		System.out.println("=================================");
		System.out.println("3. Object 다형성 활용");
		ObjectPrinter.print(car);
		ObjectPrinter.print(dog1);
		ObjectPrinter.print(dog2);
	}
}

실행 결과

1. 단순 toString 호출
langReview.object.tostring.Car@4e50df2e
Dog{dogName='멍멍이1', age=2}
Dog{dogName='멍멍이2', age=5}
=================================
2. println 내부에서 toString 호출
langReview.object.tostring.Car@4e50df2e
Dog{dogName='멍멍이1', age=2}
Dog{dogName='멍멍이2', age=5}
=================================
3. Object 다형성 활용
객체 정보 출력: langReview.object.tostring.Car@4e50df2e
객체 정보 출력: Dog{dogName='멍멍이1', age=2}
객체 정보 출력: Dog{dogName='멍멍이2', age=5}
  • 'Car' 인스턴스는 'toString()' 을 재정의 하지 않았습니다.
    • 따라서 'Object' 가 제공하는 기본 'toString()' 메서드를 사용합니다.
  • 'Dog' 인스턴스는 'toString()' 을 재정의 한 덕분에 객체의 상태를 명확하게 확인할 수 있습니다.

1️⃣ ObjectPrinter.print(Object obj) 분석 - Car 인스턴스

ObjectPrinter.print(car);

void print(Object obj = car(Car)) { // 인수 전달
    String string = "객체 정보 출력: " + obj.toString();
}
  • 'Object obj' 의 인수로 'car(Car)' 가 전달됩니다.
    • 메서드 내부에서 'obj.toString()' 을 호출합니다.
    • 'obj''Object' 타입입니다.
      • 따라서 'Object' 에 있는 'toString()' 을 찾습니다.
        • 이때 자식에 재정의(Overriding, 오버라이딩)된 메서드가 있는지 찾아봅니다.
          • 재정의된 메서드가 없을 경우에는 'Object.toString()' 을 실행합니다.

2️⃣ ObjectPrinter.print(Object obj) 분석 - Dog 인스턴스

ObjectPrinter.print(dog); // main에서 호출

void print(Object obj = car(Car)) { // 인수 전달
    String string = "객체 정보 출력: " + obj.toString();
}
  • 'Object obj' 의 인수로 'dog(Dog)' 가 전달됩니다.
    • 메서드 내부에서 'obj.toString()' 을 호출합니다.
    • 'obj''Object' 타입입니다.
      • 따라서 'Object' 에 있는 'toString()' 을 찾습니다.
        • 이때 자식에 재정의(Overriding, 오버라이딩)된 메서드가 있는지 찾아봅니다.
          • 'Dog' 에 재정의된 메서드가 있습니다.
            • 'Dog.toString()' 을 실행합니다.

🙋‍♂️ 참고 - 객체의 참조값 직접 출력
'toString()' 은 기본으로 객체의 참조값을 출력합니다.
그런데 'toString()' 이나 'hashCode()' 를 재정의하면 객체의 참조값을 출력할 수 없습니다.
이때는 다음 코드를 사용하면 객체의 참조값을 출력할 수 있습니다.

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

실행 결과

refValue = 30dae81