1. main 함수의 매개변수
C 에서 main함수는 프로그램 진입점이다. 즉, 최초로 함수로 구동되어 실행되는 시점이다.
함수의 매개변수(파라미터)는 이 함수를 호출할 때 전달해주는 정보를 뜻한다.
우리는 보통 함수를 만들어 놓고 호출할 때 매개변수에 정보를 넣어준다.
그런데 main함수는 최초로 시작하는 진입점인데 어떻게 정보를 전달할까?
main함수의 원형은 다음과 같다.
int main (int argc, char* argv[])
main 함수에 argc, argv 라는 매개 변수를 전달한다.
여기서 argc와 argv의 의미는 다음과 같다.
int argc : 메인 함수에 전달되는 정보의 개수 (argument count)
char* argv[] : 메인 함수에 전달되는 실질적인 정보로, 문자열의 배열을 의미
프로그램을 실행할 때 지정해 준 인자의 문자열들이 실제로 저장되는 배열
인덱스가 0인 문자열은 프로그램 실행경로로 항상 고정되어 있다. (argument vector)
2. main함수에 정보를 전달하는 원리
'arg_test.c' 예제를 통해 쉽게 이해할 수 있다.
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int i;
for (i = 0 ; i < argc ; i++)
printf("argv[%d] : %s\n", i, argv[i]);
exit(0);
}
(보통 main함수의 명령 인수는 윈도우에서는 거의 사용하지 않고, 리눅스 계열에서 종종 사용한다.)
리눅스에서 다음 파일을 컴파일하여 실행파일을 만들고,
./arg_test I AM JONGHYUN
라고 실행하게 되면 다음과 같은 결과가 나온다.
argv[0] : ./arg_test
argv[1] : I
argv[2] : AM
argv[3] : JONGHYUN
argc에서 지속되는 인자는 './arg_test', 'I', 'AM', 'JONGHYUN' 4개로 argv에는 문자열로 저장된 인자 주소값을 배열 형태로 저장한다. 즉, argv[0]에는 문자열 'arg_test'의 시작 주소값이 저장되고 argv[1]에는 'I'의 시작주소 값이 담기게 된다.
(프로그램은 공백을 하나의 인수로 인식한다. 공백을 포함해서 인수를 전달하려면 작은 따옴표를 사용하면 된다.)
예를 들어, 리눅스 명령어 중에 'ls -al'을 보면 -al 이 다음과 같은 원리를 통해 만들어 진 것입니다.
-al이라는 인자(argument)를 추가로 써줌으로써, ls.exe가 그에 합당한 결과물을 출력해 준다.
3. 그렇다면 어떻게 활용되는지?
1. 파일 이름을 인자로 받아 해당 파일을 읽어오고 싶을 때
./test.exe input.txt 로 프로그램을 실행시킨다면 argv[1]에 "input.txt"가 들어가게 되는데,
내가 인자로 넘겨준 파일을 읽어올 수 있도록 코딩하는 것이다.
2. 현재 프로그램이 개발모드인지 프로덕션 모드인지 구분하고 싶을 때
개발을 하다보면 디버깅을 해야하는 부분이 있다. 매번 디버깅용 코드를 넣었다 프로덕션용으로 디플로이를 할 때
디버깅 코드를 지우면 귀찮으니 프로그램을 실행할 때 인자로 현재 개발모드라는 것을 알려주는 용도로 사용하는 것이다.
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
if (argc >= 2 && !strcmp(argv[1], "development")){
puts("Development mode !");
} else {
puts("Production mode !");
}
}