[JAVA] System.exit() 개념 및 동작원리 + 왜 사용을 자제해야할까?

Benjamin·2023년 10월 27일
2

JAVA

목록 보기
28/28

java.lang 패키지에 속하는 System 클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있습니다.
프로그램 종료, 키보드로부터 입력, 모니터로 출력, 메모리 정리, 현재 시간 읽기, 시스템 프로퍼티 읽기, 환경 변수 읽기등의 일부 기능을 사용할 수 있습니다.

프로그램 종료 System.exit( )

현재 실행하고 있는 프로세스를 강제 종료시키는 역할이며, VM을 강제적으로 종료시킬 때도 있습니다.

exit() 메소드는 현재 실행하고 있는 프로세스를 강제 종료시키는 역할을 합니다.
또한 exit() 메소드는 int 매개값을 지정하도록 되어 있습니다. 이 값을 종료 상태값이라고 합니다.
일반적으로 정상 종료일 경우 0으로 지정하고 비정상 종료일 경우 0이외의 다른값을 줍니다.

System.exit(0); //정상종료
System.exit(1); //비정상종료

System.exit()은 어떤 값을 주더라도 종료가 되는데, 만약 특정 값이 입력되었을 경우에만 종료하고 싶다면 SecurityManager를 직접 설정해서 종료 상태값을 확인하면 됩니다.
System.exit()가 실행된 후 SecurityManager가 입력되지 않으면 SecurityException을 발생시켜 System.exit()를 호출한 곳에서 예외 처리를 할 수 있도록 해줍니다.
만약, 그렇지않고 checkExit()이 정상적으로 실행되면 JVM은 종료가 됩니다.

예시를 살펴보겠습니다.

종료 상태 값이 5가 입력되면 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()의 호출은 그리 좋은 방법은 아닙니다.

  1. 비정상적인 종료:
    System.exit()는 프로그램을 강제로 종료시키기 때문에, 실행 중인 스레드나 오픈된 리소스들이 제대로 정리되지 않을 수 있습니다. 이로 인해 데이터의 손실이나 리소스 누수와 같은 문제가 발생할 수 있습니다.
    (멀티스레드 환경에서 문제가 될 수도 있습니다)

  2. 테스트의 어려움:
    JUnit과 같은 테스트 프레임워크를 사용하여 코드를 테스트할 때, System.exit()가 호출되면 테스트 실행이 갑자기 종료되어 정확한 테스트 결과를 얻기 어렵습니다.

  3. 재사용성의 저하:
    System.exit()를 포함하고 있는 코드는 재사용하기 어렵습니다. 다른 프로젝트나 모듈에서 해당 코드를 사용하려고 할 때, System.exit()로 인해 예기치 않은 종료가 발생할 수 있습니다.

  4. 서버 환경에서의 문제:
    웹 서버와 같은 환경에서 실행되는 애플리케이션의 경우, System.exit() 호출로 인해 서버 전체가 종료될 수 있어, 다른 애플리케이션에도 영향을 줄 수 있습니다.

  5. 종료 코드의 문제:
    System.exit()는 종료 코드를 반환합니다. 이 종료 코드가 예상과 다르게 설정될 경우, 시스템이나 외부 프로그램에서 잘못 해석할 수 있습니다.

따라서, System.exit()의 사용은 특별한 경우가 아니라면 가급적 피하는 것이 좋습니다.
프로그램의 정상적인 종료를 위해서는, 메인 메서드가 자연스럽게 반환되도록 하고, 필요한 모든 리소스의 정리와 종료 처리를 수행해야 합니다.

0개의 댓글