OSXDEV 블로그 OSX / iOS / Xcode

30Nov/111

main() 함수와 argument 인자값 처리하기

안녕하세요?
고드름 김정입니다.

맥 개발 스터디를 하기 위해 기본적인 C 프로그래밍 기법들을 정리하려고 합니다.
그 중에서 가장 기본이 되는 main() 함수와 argument 처리하는 방법을 알아보겠습니다.
( 편의상 존대말을 사용하지 않는 점을 유념해주시기 바랍니다 )

프로그램을 실행과 동시에 main() 함수가 불리게 되며, 모든 코드는 여기서 시작한다.
main() 함수는 C 언어 계열에서 가장 기본이 되는 함수로 Objective-C 에서도 마찬가지 역할을 담당한다.

C 언어에서 main() 함수의 프로토타입은 다음과 같이 생겼다.

int main (int argc, const char * argv[])
{
}

메인 함수의 의미는 UNIX를 처음 만들던 70년대 프로그래밍 기법과 관련이 많다.
UNIX 쉘에서는 하나의 실행 파일도 함수처럼 인자값을 넘기고 결과값을 받는 구조이기 때문이다.

다음과 같이 현재 디렉터리에 있는 모든 파일을 찾는 명령을 실행한다고 가정해보자.

$ ls -la

이 때 ls라는 실행 파일이 있다면 (공백으로 구분되는) 인자값으로 “-la” 문자열을 메인 함수에서 받게된다.
위와 같이 실행하면 main 함수의 매개 변수 argc (인자값 개수)에는 숫자 2가
argv[0]에는 “ls” (실행파일명이 기본적으로 포함된다)
argv[1]에는 “-ls” 값이 배열 형태로 넘어온다.

일반적으로 C 프로그래밍에서는 argc 개수와 argv 배열을 비교해서 원하는 값을 찾아낸다.
여기서는 Cocoa 프레임워크에 포함된 기능을 활용해서 인자값을 분석하는 방법을 소개하려고 한다.

우선 첫째로 가장 간단한 방법은 NSUserDefaults 클래스를 활용하는 것이다.

NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];

NSString *strStatus = [standardDefaults stringForKey:@"status"];

bool isUpdate = [standardDefaults boolForKey:@“update”];

 
사용법은 간단하다. + standardUserDefaults 라는 클래스 메서드를 호출해서 인자값을 얻어오면 된다.
주의할 점은 key-value가 짝을 이룬다는 점이다.

$ ls -la 명령처럼 옵션만 있고 뒤에 데이터값이 없으면 nil 객체가 넘어온다.
$ mysql -u godrm 명령처럼 -u 옵션뒤에 godrm 이란 데이터가 있을 경우만 된다.

NSString *strUser = [standardDefaults stringForKey:@“u”];

 
이 경우에 strUser에는 “godrm” 문자열 객체가 반환된다.
결과적으로 standardUserDefaults를 쓰는 방법은 키와 값의 짝이 있을 경우만 기억하면 된다.

두번째로 키와 값이 짝이 없는 옵션의 경우는 어떻게 찾을 수 있을까?
마찬가지로 NSUserDefaults 클래스의 NSArgumentDomain 을 활용하면 된다.

NSMutableDictionary* myValues =
    [[standardDefaults volatileDomainForName:NSArgumentDomain] mutableCopy];

 
이렇게 하면 myValues에는 모든 키와 값을 포함하는 인자값들이 저장된다.
그 중에서 키값들만 뽑아서 찾아보면 될 것 같다.

if ([myValues allKeys] containsObject:@"help”])

 
이렇게 비교하면 -help 라는 옵션이 포함되어 있는지 비교할 수 있다.

그렇다면 특정 위치에 있는 인자값을 찾으려면 어떻게 해야할까?
예를 들어 $ defaults read ... 처럼 실행파일 바로 다음의 인자값을 찾아야 할 수도 있다.

이럴때는 처음에 언급했던 argv[] 배열을 문자열로 비교하는게 가장 간편하다.

if (strcmp(argv[1], “read”)==0)

 
이처럼 비교하면 된다.
다만 주의할 점은 argc 인자값 개수를 항상 확인해야 한다는 점이다.
만약 실행파일명만 입력한 경우라면 argv[1] 값은 존재하지 않는 null 값이 된다.
따라서 strcmp(argv[1], “read”) 문장에서 예외가 발생할 수 있다.

마지막으로 한 가지 팁을 소개하고 마치겠다.
Xcode4에서 디버깅할 때 실행 파일에 인자값을 넣고 싶다면 어떻게 할까?
Edit Scheme 메뉴를 선택해서 좌측의 Run Action을 선택한다.
그리고 우측에 두 번째 Arguments 탭을 선택하고 Arguments Passed On Launch 항목에 추가하면 된다.

Filed under: 강좌 1 Comment
27Nov/110

Hello, OSXDEV!

OSXDEV 블로그를 시작합니다 ^^

앞으로 세미나/스터디/강좌/컬럼 등의 정리된 내용을 올릴 예정입니다.

 

Filed under: 공지사항 No Comments