☕️[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()'
을 실행합니다.
- 재정의된 메서드가 없을 경우에는
- 이때 자식에 재정의(Overriding, 오버라이딩)된 메서드가 있는지 찾아봅니다.
- 따라서
- 메서드 내부에서
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()'
을 실행합니다.
-
-
- 이때 자식에 재정의(Overriding, 오버라이딩)된 메서드가 있는지 찾아봅니다.
- 따라서
- 메서드 내부에서
🙋♂️ 참고 - 객체의 참조값 직접 출력
'toString()'
은 기본으로 객체의 참조값을 출력합니다.
그런데'toString()'
이나'hashCode()'
를 재정의하면 객체의 참조값을 출력할 수 없습니다.
이때는 다음 코드를 사용하면 객체의 참조값을 출력할 수 있습니다.
String refValue = Integer.toHexString(System.identityHashCode(dog1));
System.out.println("refValue = " + refValue);
실행 결과
refValue = 30dae81