public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
위의 코드와 같이 Object 클래스의 toString()은 설계도 객체, 클래스이름, 위치 , 객체의 주소를 반환하는 코드로 구성되어 있다.
public void println(Object x) { String s = String.valueOf(x); if (getClass() == PrintStream.class) { // need to apply String.valueOf again since first invocation // might return null writeln(String.valueOf(s)); } else { synchronized (this) { print(s); newLine(); } } }
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
📃Object클래스의 자식인 객체가 println(Object x);에 대입 될 경우
obj.toString()을 자식 객체에서 오버라이딩 하였다면 obj.toStirng()의 구현부가 실행되는 것이 아닌 자식에서 오버라이딩 된 toString()메서드가 호출된다.
즉 만들어진 객체는 Object클래스의 내용이 아닌 자기 자신의 내용을 객체에 담고 있고, 부모의 리모컨(Object)로 오버라이딩 된 메서드를 호출하면 실제 자식에서 구현된 메서드가 호출된다!!
class father {
public void method1() {
System.out.println("1");
}
}
class son extends father {
public void method1() {
System.out.println("2");
}
}
public class ObjectMethod2 {
public static void main(String[] args) {
son m = new son();
if(m instanceof father) {
((father)m).method1();
/* 형변환을 해서 리모컨을 바꿔도 method1() 리모컨은
son의 method1()을 호출하여 결과 "2"를 출력한다.
*/
}
}
}
그러므로 System.out.println(참조변수.toStirng);을 toString을 생략한
System.out.println(참조변수);를 호출하였을 때 toString이 호출 되는 이유는
println() 메서드의 내부 println(Object x) 메서드가 String valuOf(Object obj)를 호출하고 String valuOf(Object obj)가 obj.toString을 호출하기 때문에 toString을 생략하고 참조변수만 println문에 넣어도 객체에 대한 정보를 얻을 수 있다.