처음
지금까지 만든 코드는 우리들 인간이 읽을 수 있는 단순한 텍스트에 지나치지 않습니다. 그러나 그것은 완전한 인간의 문장이라고도 말할 수 없고, 그렇다고 해서 Mac이 이해할 수 있는 수준은 아닙니다. 이것만으로는 아무런 가치도 없습니다. 당신이 쓴 프로그램 코드를, Mac이 실행가능한 런타임 코드로 변환하기 위해서는, 컴파일러라고 불리는 특수한 프로그램이 필요합니다. 그것은 애플이 무상으로 제공하고 있는 Xcode개발 환경에 포함되어 있습니다. 우선은 Mac OS X 디스크로부터 Xcode를 인스톨해 주십시오. 그리고 http://developer.apple.com으로부터 항상 최신판을 다운로드하게 유념해주십시요(다운로드에는 무료인 등록이 필요합니다). 

프로젝트 작성
인스톨한 Developer폴더내의 Applications폴더에 들어 있는 Xcode를 기동해 주십시오. 처음으로 기동할 때는, Xcode는 당신에게 두세번 질문을 할 것입니다. 모두는 환경설정으로 뒤에서 변경할 수 있으므로, 우선은 디폴트의 설정을 선택해 두면 문제 없습니다. 그리고 다음에 「파일」메뉴로부터 「New Project」을 선택합니다. 현재 사용가능한 프로젝트 타입의 리스트가 다이얼로그로 표시됩니다. 

 
Xcode어시스턴트를 사용해서 프로젝트를 작성
여기에서는 GUI를 가지지 않는 간단한 Objective-C프로그램을 만들것이기에, 윈도우 아래 쪽에 있는 「Command Line Utility」 아래로부터 「Foundation Tool」을 선택해 주십시오. 


이름과 저장장소를 선택
「justatry」등등의 어떠한, 어플리케이션(application)의 이름을 넣어 주십시오. 다음에 프로젝트 파일을 저장하는 장소를 선택하고 「완료」버튼을 클릭합니다. 
 지금 만든 프로젝트는 터미널에서 실행할 수 있습니다. 만약 그렇게 하고 싶을 때,그리고 얼마나의 수고를 줄이고 싶을 경우는 프로젝트의 이름은 단어 하나정도로 해 주십시오. 또 관습적으로 터미널에서 실행하는 프로그램의 첫머리 문자는 소문자를 사용하게 됩니다. 반대로 GUI를 가지는 프로그램의 이름은 대문자로부터 시작합니다. 

Xcode를 사용
그건 그렇고, 당신은 이제 프로그래머로서 이제부터 몇번이나 보게 될 윈도우를 열고 있습니다. 윈도우에는 두개의 프레임이 있습니다. 왼쪽은 프로그램을 만들어 내는 모든 파일을 조작하기 위한 「그룹과 파일」프레임입니다. 현재로서는 표시되고 있는 파일이 많이 있지 않습니다만, 다국어대응의 GUI프로그램을 만들 때는 여러가지 언어의 GUI를 위한 많은 파일이 여기에 두어집니다. 파일은 그룹화되어 폴더 안에 넣을 수 있습니다만, 이 폴더는 어디까지나 Xcode의 내부의 내용이고, 당신의 Mac의 하드 디스크 안에 대응하는 폴더는 없습니다. Xcode는 당신의 파일를 정리하기 위해서 가상적인 폴더 기능을 제공하고 있습니다. 


「그룹과 파일」프레임으로부터 「justatry」그룹을 열고, 「Source」라고 하는 그룹을 열어 주십시오. 안에 「justatry.m」이라고 하는 파일이 있습니다 [1]. 모든 프로그램은 main()이라고 하는 이름의 함수를 가지고 있다라고 하는 것을 기억하고 있습니까? 이 파일이 main()함수를 가지고 있습니다. 이 장의 후반에 이 코드를 변경합니다. justatry.m파일을 더블 클릭에서 열면, 당신은 조금 놀랄수도 있으겁니다. 애플은 당신을 위해서 이미 main()함수를 준비해 주고 있습니다. 
[##_http://tklee-notes.tistory.com/script/powerEditor/pages/1C%7Ccfile6.uf@170962414E028FAD029407.png%7Cwidth=%22740%22%20height=%22511%22%20alt=%22%22%20filename=%2205-03_xcode_window.png%22%20filemime=%22image/jpeg%22%7C_##] 
Xcode로 main()함수를 표시하고 있는 중
[1]
#import <Foundation/Foundation.h>
int main (int argc, const char * argv []) // [1.3]
{
  NSAutoreleasePool * pool =[[NSAutoreleasePool alloc] init ];// [1.5]

  // insert code here...  
  NSLog(@”Hello, World!”) ;
  [pool release];// [1.9]
  return 0;
}

프로그램을 슬쩍보고, 이해가 갈 것 같은 부분을 발견해서 봅시다. 
·NSLog ()등의 함수를 사용하기 위해서 필요한 import명령은 샤프기호#로부터 시작된다
·main()함수
·이 프로그램의 내용을 기술하기 위한 안괄호
·코드를 쓰게 지시하는 코멘트
·화면위로 문자열을 표시하기 위한 NSLog()명령
·돌아감 값을 돌려주는 return  0;명령

아직 당신이 이해가 가지 않는 행도 몇갠가 있습니다. 
·main()함수의 괄호 안에 있는 두개의 묘한 인수 [1.3]
·NSAutoreleasePool로부터 시작되는 명령 [1.5]
·pool과 release라고 하는 단어를 포함하는 또하나의 명령 [1.9]

혹시 내가 독자라면, 잘 모른 곳투성이의 코드를 보여줄때「나중에는 반드시 알게될꺼야」라고 들으면 그다지 기쁘지 않습니다. 그러므로 나는 이 가이드로 사전에 함수의 개념에 대해서 설명해 두었습니다. 그래서, 지금 모르는 것은 그다지 많지 않은 것이 아닐까라고 생각합니다. 
 함수는 프로그램을 구조화하는 수단이며, 모든 프로그램은 main()을 가지고, 함수란 어떤 것인가를 이미 배웠습니다. 그러나 유감스럽지만 샘플[1]의 내용을 지금 당장 모두를 설명할 수는 없습니다. 죄송합니다만, 이것들의 명령 (즉 [1.3, 1.5, 1.9])에 대해서는 당분간 무시해 주십시오. 간단한 프로그램을 쓸 수 있게 되기 위해서, 기억해 두어야 할 Objective-C의 문법이 이외에 몇갠가 있습니다. 그러나 다행인 것은 이미 당신은 특히 어려운 둘의 장을 이미 클리어하고 있어서 다음의 세개의 장은 매우 간단하는는 것입니다.(그 앞 다시 어려운 내용에 들어갑니다). 
 만약 당신이 정말로, 아무런 설명도 없이 나아가는 것이 싫으면, 이 요약을 읽어 주십시오. 
main함수의 두개의 인수는 프로그램을 터미널에서 실행하기 위해서 필요하게 됩니다. 프로그램은 실행시에 메모리를 확보합니다. 프로그램의 실행이 끝나면, 그 프로그램이 확보하고 있었던 메모리는, 메모리를 필요로 하고 있는 다른 어플리케이션에 받습니다. 당신의 프로그램이 필요로 하고 있는 메모리를 확보하는 것은, 프로그래머로서의 당신의 일입니다. 또 작업이 끝나면 확보하고 있었던 메모리를 해제합니다. (다른 어플리케이션이 사용할 수 있는 상태로 한다) 것도, 똑같이 중요한 일입니다. 이 메모리의 처리가 pool을 포함하는 두개의 명령이 하고 있는 것입니다. 

빌드해서 실행
애플이 준비해 준 프로그램을 우선 실행해 봅시다. 「Build and Go」이라고 하는 이름이 붙은 쇠망치의 아이콘을 클릭하고, 프로그램을 빌드(컴파일) 해 실행해 봅니다. 


Build and Go」버튼
 
  프로그램이 실행되어, 몇개의 정보와 함께 결과가 「실행 로그」윈도우에 표시됩니다. 로그의 마지막에 「the program has exited (stopped) with return 0」이라고 표시되어 프로그램은 종료합니다. 3장 [7.9]에 main()함수는 0을 되돌린다고 배웠습니다만, 이 프로그램도 종료하기 전에 마지막부분에 제대로 0을 되돌리고 있습니다. 여기까지는 문제 없는 것 같습니다. 

버그테스트
[1]에 되돌아가서, 프로그램에 버그가 있으면 어떻게 될지 시도해 봅시다. 예를 들면 NSLog()의 내용을 다른 것으로 바꿔 끼우고, 마지막에 세미콜론을 일부러 잊어 봅시다. 

[2]
#import <Foundation/Foundation.h>
int main (int argc, const char * argv [])
{
  NSAutoreleasePool * pool =[[NSAutoreleasePool alloc] init];

//  insert code here...  
  NSLog(@”Julia is a pretty actress”) // 아이쿠, 세미콜론을 잊었다!
  [pool release];// [2.9]
  return 0;
}

툴바의 「Build」아이콘을 클릭해서 어플리케이션(application)을 빌드합니다. 빨간 원이 [2.9]줄 앞에 표시될 것입니다. 


 
Xcode가 컴파일에서 에러가 발생한 것을 경고

빨간색 동그라미를 클릭하면 윈도우의 맨아래로 경고가 간단한 설명이 표시됩니다. 
error: parse error before "release”.

「parse」는 컴파일러가 처음에 하는 것으로, source code를 처음부터 최후까지 조사하고, 컴파일러가 정확하게 이해가 가는가 아닌가를 체크하는 작업입니다. 컴파일러가 코드를 정확하게 이해가 가도록 여러가지 단서를 준비하는 것은 당신의 책임입니다. 예를 들면 import명령에는 샤프 기호#을 붙이지 않으면 안됩니다. 그리고 [2.8]줄의 끝을 명확히 하기 위해서, 문장의 마지막에는 세미콜론을 붙일 필요가 있습니다. 컴파일러가 [2.9]줄까지 오면 무엇인가 이상한 것에 알아 차립니다. 그러나, 문제는 이 행이 아니고, 세미콜론을 붙이는 것을 잊은 그 전의 행에 있다고 하는 것까지는 컴파일러는 모릅니다. 여기에서 중요한 것은, 컴파일러는 될수 있는 한 이해하기 쉬운 피드백을 하지만, 실제로 그 경고는 (상당히 정확하게 가깝지만) 반드시 버그가 정확한 장소와 내용을 내보이고 있다고는 할 수 없다고 하는 것입니다. 
 세미콜론을 추가하고, 프로그램이 다음에는 정확하게 동작하는 것을 확인해 주십시오. 
 
처음의 어플리케이션(application)
이전 장에서 만든 코드를 가지고 와서, 애플이 준비해 준 코드 [1]에 끼워 넣어 봅시다. 샘플 [3]과 같이 됩니다.
 
[3]
#import <Foundation/Foundation.h>
float circleArea (float theRadius);// [3.3]
float rectangleArea (float width,float height);// [3.4]
int main (int argc, const char * argv []) // [3.6]
{
  NSAutoreleasePool * pool =[[NSAutoreleasePool alloc] init ];
  int pictureWidth;
  float pictureHeight, pictureSurfaceArea, circleRadius,  circleSurfaceArea;
  pictureWidth = 8;
  pictureHeight = 4.5;
  circleRadius = 5.0;
  pictureSurfaceArea = pictureWidth * pictureHeight;
  circleSurfaceArea = circleArea(circleRadius);// [3.16]
  NSLog(@”Area of picture:%f.   Area of circle:% 10.2f. ", pictureSurfaceArea, circleSurfaceArea);
  [pool release];
  return 0;
}

float circleArea (float theRadius)// [3.23]
{
  float theArea;
  theArea = 3.1416* theRadius * theRadius;
  return theArea;
}

float rectangleArea (float width,float height)// [3.30]
{
  return width*height;
}

우선은 시간을 들여서 이 프로그램의 구조를 파악해주십시요. 자작 함수circleArea() [3.23]와 rectangleArea() [3.30]의 헤더(함수 프로토타입 선언)이 main()함수 [3.6] 앞에 두어지고 있습니다. 그것들의 자작 함수는 main()함수 [3.5] 안괄호의 밖에 놓여 있습니다. 그리고 이전에 만든 main()함수의 내용을, 애플이 코드를 기입하라고 코멘트로 지시하고 있는 장소에 두었습니다. 
 이 코드를 실행하면, 이하와 같은 결과가 표시될 것입니다. 

Area of picture:36.000000. Area of circle:78.54.
justatry has  exited with status  0.

디버그
프로그램이 더욱 복잡하게 되다보면, 디버그가 보다 어려워집니다. 그 때문에, 프로그램이 실행중에, 안에서 도대체 무엇이 일어나고 있는 것일지 조사할 필요가 나옵니다. Xcode라면 간단히 그것을 할 수 있습니다. 
변수의 값을 알고 싶은 장소의, 코드 왼쪽의 회색 여백을 클릭하는 것 뿐입니다. Xcode는 파란색의 화살표 아이콘을 거기에 삽입하고, 「breakpoint」 (프로그램의 실행을 일시적으로 정지해서 내용을 체크하기 위한 포인트)을 설정합니다. 여기에서는 아래와 같이 [3.16]에 breakpoint를 두어 봅시다. 

      
breakpoint를 세트
breakpoint에서 처리가 멈추었을 경우, 멈춘 행의 처리는 아직 실행되고 있지 않습니다. 즉 어떤 계산 결과를 확인하고 싶을 경우, 그 계산의 행에 breakpoint를 두면 멈추었을 때에는 아직 계산이 실행되지 않고 있다라는 것에 주의해 주십시오. 그 때문에 보통 확인하고 싶은 계산의 다음 행에 breakpoint를 두게 됩니다. 
 그러면 다음에 쇠망치 아이콘을 길게 클릭해 주십시오. 메뉴가 표시됩니다. 


빌드와 실행 팝업메뉴(pop-up menu)
여기서 「Build and Go (Debug)」를 선택해 주십시오. 아래와 같은 윈도우가 표시됩니다. 

 
Xcode의 debugger를 사용하는 것으로 한줄한줄 프로그램을 실행해서 변수의 변화를 확인할 수 있는 프로그램은 최초의 breakpoint까지 실행됩니다. 윈도우 오른쪽상의 페인에서는, 여러가지 변수의 값을 확인할 수 있습니다. breakpoint에서 멈춘 뒤로 변경된 값은 적색으로 표시됩니다. 프로그램을 계속해서 실행하기 위해서는 「Continue」 버튼을 누릅니다. 이 debugger는 매우 강력한 툴입니다. 잠시동안 여러가지 시도해 보아, 사용방법에 익숙해 주십시오. 

정리
Mac OS X용 간단한 프로그램을 작성해서 디버그해서 실행하는 내용은 이것으로 끝입니다. 
만약 당신이 GUI를 가지는 프로그램을 만들지 않는 것이라면, 이제부터 당신이 해야 할 것은 보다 세련된 비GUI프로그램을 개발 할 수 있게 Objective-C로 관한 지식을 늘리는 것만입니다. 이 앞의 몇장으로 우리들이 하는 것은 정말로 그것입니다. 차후에, 결국 GUI베이스의 어플리케이션(application)에 도전합니다. 열심히 합시다! 

원문 http://www.cocoalab.com/?q=node/11 

'become Xcoder' 카테고리의 다른 글

07:반복처리  (0) 2011.06.21
06:조건분기  (0) 2011.06.21
05:프로그램을 컴파일해서 실행  (0) 2011.06.21
04:화면에 표시하기  (0) 2011.06.21
03:함수  (0) 2011.06.21
02:노 코멘트(no comment)? 그것은 안됨!  (0) 2011.06.21
Posted by tklee

댓글을 달아 주세요