티스토리 뷰
주의 사항!
- 이 글은 제가 직접 공부하는 중에 작성되고 있습니다.
- 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
- 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.
자바 프로그램은 운영체제상에서 바로 실행되는 것이 아니라 JVM 위에서 실행됩니다. 따라서 운영체제의 모든 기능을 자바 코드로 직접 접근하기란 어렵습니다. 하지만 java.lang 패키지에 속하는 System 클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있습니다. 즉, 프로그램 종료, 키보드로부터 입력, 모니터 출력, 메모리 정리, 현재 시간 읽기, 시스템 프로퍼티 읽기, 환경 변수 읽기 등이 가능합니다. System 클래스의 모든 필드와 메서드는 정적(static) 필드와 정적(static) 메서드로 구성되어 있습니다.
1. 프로그램 종료 : exit()
경우에 따라서는 강제적으로 JVM을 종료시킬 때도 있습니다. 이때 System 클래스의 exit() 메서드를 호출하면 됩니다. exit() 메서드는 현재 실행하고 있는 프로세스를 강제 종료시키는 역할을 합니다. exit() 메서드는 int 매개 값을 지정하도록 되어 있는데, 이 값을 종료 상태 값이라고 합니다. 일반적으로 정상 종료일 경우 0으로 지정하고 비정상 종료일 경우 0 이외의 다른 값을 줍니다.
System.exit(0);
어떤 값을 주더라도 종료가 되는데, 만약 특정 값이 입력되었을 경우에만 종료하고 싶다면 자바의 보안 관리자를 직접 설정해서 종료 상태 값을 확인하면 됩니다. System.exti()가 실행되면 보안 관리자의 checkExit() 메서드가 자동 호출되는데, 이 메서드에서 종료 상태 값을 조사해서 특정 값이 입력되지 않으면 SecurityException을 발생시켜 System.exit()를 호출한 곳에서 예외 처리를 할 수 있도록 해줍니다. checkExit()가 정상적으로 실행되면 JVM은 종료됩니다.
다음은 종료 상태 값으로 5가 입력되면 JVM을 종료하도록 보안 관리자를 설정합니다.
//보안 관리자 설정
System.setSecurityManager(new SecurityManager() {
@Override
public void checkExit(int status) {
if(status != 5) {
throw new SecurityException();
}
}
});
//Main.java
package Example;
public class Main {
public static void main(String[] args) {
//보안 관리자 설정
System.setSecurityManager(new SecurityManager() {
@Override
public void checkExit(int status) {
if(status != 5) {
throw new SecurityException();
}
}
});
for(int i = 0; i < 10; i++) {
System.out.println(i);
try {
System.exit(i);
} catch(SecurityException e) {
System.out.println("상태 정보가 5가 아닙니다. 프로그램을 종료하지 않습니다.");
}
}
}
}
/*
실행결과
0
상태 정보가 5가 아닙니다. 프로그램을 종료하지 않습니다.
1
상태 정보가 5가 아닙니다. 프로그램을 종료하지 않습니다.
2
상태 정보가 5가 아닙니다. 프로그램을 종료하지 않습니다.
3
상태 정보가 5가 아닙니다. 프로그램을 종료하지 않습니다.
4
상태 정보가 5가 아닙니다. 프로그램을 종료하지 않습니다.
5
*/
2. 쓰레기 수집기 실행 : gc()
자바는 개발자가 메모리를 직접 코드로 관리하지 않고 JVM이 알아서 자동으로 관리합니다. JVM은 메모리가 부족할 때와 CPU가 한가할 때에 쓰레기 수집기(Garbage Collector)를 실행시켜 사용하지 않는 객체를 자동으로 제거합니다.
쓰레기 수집기는 개발자가 직접 코드로 실행시킬 수는 없고, JVM에게 가능한 한 빨리 실행해 달라고 요청할 수는 있습니다. 이것이 System.gc() 메서드입니다. System.gc() 메서드가 호출되면 쓰레기 수집기가 바로 실행되는 것은 아니고, JVM은 빠른 시간 내에 실행시키기 위해 노력합니다.
쓰레기가 생길 때마다 쓰레기 수집기가 동작한다면 정작 수행되어야 할 프로그램의 속도가 떨어지기 때문에 성능 측면에서 좋지 않습니다. 그리고 메모리가 충분하다면 굳이 쓰레기 수집기를 실행할 필요가 없습니다. gc() 메서드는 메모리가 열악하지 않은 환경이라면 거의 사용할 일이 없습니다.
3. 현재 시각 읽기 : currentTimeMillis(), namoTime()
System 클래스의 currentTimeMillis() 메서드와 nanoTime() 메서드는 컴퓨터의 시계로부터 현재 시간을 읽어서 밀리세컨드(1/1000초) 단위와 나노세컨드(1e-9초) 단위의 long 값을 리턴합니다.
long time = System.currentTimeMillis();
long time = System.nanoTime();
리턴 값은 주로 프로그램의 실행 소요 시간 측정에 사용됩니다. 프로그램 시작 시 시각을 읽고, 프로그램이 끝날 때 시각을 읽어서 차이를 구하면 프로그램 실행 소요 시간이 나옵니다. 다음 예제는 for문을 사용해서 1부터 1000000까지의 합을 구하는데 걸린 시간을 출력합니다.
//Main.java
package Example;
public class Main {
public static void main(String[] args) {
long time1 = System.nanoTime();
int sum = 0;
for(int i = 1; i <= 1000000; i++) {
sum += i;
}
long time2 = System.nanoTime();
System.out.println("1 ~ 1000000까지의 합 : " + sum);
System.out.println("계산에 " + (time2 - time1) * 1e-9 + "초가 소요되었습니다.");
}
}
/*
실행결과
1 ~ 1000000까지의 합 : 1784293664
계산에 0.0034169초가 소요되었습니다.
*/
4. 시스템 프로퍼티 읽기 : getProperty()
시스템 프로퍼티(system Property)는 JVM이 시작할 때 자동 설정되는 시스템의 속성 값을 말합니다. 예를 들어 운영체제의 종류 및 자바 프로그램을 실행시킨 사용자 아이디, JVM의 버전, 운영체제에서 사용되는 파일 경로 구분자 등이 여기에 속합니다. 시스템 프로퍼티는 키(key)와 값(value)으로 구성되어 있습니다. 대표적인 키와 값에 대한 설명은 다음 표에 나와 있습니다.
키(key) | 설명 | 값(value) |
java.version | 자바의 버전 | 15.0.2 |
javahome | 사용하는 JRE의 파일 경로 | <jdk 설치 경로>\jre |
os.name | Operating system name | Windows 10 |
file.separator | File separator("\" on UNIX) | \ |
user.name | 사용자의 이름 | 사용자 계정 |
user.home | 사용자의 홈 디렉토리 | C:\Users\사용자 계정 |
user.dir | 사용자가 현재 작업 중인 디렉토리 경로 | 다양 |
시스템 프로퍼티를 읽어오기 위해서는 System.getProperty() 메서드를 이용하면 됩니다. 이 메서드는 시스템 프로퍼티의 키 이름을 매개 값으로 받고, 해당 키에 대한 값을 문자열로 리턴합니다.
다음 예제에서는 운영체제 이름, 사용자 이름, 사용자 홈 디렉터리를 알아내고 출력합니다. 그리고 모든 시스템 프로퍼티를 키와 값으로 출력해 보았습니다.
//Main.java
package Example;
import java.util.Properties;
import java.util.Set;
public class Main {
public static void main(String[] args) {
String osName = System.getProperty("os.name");
String userName = System.getProperty("user.name");
String userHome= System.getProperty("user.home");
System.out.println("운영체제 이름 : " + osName);
System.out.println("사용자 이름 : " + userName);
System.out.println("사용자 홈디렉토리 : " + userHome);
System.out.println("---------------------------------------");
System.out.println(" [ key ] value");
System.out.println("---------------------------------------");
Properties props = System.getProperties();
Set keys = props.keySet();
for (Object objKey : keys) {
String key = (String) objKey;
String value = System.getProperty(key);
System.out.println("[ " + key + " ] " + value);
}
}
}
/*
실행결과는 직접 이 코드를 작성해서 확인해 보시는 걸 권합니다.
*/
5. 환경 변수 읽기 : getenv()
대부분의 운영체제는 실행되는 프로그램들에게 유용한 정보를 제공할 목적으로 환경 변수를 제공합니다. 환경 변수는 프로그램상의 변수가 아니라 운영체제에서 이름과 값으로 관리되는 문자열 정보입니다.
자바 프로그램에서는 환경 변수의 값이 필요할 경우 System.getenv() 메서드를 사용합니다. 매개 값으로 환경 변수 이름을 주면 값을 리턴합니다.
다음 예제는 JAVA_HOME 환경 변수의 값을 얻어 와서 출력합니다.
//Main.java
package Example;
public class Main {
public static void main(String[] args) {
String javaHome = System.getenv("JAVA_HOME");
System.out.println("JAVA_HOME : " + javaHome);
}
}
/*
실행결과
JAVA_HOME : C:\Program Files\Java\jdk-16
*/
'공부 일지 > JAVA 공부 일지' 카테고리의 다른 글
자바, String 클래스 (0) | 2021.04.20 |
---|---|
자바, Class 클래스 (0) | 2021.04.20 |
자바, Objects 클래스 (0) | 2021.04.20 |
자바, Object 클래스 (0) | 2021.04.14 |
자바, java.lang 패키지와 java.util 패키지 (0) | 2021.04.14 |