Programing/Java

System.out.println은 어떻게 동작할까? ( toString Method 포함 )

BeomJun.Kwon 2023. 7. 20. 00:40

 

System.out.println & toString Method ( JAVA )

 

 

우리가 평상시 콘솔에 테스트 및 데이터를 띄워보기 위해서 많이쓰는 방법중 하나가 'System.out.println' 입니다.

하지만 대부분 System.out.println이 어떻게 동작하는지 알지 못하고 쓰는 사람들이 많습니다.

물론 중요한 내용은 아닙니다만 궁금한 사람이 있을 수 있기에 글을 남깁니다.

( 저도 궁금하여 파해쳐 보았습니다.. )

 

 

System.out.println은 System 클래스에서 작성되어진 함수로써 out(PrintStream)을 가지고 있고 PrintStream 클래스에서 println이 구현되어있습니다.

 

 

println 함수를 살펴보면 오버로딩으로 파라미터를 Object, String, char, double 등 다양하게 가져옵니다.


/** PrintStream 클래스의 println 구현부분의 일부분 입니다. */

/**
 * Prints an array of characters and then terminate the line.  This method
 * behaves as though it invokes {@link #print(char[])} and
 * then {@link #println()}.
 *
 * @param x  an array of chars to print.
 */
public void println(char x[]) {
    synchronized (this) {
        print(x);
        newLine();
    }
}

/**
 * Prints a String and then terminate the line.  This method behaves as
 * though it invokes {@link #print(String)} and then
 * {@link #println()}.
 *
 * @param x  The {@code String} to be printed.
 */
public void println(String x) {
    synchronized (this) {
        print(x);
        newLine();
    }
}

/**
 * Prints an Object and then terminate the line.  This method calls
 * at first String.valueOf(x) to get the printed object's string value,
 * then behaves as
 * though it invokes {@link #print(String)} and then
 * {@link #println()}.
 *
 * @param x  The {@code Object} to be printed.
 */
public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}

 

 

이후 println 함수의 내부 코드인 print(s) 로 들어가게 되는데요 해당 함수는 println 함수와 동일하게 PrintStream에 구현되어있고 println도 오버로딩으로 각각의 파라미터를 받아서 처리합니다.

 

/** println 예시입니다. */

public void print(long l) {
    write(String.valueOf(l));
}

public void print(float f) {
    write(String.valueOf(f));
}

 

이처럼 각각의 데이터 타입들을 String으로 변환해 주는 과정을 거쳐서 콘솔에 표출되도록 구현되어있습니다.

하지만 위에 Object를 파라미터로 받는 println만 다르게 구현되어있는데요 여기에서 toString과 관련된것을 확인 할 수 있습니다.

 

 

Object를 파라미터로 받는 String.valueOf(x) 함수 구현 코드입니다.

/** 
    Object 데이터 타입의 valueOf 메소드
*/
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

/** 
    int 데이터 타입의 valueOf 메소드
*/
public static String valueOf(int i) {
    return Integer.toString(i);
}

 

이처럼 Object는 obj.toString()을 사용하여 콘솔에 나타나도록 설계되어있어 우리가 System.out.println에 생성된 인스턴스를 넣을 시 toString 메소드가 나타나는것을 알 수 있습니다. 하여 우리가 클래스에 toString을 오버라이드하여 System.out.println에 아무것도 없이 인스턴스만 집어넣어도 toString이 출력되는것을 확인 할 수있습니다.

 

 

간단한 예시입니다.

public class Test {

    private String test1 = "Hello World";

    public void setTest1(String test1) {
        this.test1 = test1;
    }

    public String getTest1() {
        return test1;
    }

    @Override
    public String toString() {
        return "TEST : " + test1;
    }
    
    public static void main(String[] args) {
    	 Test test = new Test();
         System.out.println(test);
    }
    
}

 

해당 main 메소드를 실행해보면

TEST : Hello World 결과가 나올것입니다.

 

 

 

 

'Programing > Java' 카테고리의 다른 글

명령 프롬프트(cmd, terminal) java & javac 차이점  (0) 2022.08.15
JNDI 작동원리 및 적용법  (0) 2022.08.05
(Class)XPath 사용법  (0) 2022.08.03
JVM 작동 원리  (0) 2022.07.08
Instanceof ( 연산자 )  (0) 2022.03.24