main 함수 해부하기 - 마무리

이전 강의까지 main 함수와 관련된 공부를 열심히 해왔어요.
이제 main 함수 해부하기의 마무리를 할 시간이 왔는데요. 몇 가지 못 다한 이야기와 함께 마무리를 하고자 해요.



강의들은 모두 무료입니다. 단, 저작권은 키클 코딩랩 에 있으며, 무단 복제 및 배포를 엄금합니다.
이를 어길 시, 본 사이트의 서버가 미국에 있으므로, 미국법에 의해 처벌될 수도 있습니다.




main 함수의 전달인자 이름

여느 때와 마찬가지로, 원하는 폴더/디렉토리를 만들고 gedit 문서 편집기를 이용하여 "lec11_main.c"라는 이름의 C 파일을 만들어 볼게요. 그리고, 아래처럼 이전 강의 main 함수 해부하기 - 포인터 배열에서 코딩한 내용을 복사해서 붙여넣어 보지요.

lec11_main.c
#include <stdio.h>

int main (int argc, char *argv[ ]) {
	printf("The number of arguments=%d\n", argc);
	printf("ptr_arg1=%p, ptr_arg2=%p, ptr_arg3=%p\n", argv[0], argv[1], argv[2]);
	printf("arg1=%s, arg2=%s, arg3=%s\n", argv[0], argv[1], argv[2]);
}

지금까지 못 다한 이야기 중 첫 번째는요, 전달인자의 이름에 관한 것이예요.
강의 main 함수 해부하기 - 함수란?에서, 함수(Function)를 코딩할 때에는, 리턴값의 데이터타입, 함수이름, 전달인자의 데이터타입, 전달인자 이름을 미리 정해둬야 한다고 했었죠? 데이터타입은 C/C++에서 지원하는 종류(예, 정수형, 문자형)가 이미 정해져 있는 반면, 함수이름과 전달인자 이름은 사용자가 마음대로 정하면 된다고 했던 것도 기억하지요?

main 함수도 함수이기 때문에, 위 사항이 동일하게 적용되지요. 단, "main"이라는 이름은 절대로 바뀌면 안 된다는 것 알고 있지요? 이 부분에 대해서 조금 더 설명하면, main 함수는 우리가 호출하는 함수가 아니기 때문이랍니다. 함수는 누군가 호출을 해줘야 그 기능을 수행하지요? 그런데, 우리는 그 어디에서도 main 함수를 호출하는 코드를 작성한 적이 없어요. 그렇다면, main 함수는 언제 호출이 되는 걸까요? 바로, 터미널에서 컴파일 후 실행파일 이름을 입력하여 명령하였을때, 우리의 프로그램이 실행되면서 main 함수가 호출되는 것이지요. 즉, main 함수는 운영체제(OS: Operating System)가 호출하는 것이랍니다. 그리고, OS는 언제나 C/C++ 프로그램을 실행할 때, "main"이라는 이름의 함수를 호출하기로 약속이 되어 있는 것이지요. 그래서, "main" 이라는 함수 이름은 바꾸면 안되는 것이랍니다.

반면, main 함수의 전달인자 이름은 마음대로 바꿀 수 있답니다. 사실, 어떤 함수를 사용할 때, 전달인자의 데이터타입은 호출하는 주체에게 알려지지만, 전달인자 이름은 함수 내에서만 사용되기 때문에 호출하는 주체에게 알려지지 않아요. 고로, main 함수는 자신을 호출하는 OS와 전달인자 이름과 관련해서 별도로 약속이 되어 있거나 한 사항이 전혀 없지요. 그래서, 마음대로 바꿀 수 있는 것이랍니다. 그럼, 진짜로 전달인자의 이름을 바꿔서 확인해 볼까요? 아래 줄3처럼 전달인자의 이름을 my_argc와 my_argv로 바꾸고, 줄4~줄6에서도 동일하게 바꿔 보세요.

#include <stdio.h>

int main (int my_argc, char *my_argv[ ]) {
	printf("The number of arguments=%d\n", my_argc);
	printf("ptr_arg1=%p, ptr_arg2=%p, ptr_arg3=%p\n", my_argv[0], my_argv[1], my_argv[2]);
	printf("arg1=%s, arg2=%s, arg3=%s\n", my_argv[0], my_argv[1], my_argv[2]);
}

그리고, 이전 강의 main 함수 해부하기 - 포인터 배열에서 했던 것처럼, 컴파일하고 전달값 "123"과 "abc"을 건네주며 실행해보면 아래처럼 아무 에러없이 결과가 출력되는 것을 볼 수 있답니다. 즉, 전달인자의 이름을 바꿔도 전혀 이상이 없다는 것이죠.

.../my_folder$ gcc lec11_main.c
.../my_folder$ ls
a.out  lec11_main.c
.../my_folder$ ./a.out 123 abc
The number of arguments=3
ptr_arg1=0x7fff165eefbd, ptr_arg2=0x7fff165eefc5, ptr_arg3=0x7fff165eefc9
arg1=./a.out, arg2=123, arg3=abc
.../my_folder$

위 줄6에서 출력된 메모리 주소값들은 강의 main 함수 해부하기 - 포인터 배열에서의 주소값들과는 다를 수 있답니다. 어떤 값들이 실제 메모리에 저장될 때에는, 그 위치가 매번 달라질 수 있기 때문이지요.





다른 형태의 main 함수

두 번째로 이야기하고 싶은 내용은 다른 형태의 main 함수예요. main 함수는 두 가지 형태로 작성될 수 있어요. 하나는 우리가 지금까지 사용해온, 아래와 같이 전달인자(argument) argc와 argv를 갖고 있는 형태이지요.

전달인자가 있는 main()
int main (int argc, char *argv[ ]) {

}

그 다음 형태는 아래와 같이 전달인자가 없는 형태랍니다.

전달인자가 없는 main()
int main () {

}

만약, 어떤 C/C++ 파일을 컴파일 후 실행할 때 아무런 전달값을 건네주지 않는다면, 위에서와 같이 전달인자 코드 없이 "int main()"으로만 코딩을 할 수 있답니다.
사실, 전달인자 없는 main()함수를 코딩한 후 실행할 때, 앞서 "123"과 "abc"를 건네었던 것처럼 전달값을 건네도 상관은 없어요. 다만, main 함수 내에서 전달값들을 받고 사용할 방법이 없을 뿐이지요.
예를 들어, 강의 main 함수 실행하기에서 아래와 같이 코딩했었는데요.

#include <stdio.h>

int main (int argc, char *argv[ ]) {
	int myvar = 3;
	char mychar = 'a';
	char mychar2 = 76;

	myvar += argc;

	printf("My first print\n");
}

main 함수 내에서 전달인자 argc를 사용하는 줄8를 없애면, 아래와 같이 전달인자 없는 main 함수로 작성해도 된답니다.

#include <stdio.h>

int main () {
	int myvar = 3;
	char mychar = 'a';
	char mychar2 = 76;

	printf("My first print\n");
}

C/C++를 공부할 때, 전달인자가 없는 main 함수만 알고 넘어가는 사람들이 많은데요. 실제로는 전달인자가 있는 main 함수를 사용하는 경우도 많답니다. 그래서, 지금까지 많은 시간을 할애하여 공부해 온 것이지요. 또한, 전달인자가 있는 main 함수를 차근차근 공부하면, 자연스럽게 C/C++ 문법의 뼈대를 만들 수도 있기에 "main 함수 해부하기"를 해 온 것이랍니다.





마무리하며...

이번 강의를 끝으로, main 함수 해부하기는 마무리가 됩니다.
데이터타입(정수형, 문자형), 함수, 배열, 포인터, 문자열 등 C/C++ 문법의 뼈대를 이루는 중요한 개념들을 공부해 왔어요. 이어지는 강의에서도 뼈대를 구성하는 내용들을 하나씩 공부해 볼게요~!

강의에서 작성된 소스 코드 (source code)를 다운받으려면, 다음 링크를 클릭하세요: lec11_main.c

혹시, 이해가 잘 안되는 부분에 대한 질문이 있거나 다루어 줬으면 하는 주제가 있으면, 화면 오른쪽 하단에 "질문하기" 버튼을 이용해 주세요.






발자취

2019-09-11 "키클 코딩랩 - 미국 공학박사 아빠의 코딩 연구소"로 이름 변경
2019-06-28 코딩 교실 공개
2019-03-18 코딩 교실 제작 시작

바로가기
Python 배움터
C/C++ 배움터
About
Contact
Privacy Policy
강의목록
질문하기
처음으로