아메리카노가 그렇게 맛있답니다 여러분

C언어를 하다보면 int main으로 선언하는 사람도 있고 void main으로 선언하는 사람도 있습니다. (대부분의 책은 int main으로 설명하는 것으로 알고 있습니다.)

이 둘의 차이는 'return값이 존재하느냐 존재하지 않느냐'의 차이 밖에 없습니다.

그렇다면 main 함수의 return값이 의미있게 쓰이는 것도 아닌데 왜 int main()과 void main()이 있을까요?

이는 main함수라는 말에서 이유를 알아낼 수 있습니다. 본래 함수란 return값을 가지고 쓰는 것이 정석과도 같습니다. 만약에 a라는 숫자와 b라는 숫자를 더하는 함수를 만들었다고 가정한다면, 이 함수는 printf()로 a+b값을 찍어내는 것이 아닌 return a+b로 값을 넘겨주는 것이 함수를 쓸 때 올바르게 사용했다고 할 수 있는 것이죠.


int add(int a, int b) {
    return a+b;
}

[함수 사용의 올바른 예제]

int add(int a, int b) {
    printf("%d", a+b);
}

[함수 사용의 올바르지 않은 예제]



이처럼 main함수도 하나의 함수이며, return값을 갖는 것이 모든 함수의 정석이므로 이를 따르는 것입니다.

또한 main함수의 return값을 보지 않는 것은 일반적인 프로그램의 경우입니다. 안정적인 종료가 필수적이거나 main의 return값을 확인해야 하는 프로그램의 경우, 프로그램이 올바르게 끝났는지 파악하는 척도가 될 수 있습니다.


하지만 사실 이 문제는 'int main을 쓰는 것이 옳으냐 void main을 쓰는 것이 옳으냐'는 의미가 없습니다.

어차피 void main을 사용하더라도 컴파일러는 이를 int main처럼 처리하기 때문입니다.

본래 C는 int main만을 허용했습니다. 이것이 ANSI 표준입니다. 하지만 컴파일러는 시간이 지남에 따라 더 좋게, 그리고 프로그래머의 요구에 맞춰 변해갔습니다.

컴파일러 C99부터 main의 void형을 허용하면서 혼용이 일어나게 되었는데, void형을 갖는 main의 사용을 허용하지만 실제로는 int형로 컴파일러가 바꾸는 것입니다.

(왜 void main이 허용되었는지는 C99의 변경점만 보아서는 알 수 없으나, 대다수의 프로그래머가 main의 return값을 볼 일이 없었기에 프로그래머의 요구일 가능성이 크다고 생각합니다.)

void main을 int main으로 컴파일러가 바꾸는 과정에서 사용자가 넣지 못한 return값은 컴파일러가 지정한 기본값을 따릅니다. gcc의 경우 return 0;이 기본으로 설정되어 있습니다.

void main이 return값을 가질 수 있는가 없는가에 대해서는 여러분들도 테스트 해볼 수 있는데, return 0;를 void main 끝에 써보면 됩니다. void main끝에 return값을 넣더라도 컴파일 오류가 발생하지 않습니다.


++

(참고로 main의 return값은 리눅스의 경우 bash를 사용하여 볼 수 있다고 합니다.)