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

C++ main()에서 return 문과 exit()의 차이점 완벽 정리

C++에서 프로그램을 종료하는 방법은 크게 return 문exit() 함수 두 가지가 있습니다. 두 방법 모두 프로그램을 끝낼 수 있지만, 동작 방식과 내부 처리 과정에서 중요한 차이가 있습니다. 이 글에서는 각각의 특징과 차이점을 예제 코드와 함께 자세히 살펴보겠습니다.


return 문이란?

return 문은 현재 실행 중인 함수의 실행을 종료하고, 제어권을 해당 함수를 호출한 함수로 되돌려줍니다. int main() 함수에서는 정수 값을 반환하며, 이 값은 운영체제에 프로그램의 종료 상태를 알려주는 역할을 합니다.

return 문의 가장 중요한 특징은 지역 객체의 소멸자(destructor)까지 정상적으로 호출한다는 점입니다. 즉, 스택에 생성된 객체들이 범위(scope)를 벗어나면서 자동으로 정리됩니다.

return 문의 문법

return expression;

expression − 함수에서 반환할 표현식 또는 값입니다.

return 문 예제

#include<iostream>
using namespace std;
class Method {
    public:
    Method() {
        cout << "Constructor\n";
    }
    ~Method() {
        cout << "Destructor";
    }
};
int main() {
    Method m;
    return(0);
}

실행 결과

Constructor
Destructor

실행 결과를 보면 생성자와 소멸자가 모두 호출된 것을 확인할 수 있습니다. return 문이 실행되면서 지역 객체 m이 정상적으로 소멸되기 때문입니다.


exit() 함수란?

exit() 함수는 호출 즉시 프로그램 전체를 강제로 종료하는 함수입니다. exit()가 호출되는 순간 그 이후의 코드는 실행되지 않으며, 프로세스가 바로 종료됩니다.

exit() 함수의 가장 큰 특징은 지역 객체의 소멸자를 호출하지 않는다는 점입니다. 다만 C 언어 표준에 따라 stdlib.h(C++에서는 cstdlib) 헤더 파일에 선언되어 있으며, atexit()로 등록된 함수와 전역·정적 객체의 소멸자는 호출됩니다. 또한 exit()는 아무 값도 반환하지 않고, 대신 부모 프로세스에 상태 값을 전달합니다.

exit() 함수의 문법

void exit(int status_value);

status_value − 부모 프로세스(운영체제)에 전달할 종료 상태 값입니다. 일반적으로 0은 정상 종료를, 0이 아닌 값은 비정상 종료를 의미합니다.

exit() 함수 예제

#include<iostream>
using namespace std;
class Method {
    public:
    Method() {
        cout << "Constructor\n";
    }
    ~Method() {
        cout << "Destructor";
    }
};
int main() {
    Method m;
    exit(0);
}

실행 결과

Constructor

실행 결과에서 생성자만 출력되고 소멸자는 출력되지 않았습니다. exit()가 호출되는 순간 프로그램이 즉시 종료되어 지역 객체 m의 소멸자가 호출되지 않기 때문입니다.


return 문과 exit()의 핵심 차이 요약

구분return 문exit() 함수
종료 범위현재 함수만 종료 후 제어권 반환프로그램 전체 즉시 종료
지역 객체 소멸자 호출호출됨호출되지 않음
선언 위치C++ 언어 자체 문법<stdlib.h> / <cstdlib> 헤더 파일
반환 값호출한 함수로 값 반환값을 반환하지 않음(void)
종료 상태 전달main()의 경우 운영체제에 전달status_value로 부모 프로세스에 전달

정리하면, 객체의 정상적인 해제가 필요하거나 함수 단위의 흐름 제어가 목적이라면 return 문을 사용하는 것이 좋습니다. 반면 오류 발생 시 프로그램을 즉시 중단해야 하는 상황이라면 exit()가 적합합니다. 다만 exit() 사용 시 지역 객체의 소멸자가 호출되지 않아 리소스 누수가 발생할 수 있으므로 주의해서 사용해야 합니다.