int main()과 int main(void), 차이가 있을까?
C나 C++ 코드를 살펴보면 main 함수를 정의하는 두 가지 형태를 종종 접할 수 있습니다. 하나는 int main()이고, 다른 하나는 int main(void)입니다. 그렇다면 이 둘 사이에 실제로 차이가 있을까요?
결론부터 말하면 C++에서는 두 표기법 사이에 아무런 차이가 없습니다. C 언어에서도 두 가지 모두 문법적으로 올바르지만, 기술적인 관점에서는 후자인 int main(void)가 더 바람직합니다. 그 이유는 간단합니다. 이 표기법은 "함수가 어떤 인수도 받지 않는다"는 사실을 컴파일러에게 명확하게 알려주기 때문입니다.
반면 C 언어에서 함수 선언 시 인수 목록을 비워두면, 해당 함수는 인수 없이 호출될 수도 있고 임의의 개수의 인수와 함께 호출될 수도 있습니다. 즉, 컴파일러가 인수의 개수나 타입을 전혀 검사하지 않게 됩니다. 다음 두 예제 코드를 통해 이를 직접 확인해 보겠습니다. (아래 예제는 C++이 아니라 C 기준입니다.)
예제 1: 빈 괄호 ()를 사용한 경우
#include<stdio.h>
void my_function() {
//some task
}
main(void) {
my_function(10, "Hello", "World");
}
출력 결과:
This program will be compiled successfully
위 코드는 아무런 오류 없이 성공적으로 컴파일됩니다. 인수 목록이 비어 있으면 컴파일러가 인수의 개수를 검사하지 않기 때문입니다.
예제 2: void를 명시한 경우
#include<stdio.h>
void my_function(void) {
//some task
}
main(void) {
my_function(10, "Hello", "World");
}
출력 결과:
[Error] too many arguments to function 'my_function'
반면 void를 명시하면 컴파일러가 인수의 개수를 엄격하게 검사하므로, 위와 같이 "함수에 너무 많은 인수가 전달되었다"는 컴파일 오류가 발생합니다.
정리
흥미로운 점은 C++에서는 위 두 프로그램 모두 컴파일되지 않는다는 것입니다. C++에서는 빈 괄호 () 역시 (void)와 동일하게 해석되어 "인수 없음"을 의미하기 때문입니다.
따라서 결론은 다음과 같습니다. C 언어에서는 int main()처럼 인수 목록을 비워둔 함수가 임의의 개수의 인수로 호출될 수 있는 반면, int main(void)는 어떤 인수도 허용하지 않습니다. 인수를 받지 않는 함수임을 분명히 하고 싶다면, C 코드 작성 시 (void)를 명시하는 습관을 들이는 것이 좋습니다.