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

C 언어에서 int main()과 int main(void)의 차이점 완벽 정리


int main()은 프로그램 실행이 종료될 때 정수값을 반환하는 함수를 의미합니다. 관례적으로 마지막에 '0'을 반환하며, 이 값은 프로그램이 성공적으로 실행되었음을 운영체제에 알려주는 신호로 사용됩니다.

int main()의 기본 문법은 다음과 같습니다.

int main(){
    ---
    ---
    return 0;
}

int main(void)는 함수가 인수를 하나도 받지 않는다는 것을 명시적으로 선언한 형태입니다. 만약 괄호 안에 void를 쓰지 않으면, 컴파일러는 이 함수가 임의 개수의 인수를 받을 수 있다고 간주합니다.

int main(void)의 기본 문법은 다음과 같습니다.

int main(void){
    ---
    ---
    return 0;
}

두 표기법은 겉보기에 거의 같지만, 기술적으로는 int main(void)가 더 바람직합니다. main 함수가 반드시 매개변수 없이 호출되어야 한다는 사실을 코드 자체에 명확히 드러내기 때문입니다.

C 언어에서는 함수 시그니처에 매개변수가 명시되어 있지 않으면, 그 함수는 어떤 개수의 인수로든 호출할 수 있습니다. 즉, 빈 괄호 ()는 '매개변수 없음'이 아니라 '매개변수 미지정'을 의미합니다. 참고로 C++에서는 int main()과 int main(void)가 완전히 동일하게 처리되지만, C에서는 이처럼 미묘한 차이가 존재합니다.

이제 실제 코드를 통해 두 함수의 차이를 확인해 보겠습니다.

예제 1: int main() 사용

다음은 int main()으로 선언한 후, 재귀 호출 시 인수 10을 전달하는 C 프로그램입니다.

#include <stdio.h>
int main(){
    static int a = 10;
    if (a--){
        printf("after decrement a =%d\n", a);
        main(10);
    }
    return 0;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

after decrement a =9
after decrement a =8
after decrement a =7
after decrement a =6
after decrement a =5
after decrement a =4
after decrement a =3
after decrement a =2
after decrement a =1
after decrement a =0

int main()처럼 매개변수가 지정되지 않은 경우, main(10)처럼 인수를 넘겨도 컴파일러가 이를 검사하지 않기 때문에 오류 없이 정상 실행됩니다.

예제 2: int main(void) 사용

이번에는 같은 로직을 int main(void)로 작성해 보겠습니다.

#include <stdio.h>
int main(void){
    static int a = 10;
    if (a--){
        printf("after decrement a =%d\n", a);
        main(10);
    }
    return 0;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

error

동일한 코드라도 int main(void)로 선언하면 컴파일 오류가 발생합니다. void는 '이 함수는 매개변수를 받지 않는다'고 명시하는 것이므로, main(10)처럼 인수를 전달하면 컴파일러가 이를 감지해 에러를 내기 때문입니다.

따라서 위 코드에서 main(10)의 인수 10을 제거한 뒤 다시 컴파일하면 정상적으로 동작합니다. 수정된 코드는 다음과 같습니다.

수정된 예제

#include <stdio.h>
int main(void){
    static int a = 10;
    if (a--){
        printf("after decrement a =%d\n", a);
        main();
    }
    return 0;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

after decrement a =9
after decrement a =8
after decrement a =7
after decrement a =6
after decrement a =5
after decrement a =4
after decrement a =3
after decrement a =2
after decrement a =1
after decrement a =0

핵심 정리

  • int main() : 매개변수가 '지정되지 않음' → 어떤 인수로든 호출 가능하며 컴파일러가 검사하지 않음
  • int main(void) : 매개변수가 '없음'을 명시 → 인수를 전달하면 컴파일 오류 발생
  • 따라서 C 언어에서는 의도를 명확히 드러내고 실수를 조기에 잡을 수 있는 int main(void) 사용을 권장합니다.