Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby 프로그램 실행을 조기에 종료하는 방법 – exit, abort, break까지 한 번에 정리

Ruby 프로그램을 원하는 시점에 일찍 종료하려면 어떻게 해야 할까요?

일반적으로 프로그램은 모든 명령어를 처리할 때까지 실행됩니다. 아니면 처리되지 않은 예외(exception)가 발생해 프로그램이 비정상적으로 끝나기 전까지만요.

하지만 항상 실행 상태를 유지할 필요가 없는 Ruby 프로그램을 작성한다면, 여러 가지 이유로 프로그램을 조기에 종료하고 싶어질 수 있습니다.

이럴 때 사용하는 것이 바로 exit 메서드입니다.

그렇다면 이 exit 메서드는 어떻게 동작할까요?

지금부터 하나씩 살펴보겠습니다.

프로그램을 멈추는 다양한 방법

exit를 호출한다고 해서 프로그램이 즉시 멈추는 것은 아닙니다.

실제로 일어나는 과정은 다음과 같습니다:

Ruby는 SystemExit 예외를 발생시키는데, 이를 통해 프로그램의 다른 부분들이 종료되기 전에 정리 작업(cleanup)을 수행할 기회를 얻게 됩니다.

다음 코드를 직접 실행해 확인해 볼 수 있습니다:

begin
  exit
rescue SystemExit
  p 123
end

이 코드는 프로그램이 종료되기 전에 123을 출력합니다.

만약 이러한 정리 과정 없이 곧바로 종료하고 싶다면 exit!를 사용하면 됩니다.

예시는 다음과 같습니다:

begin
  exit!
rescue SystemExit
  p 123
end

이번에는 프로그램이 끝나기 전에 123이 출력되지 않는다는 점에 주목하세요.

또 하나 유용한 메서드가 있습니다.

바로 abort입니다.

이 메서드를 사용하면 오류 메시지를 함께 출력하면서 프로그램을 종료할 수 있습니다.

사용법은 아주 간단합니다:

abort "No Bacon Left"

이 코드는 사실상 다음과 동일하게 동작합니다:

warn "No Bacon Left!"
exit 1

warn 메서드는 오류 메시지를 표준 에러(standard error) 스트림으로 출력합니다.

그런데 exit에 전달된 이 1이라는 인자는 대체 무슨 의미일까요?

바로 다음 주제입니다!

종료 상태 코드(Status Code) 이해하기

프로그램이 종료될 때, Ruby 프로그램이든 어떤 프로그램이든 항상 종료 상태 코드(exit status code)를 남깁니다.

꼭 알아두어야 할 핵심 내용은 다음과 같습니다:

  • 상태 코드가 0이면 프로그램이 정상적으로 종료되었음을 의미합니다.
  • 0이 아닌 다른 상태 코드는 오류 상황을 나타내는 신호로 사용됩니다.
  • 0이 아닌 상태 코드를 반환했을 때의 실제 효과는 현재 실행 환경에 따라 달라집니다.

이 상태 코드가 유용한 이유는 운영체제나 다른 프로그램들이 이 값을 활용해 모니터링, 로깅, 심지어 실패한 프로그램의 자동 재시작까지 수행할 수 있기 때문입니다.

Linux에서는 echo $? 명령어로 마지막에 실행된 프로그램의 종료 상태 코드를 확인할 수 있습니다.

다시 Ruby로 돌아와서:

exit를 호출하면 상태 코드는 기본적으로 0으로 설정됩니다.

인자를 통해 다른 상태 코드를 지정할 수도 있습니다.

바로 이 때문에 abort를 호출하면 상태 코드가 1로 설정되는 것입니다. abort는 애초에 오류를 알리기 위한 용도로 설계된 메서드이기 때문입니다.

루프(loop)만 멈추기

프로그램 전체가 아니라 특정 반복문만 종료하고 싶다면 다른 방법을 사용해야 합니다.

이럴 때는 break 키워드를 사용하세요:

while 1 == 1
  break
end

이 키워드는 while 문뿐만 아니라 블록(block) 안에서도 동일하게 작동합니다.

메서드(method) 종료하기

Ruby 메서드는 자연스럽게 마지막 코드 줄에서 종료됩니다.

하지만 그보다 일찍 종료하고 싶다면…

return 키워드를 사용하세요.

예시:

def apples
  return "I had my two apples today"

  "bacon"
end

이 코드에서는 return으로 인해 조기 종료되므로 "bacon" 부분은 절대 실행되지 않습니다.

보너스: 무한 루프(infinite loop) 멈추기

누구나 겪는 일입니다.

카운터 증가 코드를 깜빡 잊고 무한 루프를 만들어 버린 적이 있으실 겁니다.

이런 경우 다음 키 조합을 눌러 프로그램을 강제로 멈출 수 있습니다:

CTRL+C

마무리

이번 글에서는 Ruby의 exit 메서드와 abort 메서드, 종료 상태 코드의 의미, 그리고 루프에서 빠져나오는 방법까지 알아보았습니다.

핵심을 정리하면 다음과 같습니다:

  • exit: 정상 종료(상태 코드 0), SystemExit 예외를 통한 정리 작업 허용
  • exit!: 정리 작업 없이 즉시 종료
  • abort: 오류 메시지 출력 후 상태 코드 1로 종료
  • break: 루프 또는 블록 탈출
  • return: 메서드 조기 종료

더 많은 분들이 이 글을 읽을 수 있도록 공유 부탁드립니다.

읽어주셔서 감사합니다! 🙂