
System.out.println(참조변수); 호출 시 Object.toString이 호출되는 이유
우선 Object클래스의 toString(); 선언부 및 구현부를 살펴보자
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
위의 코드와 같이 Object 클래스의 toString()은 설계도 객체, 클래스 이름, 위치 , 객체의 주소를 반환하는 코드로 구성되어 있다.
System.out.println(); 선언부 및 구현부
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(); } } }
String클래스의 valueOf(); 선언부 및 구현부
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 valueOf(Object obj)가 obj.toString을 호출하기 때문에 toString을 생략하고 참조변수만 println문에 넣어도 객체에 대한 정보를 얻을 수 있다.
'Java' 카테고리의 다른 글
| (Java) StringTokenizer (0) | 2022.09.01 |
|---|---|
| (Java) syntax error: insert } to complete ClassBody (0) | 2022.05.23 |
| (Java) 논리 연산자 &,&& 와 |,|| 차이 (0) | 2022.05.23 |
| (Java)JVM 메모리 구조 (0) | 2022.05.06 |
| (Java)Scanner next(), nextLine 차이 (0) | 2022.05.06 |