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

C++에서 main() 함수 오버로딩이 가능할까?

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() 함수 하나여야 합니다.