삽질의 현장/- C++

[삽잡이::C++] main() 함수에 관하여...

shovelman 2015. 7. 25. 09:30


안녕하세요 삽잡이입니다...


여유로운 주말이 찾아왔습니다 푸하하...

오늘은 엉뚱한 이유를 찾아 헤매보려고 합니다...

별거 아닐 수 있습니다... 근데 이놈의 삽질 자체인... 삽잡이는 그냥 궁금해졌습니다..

별거 아니면 그냥 살포시 넘어가시길.... 허허...



아무튼...

Visaul Studio를 실행시키고 소스파일을 만들었을 때 문득 생각이 들었습니다...


1
2
3
4
5
6
#include <iostream>
 
main()
{
 
}
cs


c에서 아무 생각 없이 쓰던 이 'main()' ...  왜 안되... 왜 안되?

c++에서는 안되기에 왜그러지 했습니다... 물론 이유는 찾았죠....



c++에서는 기본 int를 지원하지 않는다라...


참고로 c/c++ 표준 main 시그니처는 아래와 같습니다...


1
2
int main(void);
int main(int argc, char *argv[]);
cs


우리가 이전부터 아무렇지 않게 쓰던 'main()' 같은 경우에는 

컴파일러에게 무엇을 받을지에 대한 매개변수 타입과 반환형의 정보를 제공하지 않는 것입니다.


그렇습니다... 아무것도 명시하지 않으면 int형으로 반환형을 간주 하던 것이

최근(?)... 몇년 전부터... 

return을 기입하지 않는데 뭔 int형이냐 하면서 컴파일 에러를 내도록 하게 된 것이죠...


여기서 하나 짚고 넘어가야 할 것이

void main(void)와 main() 은 엄연히 다른 것입니다!


많은 IT에 공부하는 학생 (저도 학생 *-_-*)들 중에 

명시 하지 않으면 void로 컴파일러가 인식한다고 생각하시는 분들이 간혹 있습니다...


하지만 void를 명시하는 것과 아에 공백으로 두는 것은 컴파일러에게 알리는 것이 다릅니다.


전자의 경우에는 컴파일러에게 '나 입력, 반환 아무것도 안한다!'라고 명시하는 것이고

후자의 경우에는 컴파일러에게 '받던지 말던지 안알랴줌!' 이라고 하는 것이죠...

정확하게 따지면 다른겁니다! 하하..

참고로, void를 반환형식으로 사용해도 stack 메모리에는 4byte가 할당 된다는 점...


아무튼...

또 삽질의 냄새가 스물스물 올라오며 왜 그럼 반환형은 int형인데라는 궁금증이 생겼습니다...

이놈의 고질병.... 푸하하 아무튼... 자문을 구하고 이것저것 뒤져봤습니다...


왜 int야... void면 안되? 어차피 아무것도 안받을꺼면 void로 할 것이지

왜 귀찮게 return 0; 을 하게 int형이 되야되냐 말이야~!


그럼 또 어떤 이들은 대답합니다....

프로그램의 실행 결과가 성공적이다... 라는 것을 명시하기 위해서야~!


뭔 실행 결과가 성공적인데요.... 좀더 명확한 이유에 대해서 알아보니...

return으로 함수 혹은 프로그램의 종료에 대한 이유를 알기 위해서였습니다.


어떻게 종료했는지 알려고 어떤 값을 반환하면서 종료됬는지 인지하기 위해

return 값이 있는 것이죠...


뭐... 어떻게 성공했는지는 궁금하진 않겠으나, 에러에 대한 이유를 명시하여 return 해주자는 것이죠!


음... 예를 들어보자면 exit() 함수와 같은 경우에도 

매개변수로 int형 하나를 받게 되어있습니다.


exit() 함수에 의해서 해당 함수/ 프로세스를 호출한 

클라이언트/ 부모 프로세스는 어떻게 종료됬고 죽었는지 확인하기 위해 int형을 명시하는 것이지요...


아무튼... 요것이 바로 main 함수의 return 형식이 int인 이유입니다....

뜬금없나요... 허허...


참고로 윈도우즈의 프로세스 간에는 서로 관계가 끈끈하지 않아서 확 와닿지 않을 수 있을지라도

리눅스/ 유닉스 시스템 프로그램에서는 의미가 있다고 합니다...

(저는 아직 잘... 와닿지 않습니다... 푸하하 초짜가... 궁금해서 물어봤다가 이런 답변까지 ㅎㅎ)



마지막으로...


왜 int지... 왜 void지 하면서 패기 있게 왜! 이렇게 쓰냐고 물어보는 패기 있는 

입문자들을 몇몇 보았습니다....


main 함수와 같은 시그니처는 이미 C/C++ 표준에 의해 정의 되어 있는 

몇가지의 시그니처 중 우리가 선택하여 정의하게 되어있죠...

또한 이 외에도 프로그래밍 언어에서는 서로 약속을 한 것들이 많으니!!!


그러니... 군말없이... 표준이구나... 하시며... 

즐겁게 코딩하시길 바랍니다... 아하하.... 뭐... 신의 영역이니 신의 영역에 접근하지 마시길...


하하... 이상 삽잡이였습니다~! 즐거운 주말 되시길!