HOWTO · Csharp
C#에서 콘솔 응용 프로그램 종료
C# 콘솔 애플리케이션을 정상적으로 종료하려면 Main에서 반환하고, 다른 메서드에서 즉시 프로세스를 종료해야 할 때는 Environment.Exit() 메서드를 호출합니다.
이 페이지의 내용
C# 콘솔 애플리케이션의 작업을 마친 뒤 종료하려면 Main에서 반환하세요. 다른 메서드에서 프로세스를 즉시 중단해야 할 때만 Environment.Exit()을 사용하세요. Main에서 정수를 반환하거나 Environment.Exit(int)에 정수를 전달하면 프로세스 종료 코드가 지정됩니다. 콘솔에 출력되는 텍스트는 종료 코드와 별개입니다.
Main에서 반환하여 애플리케이션 종료하기
return 문은 현재 메서드를 끝냅니다. 이 문으로 Main이 끝나면 애플리케이션의 정상 실행이 종료되고, return 뒤의 문장은 실행되지 않습니다. 중첩된 메서드에서 반환하면 제어가 호출한 쪽으로 돌아갈 뿐이므로, 그 자체로 애플리케이션이 종료되지는 않습니다. 일반적인 완료 상황에서는 Main에서 반환하는 방식을 우선하세요. 정상적인 제어 흐름을 따르며, 주변의 finally 블록과 리소스 정리도 실행할 수 있습니다.
void Main()에서는 값을 반환하지 않고 끝내기 위해 return;을 사용할 수 있습니다. int Main()에서는 종료 코드를 반환할 수 있습니다. 다음 완전한 예제는 상태 메시지를 출력한 뒤 관례적인 성공 코드를 반환합니다. 제공된 런타임 관찰에서는 Work completed.가 출력되고 종료 코드는 0이었습니다.
다음 예제를 실행하세요:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
using System;
class Program
{
static int Main()
{
Console.WriteLine("Work completed.");
return 0;
}
}
Work completed.
return 0;은 Main을 끝내고 운영 체제 또는 호출한 프로세스에 0을 전달합니다. 실패를 알리려면 0이 아닌 코드를 반환하세요. 각 0이 아닌 값의 정확한 의미는 프로그램이나 호출자가 정합니다.
Environment.Exit()으로 어떤 메서드에서든 종료하기
Environment.Exit(int)은 Main이 아닌 메서드에서도 프로세스를 종료할 수 있습니다. 전달된 정수 종료 코드와 함께 프로세스를 즉시 끝내며 호출한 쪽으로 돌아가지 않습니다. 정상적인 정리 절차를 거칠 수 없는 상황, 예를 들어 의도적으로 즉시 종료해야 하는 경우에 사용하세요. 일반적인 오류 처리는 대개 문제를 보고하고 Main에서 적절한 코드를 반환하는 방식으로 수행해야 합니다.
다음 완전한 예제는 Main이 아닌 StopApplication 메서드에서 Environment.Exit(0)을 호출합니다:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
using System;
class Program
{
static void Main()
{
StopApplication();
Console.WriteLine("This line is not reached.");
}
static void StopApplication()
{
Console.WriteLine("Stopping now.");
Environment.Exit(0);
}
}
호출은 종료 코드 0을 전달하고 StopApplication이 반환하기 전에 프로세스를 끝내므로, Main의 다음 줄은 실행되지 않습니다. 제공된 런타임 관찰은 위의 Main 예제를 대상으로 하며 이 예제는 대상으로 하지 않습니다. Environment.Exit(1);과 같이 호출하면 종료 코드 1이 전달됩니다. 정수는 운영 체제 또는 호출한 프로세스로 전달되며, Console.WriteLine으로 출력한 메시지는 콘솔 출력일 뿐입니다. 이 메서드는 System.Environment의 정적 메서드이므로 using System;을 사용하는 파일에서는 직접 호출할 수 있습니다.
종료 코드 선택과 정리 작업 이해하기
관례적으로 성공은 0, 실패는 0이 아닌 값으로 나타냅니다. 이는 모든 애플리케이션에 보편적으로 적용되는 대응표가 아니라 관례입니다. 스크립트, 서비스 관리자 또는 다른 호출자가 해석해야 하는 코드는 문서화하세요. Main에서 정수를 반환하거나 Environment.Exit(int)을 호출하면 모두 프로세스 종료 코드를 전달합니다. 어느 방식도 값을 자동으로 출력하지 않으므로, 사용자에게 설명이 필요하다면 별도의 진단 메시지를 출력하세요.
프로그램을 정상적으로 마칠 수 있다면 Main에서 반환하는 방식을 우선하세요. 메서드가 정상적으로 반환되면 try 문을 벗어날 때 finally 블록이 실행되고, using 선언과 같은 범위가 지정된 리소스는 해당 범위가 끝날 때 해제될 수 있습니다. Environment.Exit()은 프로세스를 즉시 중단하므로 일반적인 스택 되감기가 일어나지 않으며, 대기 중인 finally 블록과 관리되는 리소스 정리도 건너뜁니다. 즉시 종료하기 전에 정상적인 제어 흐름으로 중요한 리소스를 플러시하거나 닫으세요. 데이터를 보존하거나 리소스를 해제하기 위해 정리가 필요하다면 이 메서드를 피하세요.
프로세스 종료와 루프의 break, 예외, Ctrl+C 구분하기
break 문은 가장 가까운 루프나 switch를 빠져나옵니다. 실행은 해당 구조 다음 문장에서 계속됩니다. 루프를 빠져나온 뒤 프로그램을 끝내려면 실행이 Main의 끝에 도달하게 하거나, 루프 뒤에서 Main을 반환하세요.
예외를 던지면 제어가 일치하는 예외 처리기로 이동합니다. 처리기가 예외를 잡고 실행이 계속되면 프로세스는 종료된 것이 아닙니다. 조건을 처리한 다음 애플리케이션을 끝내야 한다면 정상적인 반환 경로와 적절한 종료 코드를 선택하세요. 처리되지 않은 예외는 프로세스를 끝낼 수 있지만, 종료를 위한 지름길로만 예외를 사용하면 의도한 제어 흐름과 오류 처리가 불분명해집니다.
Ctrl+C는 콘솔에서 보내는 취소 요청이지, 정상 종료를 보장하는 명령이 아닙니다. 프로그램은 Console.CancelKeyPress를 통해 이 요청을 감지할 수 있습니다. 프로세스가 즉시 중단될지, 처리기가 기본 동작을 취소할지는 이벤트 처리 방식과 호스트 환경에 따라 달라집니다. 취소 후 정리가 필요하다면 요청을 기록하고, 주 제어 흐름에서 작업을 멈춘 뒤 정상적으로 반환하세요.