[Java] System 클래스

Bam·2024년 3월 10일
1

Java

목록 보기
51/98
post-thumbnail

지난 포스트에 이어 java.base 모듈java.lang 패키지의 클래스인 System 클래스에 대해 알아보겠습니다.

아주 낮설은 클래스가 아닌게, 우리가 주구장창해온 콘솔 출력인 System.out.println()을 사용할 때 System 클래스를 호출하고 사용하기 때문에 조금은 익숙한 느낌이 들지도 모릅니다.


System 클래스

System 클래스는 자바 코드를 통해 운영체제의 기능을 사용할 수 있게 만들어줍니다.

자바는 운영체제가 아닌 운영체제 위의 JVM에서 구동되기 때문에 운영체제에 대한 모든 기능을 끌어오기가 어렵습니다. 그래서 이를 편하게 만들어주고자 System 클래스가 등장하게 되었습니다.

System 클래스의 대표적인 기능으로는 콘솔 입출력, 시간 취득, 프로세스 종료(프로그램)가 있습니다.

모든 멤버보다는 주요한 몇 가지 멤버들을 뽑아서 소개하기 때문에 전체적인 내용은 공식 문서를 함께 참조하시면 좋습니다.


System 클래스의 필드

System 클래스의 필드(멤버 변수)에는 out, in, err이 있습니다.

out, err

outerr을 묶은 이유는 둘 다 콘솔 출력과 관련되어있는 필드이기 때문입니다.

out 필드는 콘솔에 문자열을 출력하기 위한 필드입니다. 우리가 정말 자주 사용하는 System.out.println()System 클래스에서 out 필드를 호출하고, out 필드를 통해 PrintStream이라는 클래스의 println() 메소드를 호출하는 과정이 담겨져있는 문장이었습니다.

err 필드도 콘솔에 문자열을 출력하기 위한 필드인데, 이름 그대로 에러를 출력하기 위한 필드입니다. out과는 다르게 err로 출력하는 문자열은 빨간색 글씨로 나타나게 됩니다.

public class Main {
    public static void main(String[] args) {
        System.out.println("문자열 출력");
        System.err.println("에러 문자열 출력");
    }
}

in

in 필드는 키보드 입력을 받아서 읽기위한 필드입니다. in 필드에서 접근할 수 있는 대표적인 메소드에는 read()가 있습니다.

read()는 입력받은 키를 정수형 키 코드(아스키 코드)로 변환하는 메소드입니다.

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        int keyCode = 0;

        System.out.print("키 입력: ");
        keyCode = System.in.read();

        System.out.println(keyCode);
    }
}

참고 아스키코드 표
이미지 출처


System 클래스 메소드

System 클래스에는 수많은 메소드가 있습니다. 이들 중 비교적 자주 등장하는 프로세스 종료, 시간 취득, 시스템 정보 취득에 관련된 메소드들을 알아보고 넘어가겠습니다. 더 많은 메소드는 공식 문서를 참조해주세요.

exit()

System.exit()는 프로세스를 종료하는 메소드입니다.

자바 프로그램을 실행하면 JVM을 통해 프로세스를 생성하고, 이 프로세스가 main()을 호출하면서 프로그램이 실행되는데, exit()는 이러한 프로세스를 (강제)종료하는데 사용됩니다.

System.exit(int status);

여기서 매개변수로 정수형 status를 받는데, 이 매개변수를 종료 상태값이라고 부릅니다. 종료 상태값에는 -1, 0, 1 셋 중 하나가 올 수 있습니다. 여기서 0는 정상 종료, -1, 1은 비정상 종료를 의미합니다.

다음은 for문을 10번 도는 도중 루프 변수 i가 5에 도달하면 프로그램을 정상 종료시키는 코드입니다.

public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(i);

            if (i == 5) {
                System.exit(0);
            }
        }
    }
}

여기서 우리가 새로 알게되는 사실이 있죠? 그동안 콘솔에서 main()을 성공적으로 수행했을 때 마지막에 나오는 Process finished with exit code 0가 이제는 무슨 뜻인지 우리는 알 수 있게 되었습니다.

currentTimeMillis(), nanoTime()

currentTimeMillis()는 1970년 1월 1일 0시에서 시작해 현재 시간까지의 경과를 밀리초로 반환하는 메소드입니다. 밀리초는 1/1000초를 의미합니다.

여기서 1970년 1월 1일 0시는 유닉스 시간이라는 시간 표현 방식입니다. 유닉스 시간은 1970년 1월 1일 0시부터 시간을 초 단위로 센 것을 의미합니다. 유닉스 계열 컴퓨터에서는 자주 등장하는 시간 개념입니다.

public class Main {
    public static void main(String[] args) {
        System.out.println(System.currentTimeMillis());
    }
}

이 결과는 언제 실행했느냐에 따라서 계속 바뀌기 때문에 결과 값이 다르더라도 이상한 것이 아닙니다.

nanoTime()도 또한 유닉스 시간으로 부터 현재까지 경과된 시간을 반환하는 메소드입니다. 다만 currentTimeMillis()와 다르게 1/10^9초라는 더 작은 단위를 다룹니다.

일반적으로 두 메소드는 시간 자체를 취득하기보다는 특정 구간의 시작과 끝 시간을 구해 프로그램(알고리즘, 함수 등)의 실행 시간을 측정하는데 사용됩니다.

getProperty()

getProperty()는 시스템 프로퍼티를 취득하는 메소드입니다.

시스템 프로퍼티는 자바 프로그램 실행시 자동으로 설정되는 시스템의 속성을 의미합니다. 시스템 프로퍼티에는 운영체제 정보, 사용자 정보, 자바 버전 등의 정보가 해당됩니다.

메소드의 매개변수에 문자열 형태로 시스템 프로퍼티 를 전달하는데요. 주요한 프로퍼티들은 다음과 같습니다.

설명
os.name운영체제 이름
user.name사용자 이름
user.home사용자 홈 디렉토리 경로
user.dir현재 디렉토리 경로
java.specification.version자바 버전
java.homeJDK 디렉토리 경로
public class Main {
    public static void main(String[] args) {
        String osName = System.getProperty("os.name");	//운영체제 이름
        String javaVersion = System.getProperty("java.specification.version");		//자바 버전

        System.out.println(osName);
        System.out.println(javaVersion);
    }
}

제 운영체제 Windows 11과 현재 사용중인 Java 17 버전에 대한 정보가 출력이 되었습니다.

0개의 댓글