Object toString()

Mjey·2022년 4월 24일
0

JAVA

목록 보기
3/5
post-thumbnail

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 valuOf(Object obj)가 obj.toString을 호출하기 때문에 toString을 생략하고 참조변수만 println문에 넣어도 객체에 대한 정보를 얻을 수 있다.

profile
개발일기📒

0개의 댓글