(Java) Object toString()

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