C++는 함수 오버로딩(function overloading)을 지원하는 강력한 언어입니다. 그렇다면 자연스럽게 이런 의문이 생깁니다. 과연 프로그램의 진입점인 main() 함수도 오버로딩할 수 있을까요?
먼저 main() 함수를 오버로딩하려고 시도하는 코드를 직접 확인해 보겠습니다.
예제 1: main() 오버로딩 시도
#include <iostream>
using namespace std;
int main(int x) {
cout << "Value of x: " << x << "\n";
return 0;
}
int main(char *y) {
cout << "Value of string y: " << y << "\n";
return 0;
}
int main(int x, int y) {
cout << "Value of x and y: " << x << ", " << y << "\n";
return 0;
}
int main() {
main(10);
main("Hello");
main(15, 25);
}실행 결과
컴파일 오류 발생: main() 함수의 선언 사이에 충돌(conflicting declaration of 'main')이 있다는 메시지가 출력됩니다.
실행 결과에서 알 수 있듯이, 전역 범위에서 main() 함수를 여러 번 정의하면 컴파일러가 선언 충돌을 감지하여 컴파일 오류를 발생시킵니다. C++ 표준은 프로그램의 진입점으로 이름이 main인 전역 함수를 단 하나만 허용하기 때문입니다.
해결 방법: 클래스 멤버 함수로 활용하기
그렇다면 main이라는 이름을 가진 여러 함수를 사용하고 싶을 때는 어떻게 해야 할까요? 해결책은 main을 클래스의 멤버 함수로 정의하는 것입니다. C++에서 main은 C 언어처럼 사용이 제한되는 예약어가 아니므로, 클래스 내부에서는 자유롭게 오버로딩하여 사용할 수 있습니다.
예제 2: 클래스 멤버로 main() 정의하기
#include <iostream>
using namespace std;
class my_class {
public:
int main(int x) {
cout << "Value of x: " << x << "\n";
return 0;
}
int main(char *y) {
cout << "Value of string y: " << y << "\n";
return 0;
}
int main(int x, int y) {
cout << "Value of x and y: " << x << ", " << y << "\n";
return 0;
}
};
int main() {
my_class obj;
obj.main(10);
obj.main("Hello");
obj.main(15, 25);
}실행 결과
Value of x: 10 Value of string y: Hello Value of x and y: 15, 25
클래스 멤버 함수로 정의하면 객체를 통해 서로 다른 매개변수를 가진 main 함수들을 오류 없이 성공적으로 호출할 수 있습니다.
핵심 정리
- 전역 범위의
main()함수는 오버로딩할 수 없으며, 시도하면 컴파일 오류가 발생합니다. main이라는 이름의 함수를 여러 개 만들고 싶다면 클래스 멤버 함수로 정의하면 됩니다.- 프로그램의 실제 진입점은 반드시 매개변수가 없는 형태 또는
(int argc, char* argv[])형태의 전역main()함수 하나여야 합니다.