1 ) int가 정수란 뜻이고 출력 형태를 의미한다는데 무슨 소리인지 모르겠어요;;
만약 저 부분에 다른형태를 써 넣으면 결과가 어떻게 달라지죠?
c언어의 특성 중 하나는 함수입니다. 그 중 대표적인 함수가 main함수인데요,
원래 main함수는 int main(int argc, char **argv, char **env) 혹은 int main(int argc, char *argv[], char *env[])로 선언되어 있습니다. 3개의 매개변수를 취하여 int형 수치를 리턴해줍니다.
바꾸어 말하면 어떤 프로그램이 실행될 때, 그 프로그램에게 몇가지 정보를 전달한다는 뜻입니다.
예를 들면, 동영상을 보기 위해 곰 플레이어를 먼저 실행했을 때와 동영상 파일을 그냥 클릭했을 때를
비교해봅시다.
곰플레이어를 실행하면 그냥 곰플레이어가 뜨지만 동영상 파일을 클릭하면 곰플레이어가 뜨면서 그 동영상이 곰플레이어서 보이죠?
그것을 바꿔 생각해봅시다
1. GOMPLAYER
2. GOMPLAYER 졸업앨범
1은 곰플레이어만 실행 시킨 것이고
2는 졸업앨범이라는 파일은 클릭하니까 곰플레이어에 자동으로 연결되어
곰플레이어가 졸업앨범을 화면에 보여주는 것입니다.
원래 도스 시절에 "gomplayer 졸업앨범" 형식으로 타자하여 실행하던 것인데 그렇게 입력하고 엔터를 치면
main함수가 호출되면서 char *argv[]에 argv[0] = "gomplayer", argv[1]= "졸업앨범"이라는 인수가 들어가고
(argv[0]에는 완전한 경로명이 들어갑니다. ex>c:\program\gomplayer.exe)
int argc에는 몇개의 명령행 인자가 들어갔는지, 그 갯 수를 수치로 알려줍니다.
"gomplayer"와 "졸업앨범" 이렇게 2개가 들어갔으니 argc에는 2가 들어가겠군요.
어쨋든 main함수의 인자는 저렇게 설정되어 있습니다.
main 함수 앞에 리턴 값은, 아시다시피 c의 함수는 대개 리턴 값이 있습니다.
없는 경우는 애초 그 함수를 만들 때, 리턴 값을 사용 안 하겠다, 즉 함수의 리턴을 void로 설정한 경우와
그 함수가 리턴 값이 있더라도 나는 사용하지 않겠다하는 경우입니다.
main함수는 분명 int형을 반환하게 되어있습니다.
그런데 우리는 그 값이 필요 없어서 void라고 선언하기도 합니다. 그것은 main함수 자체는 int를 리턴하기로 되어있으나 굳이 안 해도 된다는 것이죠. 우리가 자주 쓰는 printf는
int printf(const char *format [, argument, ...]); 로 선언되어 있습니다.
성공적으로 수행하면 출력된 byte수를 리턴하게 되어있습니다. 그러나 우리가 평소 그것이 궁금하지 않기 때문에
return값을 확인하지도, 활용하지도 않습니다.
예를 들어 printf("%d\n", printf("hello\n")); 라고 한다면
hello
6
이라고 화면에 나온다는 뜻이죠(hello\n, 총 6글자).
main함수의 리턴 값은 0~255 범위의 in형 수치로서 탈출코드(exit code)라고 부르는데, 그 프로그램의 실행이 종료되었을 때 도스로 넘겨주는 정수값이다. 정상적으로 프로그램이 종료된 경우라면 0의 값을 도스에 넘겨주고 만약 비정상적으로 종료된 경우에는 1 이상의 값을 도스에 넘겨주도록 약속 되어 있다. 이런 식으로 프로그램에서 도스로 전달되는 탈출코드값은 IFERRORLEVEL ... 과 같은 배치화일 명령어에 쓰인다.
2) main이 함수이름을 뜻한다는데 이게 저 부분에 들어가는 함수들 중에서 main이란 함수가 있다는 뜻인가요? 아니면 main은 고정되어있어서 무조건 출력형태 main(입력형태)의 꼴로 나와야 하나요?
C 언어에서는 반드시 main함수를 만들어줘야 합니다.
프로그램이 실행되면 그 시작 지점이 main함수이기 때문입니다(강제로 종료하는 명령, 예외종료가 아닐 경우 main함수에서 종료됩니다 - main함수가 프로그램의 줄기이고 다른 함수들은 가지라고 보면 됩니다).
3) void가 비어있다는 의미라는데 저렇게 써넣으면 int main(void)가 입력 없이 main()함수를 호출해서 정수로 출력하라는 의미라는데 저 부분에 void대신 다른형태를 써넣으면 어떻게 되나요?
다른 형태는 1에서 설명한 것 밖에 없을 겁니다.
가령 내가 파일을 복사하는 프로그램을 만들었다고 합시다. 그 프로그램의 이름은 kapy.c이고
kapy a.txt b.txt라고 치면 a.txt라는 파일을 b.txt로 복사하는 기능을 한다고 합시다.
그렇다면 kapy.c의 main함수는
int main(int argc, char *argv[]) 로 해줘야 합니다.
여기서 바꿀 수 있는 것은 리턴값인 int main을 void main으로 쓸 수 있습니다.
그 프로그램이 어떻게 끝났는지 굳이 알고 싶지 않다면 말입니다.
또 바꿀 수 있는 것은 main(int argc, char *argv[])에서 매개변수 이름들입니다.
매개변수의 자료형은 바꾸면 안 됩니다. 즉, main(int val, char *str[])등의 형식으로 말이죠.
또한 main(void)라고 쓰면 kapy a.txt b.txt라는 명령줄의 a.txt, b.txt라는 파일 이름들은 무시됩니다.
[표]
main 함수의 8가지 원형
[1] T main(int argc, char **argv, char **env)
또는 T main(int argc, char *argv[], char *env[])
[2] T main(int argc, char **argv)
또는 T main(int argc, char *argv[], char *env[])
[3] T main(int argc)
[4] T main(void)
(매개변수명을 꼭 위와 같이 정할 필요는 없지만 관례를 따르는 것이 좋다
main 함수의 세 매개변수 중에서 문자열 배열 env(ragged 배열)는 도스의 환경변수(environment value)를 알아내기 위한 것으로서, 특수한 시스템 프로그램을 제외하고는 거의 쓰이지 않는다.
참고로 환경변수로는 COMSPEC, PROMPT나 PATH 같은 것들이 대표적이며 아래와 같이 도스의 SET 명령으로 알아볼 수 있다.
C:\TURBOC\WORK>set<Enter>
COMSPEC=C:\COMMAND.COM
PROMPT=$P$G
PATH=C:\;C:\DOS;
<파란 색 인용 출처 : 임인건, 터보C정복, 가남사, 1990, p.624>
(이 내용은 네이버 지식인에 올라온 질문에 제가 답변한 것을 옮겨 수정한 것입니다.)