java.lang 패키지에 속하는 System 클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있습니다.
프로그램 종료, 키보드로부터 입력, 모니터로 출력, 메모리 정리, 현재 시간 읽기, 시스템 프로퍼티 읽기, 환경 변수 읽기등의 일부 기능을 사용할 수 있습니다.
현재 실행하고 있는 프로세스를 강제 종료시키는 역할이며, VM을 강제적으로 종료시킬 때도 있습니다.
exit() 메소드는 현재 실행하고 있는 프로세스를 강제 종료시키는 역할을 합니다.
또한 exit() 메소드는 int 매개값을 지정하도록 되어 있습니다. 이 값을 종료 상태값이라고 합니다.
일반적으로 정상 종료일 경우 0으로 지정하고 비정상 종료일 경우 0이외의 다른값을 줍니다.
System.exit(0); //정상종료
System.exit(1); //비정상종료
System.exit()
은 어떤 값을 주더라도 종료가 되는데, 만약 특정 값이 입력되었을 경우에만 종료하고 싶다면 SecurityManager를 직접 설정해서 종료 상태값을 확인하면 됩니다.
System.exit()가 실행된 후 SecurityManager가 입력되지 않으면 SecurityException을 발생시켜 System.exit()를 호출한 곳에서 예외 처리를 할 수 있도록 해줍니다.
만약, 그렇지않고 checkExit()
이 정상적으로 실행되면 JVM은 종료가 됩니다.
예시를 살펴보겠습니다.
System.setSecurityManager(new SecurityManager() {
@Override
public void checkExit(int status) {
int(status != 5){
throws new SecurityException();
}
}
});
사용하는 전체 코드를 보겠습니다.
public class ExitExample {
public static void main(String[] args) {
//보안 관리자 설정
System.setSecurityManager(new SecurityManager(){
@Override
public void checkExit(int status) {
if(status != 5) {
throw new SecurityException(); // status가 5가되면 프로세스 종료
}else {
System.out.println("시스템 종료!");
}
}
});
for(int i=0; i<10; i++) {
System.out.println(i);
try { //try catch문 미 실행 시 오류
System.exit(i); // i 가 5가 될때 프로세스 종료
}catch(SecurityException e) {}
}
}
}
System.exit()
을 사용하면 즉시 해당 프로세스가 파괴되기에, 그 이후에 정의된 코드 문장들은 실행되지 않습니다.
그렇기에 보여지는 결과는 main()에서 return하는 것과 비슷할지 몰라도, 사실 exit()의 호출은 그리 좋은 방법은 아닙니다.
비정상적인 종료:
System.exit()는 프로그램을 강제로 종료시키기 때문에, 실행 중인 스레드나 오픈된 리소스들이 제대로 정리되지 않을 수 있습니다. 이로 인해 데이터의 손실이나 리소스 누수와 같은 문제가 발생할 수 있습니다.
(멀티스레드 환경에서 문제가 될 수도 있습니다)
테스트의 어려움:
JUnit과 같은 테스트 프레임워크를 사용하여 코드를 테스트할 때, System.exit()가 호출되면 테스트 실행이 갑자기 종료되어 정확한 테스트 결과를 얻기 어렵습니다.
재사용성의 저하:
System.exit()를 포함하고 있는 코드는 재사용하기 어렵습니다. 다른 프로젝트나 모듈에서 해당 코드를 사용하려고 할 때, System.exit()로 인해 예기치 않은 종료가 발생할 수 있습니다.
서버 환경에서의 문제:
웹 서버와 같은 환경에서 실행되는 애플리케이션의 경우, System.exit() 호출로 인해 서버 전체가 종료될 수 있어, 다른 애플리케이션에도 영향을 줄 수 있습니다.
종료 코드의 문제:
System.exit()는 종료 코드를 반환합니다. 이 종료 코드가 예상과 다르게 설정될 경우, 시스템이나 외부 프로그램에서 잘못 해석할 수 있습니다.
따라서, System.exit()
의 사용은 특별한 경우가 아니라면 가급적 피하는 것이 좋습니다.
프로그램의 정상적인 종료를 위해서는, 메인 메서드가 자연스럽게 반환되도록 하고, 필요한 모든 리소스의 정리와 종료 처리를 수행해야 합니다.