ProgrammingInObjectiveC:Chapter 02: Difference between revisions

From 흡혈양파의 번역工房
Jump to navigation Jump to search
(띄어쓰기 수정)
(띄어쓰기 수정)
Line 264: Line 264:




Objective-C 언어는 대소문자를 구별한다. 또한 입력이 시작되는 위치에 대해 신경쓰지 않는다. 즉, 해당줄의 맨 처음에 입력을 시작하거나 증가에서 입력을 시작해도상관없다. 이런 특징을 사용해 개발하는 프로그램의 코드를더 읽기 쉽게 만들 수 있다.
Objective-C 언어는 대소문자를 구별한다. 또한 입력이 시작되는 위치에 대해 신경쓰지 않는다. 즉, 해당줄의 맨 처음에 입력을 시작하거나 증가에서 입력을 시작해도상관없다. 이런 특징을 사용해 개발하는 프로그램의 코드를 더 읽기 쉽게 만들 수 있다.





Revision as of 06:56, 2 August 2013

1부 Objective-C 2.0 / 2장
Objective-C 로 프로그래밍하기

2장 :: Objective-C 로 프로그래밍하기

이 장에서는 첫 번째 Objective-C 프로그램을 작성하는 방법을 알아보고자 한다. 아직은 객체를 다루지 않는다. 객체는 다음 장의 주제이므로, 여기에서는 객체를 살펴보지 않는다. 일단, 프로그램을 입력하고, 컴파일하고, 실행하는 과정을 이해해야 한다.이과정은 윈도우에서나 매킨토시 컴퓨터에서나 모두 중요하게 여겨진다. 시작단계이니 단순한 예제가 좋겠다. 'Programming is fun!'이라는 문구를 화면에 띄워 보자. 프로그램 2.1은 큰 어려움 없이 이 작업을 수행하는 Objective-C 프로그램을 보여준다.


프로그램 2.1


// 첫 예제 프로그램

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  NSLog (@"Programming is fun!");

  [pool drain];
  return 0;
}


프로그램 컴파일하고 실행하기

이 프로그램에 대해 상세하게 설명하기 전에, 컴파일과 실행에 관련된 절차를 살펴 보아야 한다. Xcode 를 사용하거나, 터미널창에서 GNU Objective-C 컴파일러를 사용하여 프로그램을 컴파일하고 실행할수 있다. 이 두가지 방법을 단계별로 알아보자. 그다음에, 어느 방법을 사용하여 계속 학습할지 결정할 수 있을 것이다.


objc2_notice_01
이 도구들은 OS X 을 구동하는 맥에 이미 설치되어 있어야 한다. 만일 OS X 을 따로 설치했다면 Developer Tools 를 설치하자.


Xcode 사용하기

Xcode 는프로그램 입력, 컴파일, 디버그, 실행을 쉽게 해주는 복잡한 응용 프로그램이다. 만일 Mac 에서 중요한 응용 프로그램을 개발할 계획이라면, 이 강력한 도구는 배워 두는 것이 좋겠다. 지금은 시작하는 단계이니, Xcode 를 사용하여 그래픽 프로그램을 개발하는 과정은 나중에 다시 살펴볼 것이다.

먼저, Xcode 는 Applications 폴더 안에 있는 Developer 에 있다.[1] Xcode 를 실행하자. File 메뉴에서 New Project 를 선택하자(그림 2.2).

그림 2.1 Xcode 아이콘
그림 2.2 새 프로젝트 시작하기


그림 2.3과 같이 창이 뜰 것이다.

그림 2.3 새 프로젝트 시작하기 : 응용 프로그램의 종류 선택하기


왼쪽 구획에서 Mac OS X 섹션의 Application 을 선택하고, 오른쪽 상단 구획에서 Command Line Tool 을 선택하자.[2] 이제 그림 2.4 와 같은 창이 나타난다.

그림 2.4 새 프로젝트 시작하기 - Foundation Tool 생성
그림 2.5 Xcode 파일 목록 창


Type 을 Foundation 으로 지정하고 Choose 버튼을 클릭하면 그림 2.5처럼 새 창이 나타날 것이다.


이 첫 프로그램은 prog1 이라고 부르자. Save As 필드에 이 이름을 입력하면 된다. 모든 프로젝트를 저장할 폴더를 따로 만들고 싶다면 그렇게 해도 좋다. 내 시스템의 경우, 이 책의 모든 프로젝트를 ObjC Progs 라는 폴더에 저장해 두었다.

확장자 의미
.c C 언어 소스파일
.cc, .cpp C++ 언어 소스파일
.h 헤더파일
.m Objective-C 소스파일
.mm Objective-C++ 소스파일
.pl Perl 소스파일
.o 목적(컴파일된) 파일
표 2.1 자주 사용되는 파일 확장자


그림 2.6 Xcode prog1 프로젝트 창


Save 버튼을 눌러 새 프로젝트를 생성하자. 이제 그림 2.6과 같이 프로젝트 창이 나타날 것이다. 만일, Xcode 의 옵션을 바꾼 적이 있다면 창이 달라보일수도있다.이제 첫 프로그램에 코드를 입력해 넣을 시간이다. 오른쪽 상단 구획에서 prog1.m 을 선택하자. 이제 Xcode 는 그림 2.7과 같이 보일 것이다.

Objective-C 소스파일은 .m 을 파일 이름의 맨 마지막 글자(확장자)로 한다. 표 2.1은 자주사용되는 파일 확장자 목록이다.

그림 2.7 prog1.m 파일과 편집 창


다시 xcode 프로젝트 창으로 돌아와, 창의 오른쪽 하단을 보자. prog1.m 파일 에 다음코드가 있을 것이다.

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

  // 여기에 코드를 작성한다.
  NSLog (@"Hello World!");
  [pool drain];
  return 0;
}


objc2_notice_01
만일 파일 내용이 표시되지 않는다면, 오른쪽 하단 구획을 클릭하고 위로 드래그하여 편집 창 크기를 키워야 한다. 이전에 Xcode 를 사용하다 설정을 변경했을 가능성이 있다.


창 안에서 파일을 펀집할 수 있다. Xcode 가 바로 쓸 수 있도록 템플릿 파일을 생성해 놓았다.

펀집 창에 나타난 프로그램을 수정하여 프로그램 2.1처럼 되도록하자. 맨처음에 추가할 줄은 슬래시 문자 두 개 (//)로 시작하며, '주석'이라고 부른다. 주석에 대해서는 곧 상세히 설명할 것이다.

이제 프로그램은 다음과 같은 모양이다.

// 첫 예제 프로그램
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  NSLog (@"Programming is fun!");

  [pool drain];
  return 0;
}


화면에 나타나는 텍스트의 색상에 대해서는 걱정할 필요가 없다. Xcode 가 값, 예약어 등을 다른 색으로 표시해 준 것이다.

이에 여러분의 첫 프로그램을 컴파일하고 실행해 볼 시간이 왔다. Xcode 용어로는 build and run 이라고 한다. 먼저 File 메뉴에서 Save 를 선택하여 프로그램을 저장하자. 저장하지 않고 프로그램을 컴파일하고 실행하려 하면, Xcode 가 프로그램을 저장하려는지 물어볼 것이다.

Build 메뉴에서 Build 혹은 Build and Run 을선택할수 있다. 후자를 선택할 경우 아무 오류 없이 빌드가 성공하면 자동으로 프로그램을 실행시켜 준다. 툴 바에서 Build and Go 아이콘을 클릭하여 프로그램을 빌드하고 실행해도 된다.


objc2_notice_01
Build and Go는 '빌드한 다음, 내가 요청했던 마지막 작업을 수행하라'는 의미다. 여기서 마지막 작업이란, 프로그램의 '실행'이나 '디버그' 혹은 'Shark나 인스트루먼트와 함께 실행' 중일 수 있다. 프로젝트에서 처음 이버튼을 사용한다면, Build and Go 가 프로그램을 빌드한 후 실행하는 것을 의미하므로 이 버튼을 눌러도좋다. 그렇지만 'Build and Go'와 'Build and Run' 의 차이점은 숙지하고 있어야 한다.


만일 프로그램을 짜다가 실수했다면 이 과정에서 오류 메시지가 나타난다. 이럴 경우 뒤돌아가서 오류를 수정하고 위 과정을반복한다. 모든 오류를 프로그램 에서 제거한 후에 Build and Go 를 누르면 prog1 - Debugger Console 이라는 이름이 불은창이 새로뜰것이다. 이 창은 그림 2.8 과 유사한 형태로 프로그램 출력 결과를 보여 준다. 만일 이 창이 자동으로 뜨지 않는다면, 메인 메뉴 바에서 Run 메뉴 아래 콘솔(Console) 항목을 선택한다. 콘솔 칭에 뜨는 실제 콘텐츠에 대해서는 곧 다루겠다.

그림 2.8 Xcode 디버거 콘솔 창


이제 Xcode 로 처음 짜는 프로그램을 컴파일하고 실행하는 과정을 모두 완료하였다. (후아!)Xcode 에서 새 프로그램을 생성하는 단계를 정리했다.

  1. Xcode 응용 프로그램을 시작한다.
  2. 만일 새 프로젝트라면 File 메뉴에서 새 프로젝트를 선택한다.
  3. 응용 프로그램의 종류는 Command line Utility > Foundation Tool 을 고르고 Choose 를 누른다.
  4. 프로젝트 이름을설정하고, 프로젝트 파일을 저장할 디렉터리를 만들거나 선택하자. Save 를 누른다.
  5. 오른쪽 상단 구획에 prog1.m (혹은 프로젝트에 할당한 이름.m) 파일이 보일것이다. 그 파일을 선택하고 바로 아래 보이는 펀집 창에 프로그램 코드를 입력한다.
  6. File 메뉴, Save를 선택하여 입력한 수정 사항을 저장한다.
  7. Build 메뉴, Build and Run 혹은 Build and Go버튼을 선택하여 응용 프로그램을 빌드하고 실행시킨다.
  8. 컴파일러 오류가 발생하거나 예상치 못한 결과가 나타나면 수정하고 6단계, 7단계를반복한다.


터미널 사용하기

Objective-C 프로그래밍을 시작하기 위해 Xcode를 배우는 것을 꺼려지는 사람들도 있을 것이다. 만일 UNIX 셀과 커맨드라인에 익숙한 사람이라면, 터미널 프로그램을 사용하여 프로그램을 편집, 컴파일, 실행하고 싶을수도 있을 것이다. 어떻게 해야할까?

맨 첫 단계는 Mac 의 터미널 응용 프로그램을 실행하는 것이다. 터미널 응용 프로그램은 Applications 폴더 내의 Utilities 폴더에서 찾을수 있다. 그림 2.9는 터미널 프로그램의 아이콘이다.

이 프로그램을 실행하면 그림 2.10과 같은 창이 뜰 것이다.

그림 2.9 터미널 프로그램 아이콘
그림 2.10 터미널 창


$ (혹은 터미널 프로그램의 설정에 따라 %) 뒤에 명령어를 한 줄씩 입력한다. UNIX 에 익숙하다면, 이 방식이 수월할 것이다.

먼저 프로그램 2.1 의 코드를 파일에 입력해야 한다. 예제 프로그램을 저장할 디렉터리를 생성하고, vi 나 emacs 같은 텍스트 편집기를사용해서 코드를 입력한다.

sh-2.0a$ mkdir Prog 프로그램을 저장할 디렉터리를 생성한다.
sh-2.0a$ cd Progs 새로 만든 디렉터리로 이동한다.
sh-2.0a$ vi prog1.m 텍스트 편집기를 열어 코드를 입력한다.
..


objc2_notice_01
이전 예제와 앞으로 나을 본문에서 사용자가 입력하는 명령어는 볼드체로 표시했다.(이 문서에서는 무시)


Objective-C 파일의 이름은 원하는 대로 아무렇게나 지어도 좋다. 다만, 마지막 두 글지를 .m 으로 끝내서 컴파일러에게 Objective-C 프로그램을 작성한다고 알려야 한다.


파일에 프로그램 코드를 입력한 뒤에 GNU Objective-C 컴파일러인 gcc 를 사용하여 프로그램을 컴파일하고 링크할 수 있다. 보통 다음과 같은 gcc 명령으로 컴파일한다.

gcc -framework Foundation files -o progname


다음 옵션은 Foundation 프레임워크에 대한 정보를 사용하라고 지시한다.

-framework Foundation


커맨드라인에서 다음 옵션을 사용해야 함을 잊지 말자. files는 컴파일할 파일의 목록이다. 우리 예제에서는 prog1.m 만이 여기에 해당된다. progname 은 프로그램이 오류 없이 컴파일되었을 경우, 실행 코드를 담고 있을 파일의 이름이다.


여기서는 프로그램을 prog1 이라고 부르기 때문에, 첫 Objective-C 프로그램을 컴파일할 커맨드라인은 다음과 같다.

$ gcc -framework Foundation prog1.m -o prog1
## prog1.m을 컴파일하고prog1이라고 이름 짓는다.
$


이 명령프롬프트의 결과로 아무 메시지가 뜨지 않는다면 프로그램에서 어떤오류도 발생하지 않았다는 의미다. 이제 명령 프롬프트에서 prog1 을 입력하여 프로그램을 실행해 보자.

$ prog1 ## prog1을 실행한다.
sh: prog1: command not found
$


이전에 터미널을 사용하여 따로 설정하지 않았다면, 위와 같은 결과를 보게 될것이다. UNIX 셀(만든 프로그램을 실행시키는 응용 프로그램)은 prog1 이 어디에 있는지 (이에 대한 상세한 내용은 다루지 않을 것이다) 알지 못한다. 프로그램 이름앞에 ./ 를붙여 쉘이 현재 디렉터리에서 프로그램을 찾도록 하거나,프로그램이 저장된 디렉터리(혹은현재 디렉터리)를 쉘의 PATH 변수에 저장해줄 수 있다.

일단 첫 번째 방법을 택하자.

$ ./prog1 ## prog1을 실행한다.
2008-06-08 18:48:44.210 prog1[7985:10b] Programming is fun!
$


Objective-C 프로그램을 터미널에서 작성하고 디버깅하는 것도 유효한 방법이다. 그러나 장기적으로 볼 때 현명한 전략이라고 할 수 없다. Mac OS X이나 아이폰용 응용 프로그램을 만들고자 한다면, 응용 프로그램 번들에 실행 파일 외에 다른 것들도 '패키지로' 넣어야 한다. 이 작업은 터미널 프로그램에서 수행하기는 쉽지 않지만, Xcode 에 특화된 분야 중 하나다. 따라서 Xcode 를 사용하여 프로그램을 개발하는 방법을 추천한다. 학습하는 데 시간이 걸리겠지만 결국은 배울 가치가 있을 것이다.


첫 프로그램 설명하기

이제 Objective-C 프로그램을 컴파일하고 실행하는 데 필요한 과정에 익숙해졌으니 프로그램 자체를 살펴보자. 다시 코드를본다.

// 첫 예제 프로그램
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

  NSLog (@"Programming is fun!");
  [pool drain];
  return 0;
}


Objective-C 언어는 대소문자를 구별한다. 또한 입력이 시작되는 위치에 대해 신경쓰지 않는다. 즉, 해당줄의 맨 처음에 입력을 시작하거나 증가에서 입력을 시작해도상관없다. 이런 특징을 사용해 개발하는 프로그램의 코드를 더 읽기 쉽게 만들 수 있다.


프로그램의 첫 줄은주석이다.

// 첫 예제 프로그램


프로그램 코드에 주석문을 쓰면 프로그램을 문서화하며 가독성을 높인다. 주석은 프로그램을 읽는 사람, 즉 프로그래머 또는 프로그램 관리 책임자에게 프로그래머가 특정 프로그램이나 코드를 어떤 생각으로 작성했는지를 말해준다. Objective-C 프로그램에 주석을 입력하는 방법은 두가지다. 하나는 슬래시 문자를 두 개 연속(//)으로 쓰는 것이다. 컴파일러는 이 슬래시가 있는 줄에 나오는 모든 문자를 무시한다.

또한 슬래시(/)와 별표(.)를 사용하여 주석을 시작할 수도 있다. 이것으로 주석의 시작을 표시한다. 이런 종류의 주석은 따로 주석의 끝을 표시해야 한다. 주석을 종료하려면 * 와 / 를 아무 여백 없이 이어 사용해야 한다. 주석을 시작하는 '/*' 와 종료하는 */' 사이에 나오는 모든 내용은 주석문이 되어 Objective-C 컴파일러에서 무시된다. 이 형식은 다음 예처럼 코드에서 여러줄로나누어 주석을 쓰고자 할 때 사용된다.

/*
이 파일은 Fraction 클래스를 정의한다.
이 클래스는 분수를 나타내고 분수의 덧셈, 뺄셈 등을
수행하는 메서드를 포함한다.

추가 정보는 다음 문서를 참고하라.
/usr/docs/classes/fractions.pdf
*/


어느 주석을 사용할지는 프로그래머에게 달려 있다. /* 스타일은 중첩해서 사용할수 없으니, 이에 주의하자.

프로그램에 코딩하면서 주석문을 추가하는 습관을 들이면 좋은 이유가 세 가지 있다. 먼저, 머릿속에 특정 프로그램의 로직이 분명할 때 문서화하는 것이 프로그램을 완성한 후에 문서화하는 것보다 훨씬 쉽다. 둘째로, 이른 시기에 주석을 달면, 프로그램 로직 오류를 따로떼어 고치는 디버그단계에서 주석의 혜택을 받을 수 있다. 주석은 프로그램코드를 읽고 이해하는 것 을 도와줄 뿐 아니라, 로직에서 실수한 원인을 찾는데도 도움이 된다. 마지막으로, 내가 아직까지 정말 문서화 자체를 즐기는 프로그래머를 만난 적이 없다는 것도 한 가지 이유다. 누구나 프로그램 디버그를 끝낸 후에는 프로그램 코드로 돌아가 주석을 입력하는짓을 하고싶지 않을 것이다. 프로그램을 개발하는 동안 주석을 입력하여 이런 지겨운 작업을 좀더 쉽게 처리해 버라는것이다.

프로그램 2.1 의 다음줄은 컴파일러에게 Foundation.h 를 찾아 처리하도록 지시한다.

#import <Foundation/Foundation.h>


이 파일은 시스템 파일이다(당신이 만든 파일이 아니다). #import 는 이 파일에 있는 정보를 마치 프로그램의 그 위치에 그대로 입력된 것처럼 가져오거나 포함시키라는 의미다. Foundation.h 파일을 불러들인 이유는 프로그램에서 사용할 다른 클래스와 함수에 대한 정보가 들어 있기 때문이다.

프로그램 2.1에서 다음줄은프로그램의 이름이 main이라고지정한다.

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


main 은 프로그램 실행이 시작되는 위치를 나타내는 특별한 이름이다. main 앞에 등장하는 예약어 int 는 main 이 반환하는 값이 정수임을 나타낸다. 일단 지금은 대괄호([ ])를 무시하자. 이것들은 커맨드라인 인수와 관련 있는데, 13장 「하부 C언어 기능」에서 본격적으로 다룬다.

이제 main을 시스템에 알려 주었으므로 이 루틴에서 정확히 무엇을 할지 기술할 준비가 된 것이다. 모든프로그램 명령문을 여는중괄호({)와 닫는중괄호(}) 사이에 입력하여 루틴에서 할 일을 지정한다. 간단한 경우, 명령문은 세미콜론(;)으로 끝나는 표현식 하나로 이루어질 수 있다. 시스템은 중괄호 안에 포함된 모든 명령문을 main 루틴의 일부로처리한다.

프로그램 2.1은 명령문 네 개로 구성된다. 프로그램 2.1의 첫 명령문은 다음과 같다.

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


이 명령문은 '오토릴리스 풀(autorelease pool)'을 위한 메모리 공간을 예약한다. 이에 대해서는 17장 「메모리 관리」에서 완벽히 다룰 것이다. Xcode 는 템플릿의 일부로 프로그램에 이 코드를 자동으로 추가했다. 일단은 이 부분을 그대로 놔두자.

다음 명령문은 NSLog 라는 루틴이 호출되도록 지시한다. NSLog 루틴에 넘겨지는 매개변수 혹은 인수는 다음 '문자열' 이다.

@"Programming is fun!"


위 코드에서 문자들은 큰따옴표로 둘러싸였고 @ 부호가 맨 앞에 있다. 이것들을 통틀어 NSString 상수 객체라고 한다.


objc2_notice_01
C 프로그래밍을 해본 사람이라면 @ 문자가 햇갈릴 수도 있다. @문자가 없다면 C 스타일의 스트링 상수를 작성하는 것이고, @ 을 쓰면 NSString 스트링 객체를 작성하는 것이다.


NSLog 루틴은 간단히 인수를 표시하거나 로깅하는 Objective-C 라이브러리 함수다. 그러나 그 전에 자신이 실행된 날짜와 시간, 프로그램 이름, 아직 설명하지 않은 다른 숫자를 표시한다. 이 책에서는 우리가 원하는 출력물 외에 NSLog 가 출력하는 내용에 대해 따로 표시하지 않는다.

Objective-C 의 모든 프로그램 명령문은 세미콜론(;)으로 끝나야 한다. 그래서 예제코드에서 NSLog 호출시닫는괄호 ')' 뒤에세미콜론이바로나온다.

프로그램이 종료되기 전에, 할당된 메모리 풀(과 관련된 객체들)을 다음 명령문으로 해제 해야한다.

[pool drain];


이 역시 Xcode가 자동으로 생성하여 집어넣은 코드이고, 상세한 설명은 추후에 하겠다.

main 의 마지막 명령문은 다음과 같다.

return 0;


이 명령문은 main 실행을 종료하고 상태 값 0을 돌려주거나 혹은 '반환' 하도록 한다. 관례적으로 0은 프로그램이 정상 종료되었다는의미다. 0이 아닌 다른값은 대개 프로그램이 필요한 파일을 찾지 못했다는 등의 이유로 문제가 발생했음을 뜻한다.

만일 Xcode 를 사용하고 디버거 콘솔 창(그림 2.8 참고)을 살펴본다면, 다음 문장이 NSLog 출력문 다음에 표시되었음을 기억할 것이다.

The Debugger has exited with status 0.


이제 이 메시지가무슨의미인지 이해할 수 있을 것이다.

첫 프로그램에 대한 설명이 끝났으니 이 프로그램을 수정해 "And programming in Objective-C is even more fun!" 도 표시해 보자. 프로그램 2.2와같이 NSLog 루틴을 하나 추가하여 간단히 완성할 수 있다. Objective-C 프로그램 명령문은 세미콜론으로 마쳐야 한다는 것을 잊지 말자.


프로그램 2.2


#import <Foundation/Foundation.h>

int main (int argc, const char *argv[])
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

  NSLog (@"Programming is fun!");
  NSLog (@"Programming in Objective-C is even more fun!");

  [pool drain];
  return 0;
}


프로그램 2.2의 코드를 입력한후, 컴파일하고 실행하면 출력 결과가 다음처럼 뜰 것이다(여기서도 NSLog가 일반적으로 추가하는 내용은 표시하지 않았다).


프로그램 2.2 의 출력결과


Programming is fun!
Programming in Objective-C is even more fun!


다음 예제 프로그램에서 보겠지만, NSLog 의 출력을 여러 줄로 나누려고 NSLog 루틴을 따로 호출해 줄 필요는 없다.


먼저, 특수한 두 문자 시퀀스에 대해 얘기해 보자. 백슬래시(\)와 n을 합쳐 '새 줄 문자' 라고 부른다. 새 줄 문자는 시스템에게 자신의 이름이 뭇하는 동작을 지시한다. 즉, 새 줄 문자 다음에 나오는 문자는 화면의 다음 줄에 표시된다. 사실, 새 줄 문자는 타자기에 있는 캐리지리턴키와 개념이 거의 유사하다.


프로그램 2.3의 코드를 보고 출력 결과가 실제로 어떻게 나을지 생각해 보자(프로그램을 돌려보기 전에 지금 바로 추측해 보자).


프로그램 2.3


#import <Foundation/Foundation.h>

int main (int argc, const char *argv[])
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

  NSLog (@"Testing...\n..1\n...2\n....3");
  [pool drain];
  return 0;
}

프로그램 2.3 의 출력결과


Testing...
..1
...2
....3


변수의 값 표시하기

NSLog 를 사용하여 간단한 문장 외에도 변수의 값과 계산 결과도 표시할 수 있다.


프로그램 2.4는 NSLog 의 루틴을 사용하여 50과 25를 더한 결과를 표시한다.


프로그램 2.4


#import <Foundation/Foundation.h>

int main (int argc, const char *argv[])
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

  int sum;

  sum = 50 + 25;
  NSLog (@"The sum of 50 and 25 is %i", sum);
  [pool drain];
  return 0;
}

프로그램 2.4 의 출력결과


The sum of 50 and 25 is 75


main 안에 오토릴리스 풀이 설정된 다음, 첫 프로그램 명령문은 변수 sum이 정수(integer) 형이 되도록 선언한다. 변수는 사용하기 전에 선언해야 한다. 변수 선언은 프로그램 내에서 그 변수를 어떻게 사용해야 할지를 Objective-C 컴파일러에게 지정해 주는 것을 말한다. 컴파일러는 이 정보를 사용하여 변수에 값을 담거나 찾아오는 올바른 인스트럭션을 생성한다. int형으로 정의된 변수는 소수점이 없는 정수 값만 저장할 수 있다. 정수 값의 예는 3, 5, -20,0 등이 있다. 2.14, 2.455, 27.0 같이 소수점이 있는 수는 부동소수점 수와 실수다.


정수변수 sum은 두정수 50과 25를 더한 결과를 저장한다. 이 변수를 정의한 다음 줄을 일부러 비워서 프로그램 명령문의 루틴에서 변수 선언을 시각적으로 분리하였다. 이것은 프로그래밍 스타일 의 문제이니, 원하는대로 해도 좋다. 때로 빈줄을 추가하여 가독성을 높이기도 한다.


덧셈을 수행하는 프로그램 명령문은 대다수 프로그래밍 언어와 거의 유사하다.

sum = 50 + 25;


50이 25에 더해지고(덧셈 기호) 그 결과는 변수 sum에 저장(=, 대입 연산자)된다. 프로그램 2.4 의 NSLog 루틴 호출에서는 괄호 안에 인수가 두 개 있다. 이 인수들은 쉼표로 분리한다. 첫 인수는 언제나 화면에 드러날 문자열이다. 문자 스트링이 표시될 때, 이따금 프로그램의 변수값도 표시하고 싶을 것이다. 지금 예제에서는 변수 sum의 값을 다음 문자들 다음에 표시하려 할 것이다.

The sum of 50 and 25 is


첫 인수 내의 퍼센트 문자는 NSLog 함수가 이해하는 특수 문자다. 퍼센트 문자 바로 뒤에 나오는 문자는그 지점에 표시될 값의 데이터 형을 지정한다. 앞 예제에서 NSLog 루틴은 정수값이 표시됨을 나타내는 문자 i 를 인식한다.


NSLog 루틴이 문자 스트링에서 %i 문자를 찾으면, 자동으로 루틴의 다음 인수값이 표시된다. sum 이 NSLog 의 다음 인수이기 때문에, 그 값이 자동으로 "The sum of 50 and 25 is" 다음에 표시된다.


이제 프로그램 2.5의 출력 결과를추측해 보자.


프로그램 2.5


#import <Foundation/Foundation.h>

int main (int argc, const char *argv[])
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  int value1, value2, sum;

  value1 = 50;
  value2 = 25;
  sum = value1 + value2;

  NSLog (@"The sum of %i and %i is %i", value1, value2, sum);

  [pool drain];
  return 0;
}

프로그램 2.5 의 출력결과


The sum of 50 and 25 is 75

int value1;
int value2;
int sum;


main 내의 두번째 프로그램 명령문은 value1, value2, sum 이라는 정수형 변수 세 개를 정의한다. 이것은 다음처럼 세 명령문 으로 나누어 표현해도 동일하다.

int value1;
int value2;
int sum;


세 변수를 정의한 뒤, 프로그램은 변수 value1에는 50을, 변수 value2에는 25를 대입한다. 그후,이 두변수의 합이 계산된 결과가변수 sum에 대입된다.


이제 NSLog 루틴을 호출하면 인수가 네 개 포함된다. 첫 번째 인수는 보통 '형식 문자열' 이라고 부르며 시스템에게 나머지 인수가 어떻게 표시되어야 하는지 설명한다. 두 번째 인수 value1 의 값은 'The sum of' 다음에 바로 표시된다. 이런식으로 그 다음 인수 value2 와 sum 의 값도 포맷 스트링에서 다음 %i 문자로 지시한 위치에 표시된다.


요약

이 장에서는 Objective-C로 프로그램을 개발하는 것을 간단히 소개했다. 여기까지 봤다면 아마 Objective-C 로 프로그램을 짜는 과정이 꽤 괜찮다고 느꼈을 것이다. 이제 혼자서도 작은 프로그램 정도는 개발할 수 있을 것이다. 다음 장에서는 강력하고도 유연한 이 언어의 좀더 복잡한 면을 살펴본다. 그러나 다음장으로가기 전에, 연습문제를풀며 이 장에서 배운 개념을 분명히 익히자.


연습문제

1. 이번 장에 나온 프로그램 다섯 개를 입력하고 실행해 보라. 각 프로그램의 실제 출력 결과를 책에 나온 결과와 비교하라.


2. 다음 텍스트를 표시하는 프로그램을 작성하라.

In Objective-C, lowercase letters are significant.
main is where program execution begins.
Open and closed braces enclose program statements in a routine.
All program statements must be terminated by a semicolon.


3. 다음 프로그램의 출력 결과는 어떻게 나을까?

#import <Foundation/Foundation.h>

int main (int argc, const char *argv[])
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init;
  int i;

  i = 1;
  NSLog (@"Testing...");
  NSLog (@"....%i", i);
  NSLog (@"...%i", i + 1);
  NSLog (@"..%i", i + 2);

  [pool drain];
  return 0;
}


4. 87에서 15를 빼고 그 결과를 적절한 메시지와 함께 표시하는 프로그램을 작성하라.


5. 다음 프로그램에서 구문 오류(syntatic error)를 찾아내라. 그 다음에는 오류를 수정하여 프로그램을 작성하고 실행하라.

#import <Foundation/Foundation.h>

int main (int argc, const char *argv[]);
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    INT sum;
    /* 결과를 계산한다. //
    sum = 25 + 37 - 19
    / 결과를 표시한다. /
    NSLog (@'The answer is %i'sum);

    [pool drain];
    return 0;
}


6. 다음 프로그램의 출력 결과는 어떨까?

#import <Foundation/Foundation.h>

int main (int argc, const char *argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int answer, result;

    answer = 100;
    resule = answer - 10;

    NSLog (@"The result is %i\n", result + 5);

    [pool drain];
    return 0;
}


Notes

  1. (옮긴이) 보통은 /Developer 폴더에 들어 있다.
  2. (옮긴이)Xcode 3.1.2 이전 버전을 사용 중이어서 화면이 조금 다른 경우, 왼쪽 구획의 Commane Line Utility 를 선택하고 오른쪽 상단구획의 Foundation Tool 을 선택한 후 Choose 버튼을 누르면 그림 2.5 같은 새 창을 확인할 수 있다