C나 C++에서 main 함수는 겉모습만 놓고 보면 다른 일반 함수들과 크게 다르지 않습니다. 그래서 다른 함수에서 쓰이는 기능들을 main 함수 안에서도 사용할 수 있어 보입니다. 아래 예제에서는 main() 함수를 재귀적으로 호출해 숫자를 역순으로 출력하는 과정을 살펴봅니다.
예제 코드
#include <iostream>
using namespace std;
int main () {
static int x = 10;
cout << x-- << endl;
if(x) {
main();
}
}
실행 결과
10 9 8 7 6 5 4 3 2 1
코드 설명
변수 x를 static으로 선언한 것이 이 코드의 핵심입니다. static 변수는 프로그램 전체에서 단 하나만 생성되며 값이 계속 유지되기 때문에, main()이 여러 번 호출되더라도 이전 호출에서 감소시킨 값을 그대로 기억합니다. 만약 일반 지역 변수였다면 매 호출마다 10으로 초기화되어 무한 재귀에 빠졌을 것입니다.
실행 흐름을 정리하면 다음과 같습니다.
x의 현재 값(10)을 출력한 뒤 1 감소시킵니다.x가 0이 아니면main()을 다시 호출합니다.x가 0이 되면 조건문이 거짓이 되어 재귀 호출이 멈추고 프로그램이 종료됩니다.
주의: 표준 관점에서의 문제
다만 한 가지 유의할 점이 있습니다. C++ 표준([basic.start.main])은 'main 함수는 프로그램 내부에서 사용되어서는 안 된다'고 명시하고 있습니다. 따라서 표준 규격만 놓고 보면 main()의 재귀 호출은 권장되지 않으며, 컴파일러나 실행 환경에 따라 동작이 달라질 수 있습니다. 대부분의 컴파일러는 위 코드를 문제없이 컴파일하지만, 실무 코드에서는 재귀 로직을 담당하는 별도의 함수를 정의해 사용하는 것이 훨씬 안전하고 바람직합니다.