[Java] System.out.println() 분석하기

👑 System.out.println()

System.out.println()은 아마도 Java를 사용하면서 가장 많이 쓰이는 메서드 중 하나일 것이다.

단순히 콘솔에 텍스트를 출력하는 이 메서드는 간단해 보이지만, 내부적으로는 복잡한 동작을 수행한다.

println() 앞의 System.out.이 무엇인지, Systemout이 각각 무엇인가를 이해하려면

먼저 Java의 packageimport에 대한 이해가 필요하다.

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World!!");
    }
}



👑 package란?

package는 Java 클래스와 인터페이스를 논리적으로 그룹화한 공간이다. 서로 관련된 클래스들끼리

그룹화시켜 놓음으로써 효율적으로 클래스를 관리할 수 있게 된다. 또한, 서로 다른 패키지에 같은 이름의

클래스가 존재하는 것을 가능하게 해 다른 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 막을 수 있다.


사실 클래스의 진짜 이름은 패키지명을 포함한 것이다. 예를 들면, Java의 Math 클래스의 실제 이름은

java.lang.Math이다. 이는 java.lang패키지에 속한 Math.class라는 의미이다. 따라서, 같은

이름의 클래스라도 다른 패키지에 속한다면, 구별이 가능하게 되는 것이다.


패키지의 특징

  • 모든 클래스는 반드시 하나의 패키지에 속해야 한다.

    • 소스 파일 작성 시 패키지를 지정하지 않은 클래스는 자동적으로 Unnamed Package에 속한다.
  • 패키지는 .을 사용하여 계층구조로 구성이 가능하다.

    • 폴더 안에 다른 폴더가 들어갈 수 있는 것처럼, 패키지 역시 다른 패키지를 포함할 수 있다.

    • java.lang 패키지에서 langjava의 하위 패키지이다.

  • 물리적으로 패키지는 하나의 디렉토리이다.



💡 java.lang 패키지

java.lang 패키지는 자바에서 가장 기본적이고 중요한 클래스들이 포함된 패키지로, 모든 Java

프로그램에 자동으로 포함된다. String, System 등 자주 사용되는 클래스들이 이 패키지에 속한다.

이 패키지는 묵시적으로 모든 소스파일에 포함되므로, 별도의 import문 작성 없이 사용 가능하다.

( 모든 파일에는 묵시적으로 아래와 같이 import문이 선언되어 패키지명을 생략할 수 있다. )

import java.lang.*;

👉🏼 java.lang 패키지



👑 import문

클래스의 실제 이름은 패키지명을 포함한 것이며, 다른 패키지의 클래스를 사용하려면

패키지명이 포함된 클래스 이름을 사용해야 한다. 예를 들어:

public class Main {
    public static void main(String[] args) {
        java.util.Scanner sc = new java.util.Scanner(System.in);
        // 패키지명을 포함한 클래스 이름을 사용
        // ...
    }
}

하지만, 매번 위와 같이 패키지명을 붙여 작성하기엔 가독성이 떨어지고, 코드가

복잡해 보이게 된다. 이를 해결하기 위해 import문을 사용할 수 있으며, 클래스의 코드를

작성하기 전 import문으로 사용하려는 클래스의 패키지를 명시하면 패키지명을 생략하고

클래스를 사용할 수 있게 된다.


import 문을 사용함으로써 컴파일러는 해당 클래스가 어느 패키지에 속하는지 알게 되며,

컴파일 시에 자동으로 패키지명을 추가하여 컴파일된다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // ...
    }
}



👑 정리

이제 System.out.println()를 분석하기 위한 모든 개념을 알게 되었다.

  • System 클래스

    • System 클래스는 java.lang 패키지에 포함된 클래스로 자동으로 import 된다.

    • System 클래스의 구조:

    package java.lang;
    
    public final class System {
        public static final PrintStream out; // 정적 필드
    
        // ...
    }
    


  • out 필드

    • public static final PrintStream out;

    • System 클래스의 정적 필드이다. 이 필드는 콘솔 출력을 담당하는 객체이다.

    • java.io.PrintStream 객체를 참조한다.


  • println() 메서드

    • PrintStream 객체의 println 메서드를 호출



System (java.lang)
   |
   --> out (PrintStream 객체)
          |
          --> println("Hello, World!")


System.out.println() 메서드는 단순해 보이지만, Java 프로그램의 기본 구조와 동작 원리가

잘 담겨있는 체계적으로 설계된 코드이다.

Categories:

Updated:

Leave a comment