2009년 12월 23일 수요일

아이폰 개발 : 프로그래밍 초보가 보는 C언어 초석 다지기

매끄럽진 않지만 아이폰의 국내 도입과 함께 아이폰 개발에 뛰어들고 싶으신 많은 분들 중 프로그래머가 아닌 분들을 위해서 아래의 C 언어 튜토리얼을 번역합니다.

C 언어는 아이폰 어플리케이션 개발 언어인 Objective-C 언어의 전신이 되는 언어이며, 아래는Objective-C를 익히기 위해 필요한 최소한의 C 언어의 개념들이며, 당연히 프로그래밍 언어에 약한 분들이 우선적으로 보셔야 할 부분이 아닌가 싶습니다.

불행히도 프로그래밍 언어에 전혀 무지하신 분들에게는 다소 어려운 내용이 될 수 있지만, 아주 기초적인 부분만 인지하고 있더라도 아래의 튜토리얼이 크게 유용할 것입니다. 또한 아래는 Mac OS X 의 Termianl 환경에서 진행되지만, Window 환경에서도 문제 없을 것입니다.

여유가 된다면 Objective-C에 대한 튜토리얼도 번역할 예정이며, 마지막으로 제 번역이 프로그래밍 언어를 배우고자 하시는 분들에게 도움이 되길 바라며 유용하셨다면 튜토리얼 제공자(번역자 아님)에게 기부를 하는 한국인의 센스도 보여주세요. : )
Learn Cocoa

Learn C for Cocoa

이 튜토리얼은 코코아를 시작하기 위해 숙지하고 있어야 하는 C의 일부분을 설명하고 있습니다. 우리는 대부분의 컨셉을 하나의 페이지 또는 두개의 챕터로 구성해봤습니다. 지나치치 마시고 각각의 섹션에 주의를 기울여 보세요.

여러분들은 최소한 함수와, 변수, 루프를 포함하고 있는 하나의 스크립트 또는 프로그래밍 언어를 숙지하고 계셔야 합니다. 그리고 우리는 OS X Terminal 에서 명령을 입력할 것입니다.

Cocoa Dev Central 튜토리얼은 Scott Stevenson 이 작성 했습니다.

튜토리얼 작성에 무수히 많은 시간을 보냈습니다. 만일 당신이 찾아낸 이 튜토리얼이 유용했다면 우리에게 기부를 해주세요. 우리가 기부를 많이 받을 수록 글쓰기에 더 심혈을 기울일 수 있답니다.


Suggested amounts: Useful: $5 | Very Useful: $12 | Priceless: $21

 

Skills Check

계속하기전에 아래의 코드를 충분히 이해하는지 확인 해보세요.
function display_area_code ($code)
{
print ("$code ");
}

$area_codes[0] = 408;
$area_codes[1] = 650;
$area_codes[2] = 510;

/* this is a comment */
$count = 3;

for ($i = 0; $i < $count; $i++)
display_area_code ($area_codes[$i]);


이 예는 function, a print statement, a comment, an array, varuables 그리고 loop를 가지고 있습니다. 만일 이걸 감지하신다면 당신은 이 튜토리얼을 시작할 준비가 되어 있습니다.

(번역자 노트. 튜토리얼이 아주 기초적인 부분은 생략되어 있을 것 같네요. 아마도 코드에 나타나 있는 배열이라던가, 제어문에 대한 설명은 다루지 않을것 같네요. 하지만, 너무 걱정하지 마세요 배열, 제어문 등은 아주 많은 자료가 있답니다.)

예제를 타이핑 하는대신 아래의 디스크 이미지를 이용하세요.
: All examples for tutorial

Mac OS X에 인스톨된 Xcode로 빌드를 해야하지만, 여기의 대부분의 코드는 어떤 OS에서도 잘 실행 될 것입니다.


A Sample C Program


이것이 첫번째 C 프로그램 입니다. text1.c라는 이름의 빈 텍스트 파일에 이 예제 코드를 복사해 보겠습니다.

test1.c

#include <stdio.h>

main ()
{
printf ("I'm a C program\n");
}

#include <stdio.h> 는 C 코드에서 input 과 output 구문을 포함하고 있습니다. 우리는 printf 함수를 사용하기 위해 필요합니다.

두 번째 줄은 모든 C 프로그램들이 가지고 있는 메인 함수를 정의하고 있습니다.

마지막으로, printf 함수를 커맨드 라인에 보여줄 몇글자와 함께 적어보았습니다. /n를 텍스트에 포함시킴으로써 다음에 오는 문자열은 다음 줄에 나타나게 됩니다.


Use GCC to Compile

Terminal을 열고 text.c 파일의 디렉토리를 변경 해보겠습니다. "gcc text1.c -o text1." 커맨드를 입력합니다. 프로그램을 실행시키고 "./text1" 을 커맨드 라인에 입력합니다.

만일 에어를 본다면, 샘플 소스 코드를 정확히 입력했는지 다시한번 확인 합니다.
 
-- Terminal 창 예시 --
host% gcc test1.c -o test1
host% ./test1
I'm a C program
host%

-o parameter 는 프로그램 파일의 이름을 gcc에 설정 해줍니다. 이걸 꺼버리면 프로그램은 "a.out"을 호출합니다.


About the Compiler

당신의 C 소스를 실행시키기 위해선 컴파일러를 이용해서 바이너리 프로그램으로 변경시켜줘야 합니다. 컴파일 프로그램은 종종 스크립트보다 빠르게 작동합니다. Mac OS X 에서 C로 쓰여진 것은 더욱 그렇습니다.

이 튜토리얼에서, 우린 gcc의 커맨드 라인을 이용해서 컴파일을 했습니다만, Xcode는 좀더 그래픽적인 모습의 같은 툴을 제공합니다.

Portability

C 프로그램은 흔히 그것이 컴파일 된 컴퓨터와 동일한 타입의 컴퓨터에선 작동 합니다. 만일, Mac OS X에서 C 소스로 컴파일 작업을 했다면, Linux와 같은 곳에선 작동하지 않습니다. 이것을 가능하게 하기 위해서, 같은 코드를 리눅스에서 컴파일 해야 합니다.

좀더 복잡한 C 프로그램들은 각각의 플랫폼에 알맞게 컴파일을 해줘야만 하는데, 이와같은 작업을 코드를 porting(포팅) 한다라고 합니다,


C Differences

이미 알고 있는 다른 언어를 C와 비교할 수 있다면 보다 쉽게 C를 익힐 수 있습니다. 만일 당신이 스크립트 언어인 PHP 또는 Perl등을 공부해 왔다면, 아래의 목록에 있는 컨셉들이 낯설게 느껴질 수 있겠습니다.
 
Basic C Concepts
compiler creates useable programs from C source
typed variables kind of data that a variable contains
typed functions the kind of data returned from a function
header files (.h) declare functions and variables in a separate file
structs groups of related values
enums lists of predefined values
pointers aliases to other variables

이것들 모두가 간단한 컨셉들 입니다. C 언어는 절대로 복잡하지 않습니다, 다른 조각들이 합꼐 놓일 수 있는데 이경우 복잡하게 보일 뿐입니다.

포인터를 제외하면, C는 PHP와 거의 유사합니다. 포인터는 컨셉적으로 트릭이 있지만, 코코아는 기본적인 프로그래밍을 위한 이런 세부적인 것들로 부터 당신을 객관화 합니다.

이 튜토리얼에서 포인터는 배우지 않을 것입니다. 이곳은 빨리 익숙해 지는것에 초점을 맞추고 있습니다. 좀더 심오한 프로그래밍을 원한다면 포인터에 대해 알아보기 위해 되돌아 갈 수 있습니다.


Typed Variables

스크립트 언어에서는 변수를 자유롭게 선언할 수 있었을 것입니다. integer number로 선언된 변수를 십진수로 바꾸거나, text로도 바꿀 수 있었을 것입니다.
 
$variable = 2;
$variable = 1.618;
$variable = 'A';

C에서는, 규칙에 좀더 엄격합니다. 반드시 명확한 변수형으로 입력된 변수 데이터를 고정하고, 타입을 변경할 수 없습니다. 이것이 C의 변수선언 입니다:

int variable1 = 2;
float variable2 = 1.618;
char variable3 = 'A';

알렸드렸듯이, 세계의 다른 변수들을 C 버전으로 정의 했으며, 각각의 모드 다른 데이터 타입으로 선언되어 있습니다.  같은 변수에 대하여 오직 한번만 변수 타입을 선언할 수 있습니다. 보시죠:
 
float variable2 = 1.618;
variable2 = 3.921;
variable2 = 4.212;


Available Types

우리의 목적을 위해, 당신이 알아야할 C의 변수 타입들 입니다:
 
Type Description Examples
int integer numbers, including negatives 0, 78, -1400
unsigned int integer numbers (no negatives) 0, 46, 900
float floating point decimal numbers 0.0, 1.618, -1.4
char single text character or symbol 'a', 'D', '?'

비록 자주보진 않겠지만, float을 더큰 소수점 수로 사용할 수 있게 해주는 double 타입, int의 보다 큰 버전인 long타입도 인지하고 있어야 합니다.

C는 당신의 고유한 변수 타입도 허용합니다.


Typed Functions

C에서, 함수에서 받을 데이터 타입을 선언해야 합니다. 리턴될 타입은 C 변수 타입 중 어떤 것이든지 가능하고, 함수 이름의 왼편에 위치하게 합니다.
int numberOfPeople ()
{
return 3;
}

float
dollarsAndCents ()
{
return 10.33;
}

char
firstLetter ()
{
return 'A';
}


또한 void 타입으로 지정할 수 있다. 지금, 값을 반환하지 않는 형태를 생각해 볼 수 있을 것입니다:

void printHello ()
{
printf ("Hello\n");
}


Types for Parameters

또한 함수에 들어갈 값의 타입도 정의해줘야 합니다. 스크립트 언어와는 다르게 디폴트 값으로 설정해 둘 수 없습니다.
int difference (int value1, int value2)
{
return value1 - value2;
}

float changeDue (float amountPaid, float costOfItem)
{
return amountPaid - costOfItem;
}



Declaring Functions

C에서,함수는 다른 코드에서 불려지기 전에 declared(이하 선언)되어 있어야 합니다. main() 전에 모든 함수들을 둘 수 있지만, 빨리 처리해야 할 많은 일이 됩니다.

function prototype(이하 함수 프로토타입)의 해결책 입니다. 이것은 함수 정의 처럼 보이지만, 중괄호와 마지막의 세미콜론을 가지고 있지 않습니다:
 
int difference ( int value1, int value2 );
float changeDue ( float amountPaid, float costOfItem );

함수 프로토타입에서, 리턴될 데이터 타입, 함수이름, 함수에 들어갈 값들 각각의 타입을 기입합니다.
 
이것들은 예입니다. text2.c 파일을 불러 내용을 붙여넣읍시다.

test2.c

#include <stdio.h>
int sum ( int x, int y );

main ()
{
int theSum = sum (10, 11);
printf ( "Sum: %i\n", theSum );
}

int sum ( int x, int y )
{
return x + y;
}

stdio.h 를 포함시켰는데 이렇게 되면 printf를 사용할 수 있습니다. 그리고 sum 함수를 프로토타입을 이용해 선언 했습니다. main 안에는 sum 함수를 호출하고 theSum이라는 변수에 결과를 넣었습니다.

sum 함수의 리턴타입을 int로 기입한것은 theSum 변수를 int로 선언할 필요가 있었기 때문입니다. 변수 타입은 합수의 리턴 타입과 일치 시켜야 합니다.

printf를 이용해서 theSum에 있는 내용을 표시 했습니다. sum 함수의 아래에서 두개의 숫자를 함께 더해 주고 있습니다. 이것을 함수 이행(function implementation)이라고 부릅니다.


Compile the Example

터미널을 열고 text2.c의 디렉토리를 변경 합니다. 그리고 컴파일 하기 위해 "text2.c -o test2" 를 적습니다.

"./test2"를 적고 프로그램을 실행 시킵니다.

-- 터미널 표시 예시 --
host% gcc test2.c -o test2
host% ./test2
Sum: 21
host%


Format Strings

어쩌면 예제 안의 %i 가 무슨 의미인지 궁금하실지도 모르겠습니다. PHP와 같은 스크립트 언어 등에서는 큰 따옴표의 안쪽에 자유롭게 변수를 끼워 넣을 수 있었을 것입니다:
 
$var1 = 3;
$var2 = 8;
print ("First value: $var1 second value: $var2");


C에서는, 텍스트(text)안에 바로 변수를 끼워넣을 수 없습니다. 반드시 변수들을 위해 format string과 함께 format markers 를 사용해야 합니다:
 
int var1 = 3;
int var2 = 8;
printf ("First value: %i second value: %i", var1, var2);
Format Markers
int %i / %d
unsigned int %u
float %f
char %c

format string 은 쌍따옴표 안쪽에 위치합니다. % maker는 변수를 나타내고 싶은 어떤 위치에서든지 두면 됩니다.

보여주고 싶은 변수 타입에 따라 %심볼 옆에 문자열을 두면 됩니다. 이 경우에는 int형태의 변수로 보여주고 싶었기 떄문에 %i를 사용했습니다.

format string 은 콤마를 대등하고, 각각 당신이 사용한 maker에 변수 이름과 매칭됩니다. 쌍따옴표가 닫혀진 뒤의 위치에 각각의 콤마가 차례대로 매칭된다는 것에 주의하세요.

코코아 프로그램은 printf 대신 NSlog를 사용하지만, 포맷팅(formatting)룰은 거의 동일합니다.


Type Casting

가끔씩 미리 정의해둔 변수의 타입을 다른것으로 바꿀 필요가 있을 것입니다. 예를들면, float타입으로 정의해둔 변수지만 함수에서는 int형 변수를 필요로 할 수 있습니다.

어쩌면 아무런 오류없이 플롯형의 변수를 그대로 사용할 수 있을지도 모릅니다만, 변경을 하는 편이 좋습니다. 이런 변경을 casting이라 불립니다.
int multiply (int x, int y)
{
return x * y;
}

int trips = 6;
float distance = 4.874;

int approxDistance = (int)distance;
int total = multiply ( trips, approxDistance );

casting은 변수의 옆에 바꾸고자 하는 타입을 괄호속에 넣어 위치시키는 간단한 방법으로 가능합니다.

casting의 결과는 어떤 변수를 어떻게 변경하느냐에 따라 결정됩니다. float 타입의 변수를 int 타입으로 변경하게 되면 소수점 자리를 버린채로 변경되게 됩니다. casting은 숫자를 반올림하거나 하지 않습니다.

casting은 일시적인 변경을 해줄뿐 변수 자신의 타입이 변경되는 것은 아닙니다. 예에서 보듯이 distance는 후에도 여전히 float 타입의 변수로 남아있게 되는데 int형으로의 사용을 원한다면 매번 int형으로 casting을 해줘야 합니다.


More Casting Examples

이번의 예에서는 approxDistance 변수 없이 함수를 호출해보겠습니다. 대신, 함수안에서 cast를 하면 됩니다.:
int result = multiply (trips, (int)distance);

가끔씩 함수로 부터 산출되는 값을 다른 타입의 변수로 변경해야 하는 경우가 생깁니다. 아래와 같이 따라해 보십시오:
int multiply (int x, int y)
{
return x * y;
}

float result;

result = (float) multiply (3, 6);

함수의 정의에서, 저는 multiply의 리턴 값을 int로 볼 수 있었습니다. 하지만 float 타입으로 결과를 저장하기를 원했고, 함수가 호출될 때 함수 이름의 앞에 (float)을 cast 했습니다. 결과로 변수에 18.0의 값을 갖게 했습니다.


Header Files

C에선 함수들을 사용하기 전에 그것들을 먼저 선언해야 합니다, 이는 함수간 연관관계 선언에 도움을 주고 단일 공간에서 관리를 편리하게 합니다. 이것이 헤더파일이 하는 일입니다.

헤더파일들은 큰 프로젝트에서 매우 중요한데 이는 소스 코드의 모든 라인을 보지 않아도 소스코드의 전반적인 부분을 확인할 수 있도록 해주기 때문입니다.


Create a Header File

여기에 헤더파일의 예제가 있습니다. math_functions.h 파일에 내용을 복사 합니다.
 
math_functions.h

int sum (int x, int y);
float average (float x, float y, float z);

여기에 function implementations가 있습니다. 불러들인 math_functions.c 파일에 붙여넣기 하세요.
 
math_functions.c

int sum (int x, int y)
{
return (x + y);
}

float average (float x, float y, float z)
{
return (x + y + z) / 3;
}

averrage 함수에서, 괄호안에 더하기 연산자만을 넣고 괄호 밖에서 나누기 연산자를 이용 했습니다. 그렇게 하지 않았다면 나누기 연산자와 연결된 마지막 숫자만 나누어 졌을 것입니다. 이러한 방식은 수학 연산자의 연습에 유용합니다.

(번역자 노트. 너무 기초적인 내용이라 혹시 심오한 뜻이 있을까 하시는 분들이 있을 까봐 노트를 남겨보자면, 이 튜토리얼 자체가 C를 전혀 모르는 사람을 대상으로 작성되어 있다는 것을 감안해 주세요. :D )


Using Header Files

여기에 헤더파일에 선언된 함수를 사용함 프로그램이 있습니다. test3.c 파일에 내용을 복사합니다.

test3.c

#include <stdio.h>
#include "math_functions.h"

main ()
{
int theSum = sum (8, 12);
float theAverage = average (16.9, 7.86, 3.4);
printf ("the sum is: %i ", theSum);
printf ("and the average is: %f \n", theAverage);
printf ("average casted to an int is: %i \n", (int)theAverage);
}

stdio.h 이후에 math_function.h를 포함(include) 시켰습니다. 이렇게 해두면 프로그램에서 sum과 average 함수들을 호출할 수 있습니다.

main안에, sum 함수를 호출했고 그 결과를 int변수에 넣었습니다. 그리고 average 함수를 호출하고  그 결과를 float 변수에 넣었습니다.

프로그램에서 printf를 세번 사용하고 있습니다. 한번은 theSum 변수를 int로 표시하기 위해 %i 심볼과 함께 사용했고, 한번은 theAverage 변수를 float로 표시하기 위해 %f와 함께 사용했으며, 마지막으로 theAverageint로 표시하기 위해 %i로 casting 한것과 함께 사용 했습니다.

stdio.h는 꺽쇠 괄호 안에 존재하게 되는데 이것은 C 라이브러리(좀더 자세한건 이후에 설명)에서 온것이기 때문입니다. math_function.h 파일은 이 프로그램에서 명시하기 위해 쌍따옴표 안에 넣습니다.


Compile the Example

아마 여러분들은 세개의 파일을 가지고 있을 텐데요, 모두를 같은 디렉토리 안에 넣어봅시다:

math_functions.h - math function declarations
math_functions.c - math function implementations
test3.c - the actual program

스위치를 다시 터미널로 하고, 세개의 파일이 담긴 디렉토리로 변경 합니다. 프로그램을 컴파일 하기 위해서 "gcc test3.c math_functions.c -o test3" 이라고 입력합니다.

"./tset3" 을 입력해서 프로그램을 실행 해봅시다.

-- 터미널 예시 --
host% gcc test3.c math_functions.c -o test3
host% ./test3
the sum is: 20 and the average is: 9.386666
average casted to an int is: 9
host%

이번 시간 우리는 gcc에게 두개의 input 파일을 주었습니다: test3.c 와 math_functuons.c. gcc 명령은 단일 프로그램 안에서 두개로 이루어진 .c 파일들의 내용을 합쳤습니다.

커맨드 라인에 math_functuons.h 헤더 파일의 목록은 필요하지 않았습니다. 단지 #include 구문을 대신했을 뿐인데 말이죠.


Structs

Structs(이하 구조체)는 변수들의 그룹을 구조화 한것입니다. 여기에 노래 정보들을 입력해놓은 것을 디자인한 구조체 예시가 있습니다.
 
typedef struct {
int lengthInSeconds;
int yearRecorded;
} Song;
Struct Diagram
이것은 마치 제가 두개의 int 변수를 선언한것 처럼 보이지만, 실제적으론 새로운 타입의 변수를 만든 것입니다. typedef 구문은 구조체에 이름을 할당한 것입니다. 이경우 이름을 Song 이라고 했군요.

저는 모든 Song 변수를 두 값으로 고정하여 선언 할 것입니다: lengthInSecondsyearRecorded. 이 경우, 두 필드들은 int 변수로 고정 되지만, 구조체 선언안의 필드는 어떤 타입이든지 될 수 있습니다.

구조체를 한번 정의 했다면, 여러분은 같은 방법으로 int, float 또는 char 등을 사용할 수 있습니다. 여러분이 원하는 만큰 Song 변수들을 만들 수 있으며 각각은 그들 고유의 length 와 year을 갖게 됩니다.

여러분들은 dot syntax를 이용해서 구조체 안의 필드에 값을 할당할 수 있습니다:
Song song1;

song1.lengthInSeconds = 213;
song1.yearRecorded = 1994;

Song
song2;

song2.lengthInSeconds = 248;
song2.yearRecorded = 1998;

저는 song1이라고 불리는 변수를 만들었고 Song이라는 타입을 주었습니다. 그리고 dot syntax를 이용해서 length 와 year를 설정 했습니다. song2 변수 역시 Song 타입이지만 각각의 필드들은 다른 값을 가지고 있습니다.


Structs in Functions

함수들은 input 또는 output 처럼 구조체를 지정할 수 있습니다. 이런 함수 선언과 구조체는 스스로 헤더페일에 놓일 수 있습니다.

song.h 파일에 아래의 코드를 붙여 넣어 봅시다.
song.h

typedef struct {
int lengthInSeconds;
int yearRecorded;
} Song;

Song make_song (int seconds, int year);
void display_song (Song theSong);

이 헤더파일에서 저는 Song 구조체를 정의 했습니다. 또한 make_songdisplay_song 두개의 함수를 선언 했습니다. 이제 우리는 method(이하 메소드) 구현을 만들 필요가 있습니다.

song.c  파일에 아래의 코드를 붙여 넣어 봅시다.
song.c

#include <stdio.h>
#include "song.h"

Song make_song (int seconds, int year)
{
Song newSong;
newSong.lengthInSeconds = seconds;
newSong.yearRecorded = year;
display_song (newSong);
return newSong;
}

void display_song (Song theSong)
{
printf ("the song is %i seconds long ", theSong.lengthInSeconds);
printf ("and was made in %i\n", theSong.yearRecorded);
}

make_song 함수는 두개의 int 값들을 가지고 있고 Song 구조체를 반환합니다. display_song 함수는 input 처럼 어떤 Song 구조체든지 가질 수 있으며, 값들을 보여줍니다. make_song 함수가 display_song을 호출할 때 newSong이 만들어지는 것에 유념하십시오.

저는 song.c 안에 include song.h 헤더를 넣어야만 했드데 이는, 함수가 Song 타입을 이용하기 때문입니다. 여러분들도 어떤 파일이던지 Song을 이용하려면 song.h 헤더를 포함시켜야 합니다.


Structs in Use

이제 우리는 song.hsong.c 파일을 이용한 프로그램이 필요합니다. test4.c 파일에 아래의 코드를 붙여 넣으세요.

test4.c

#include <stdio.h>
#include "song.h"

main ()
{
Song firstSong = make_song (210, 2004);
Song secondSong = make_song (256, 1992);

Song
thirdSong = { 223, 1997 };
display_song ( thirdSong );

Song
fourthSong = { 199, 2003 };
}

이 프로그램에서 저는 make_song 함수를 사용한 두개의 Songs를 만들었습니다. 세번째 노래를 위해서 make_song 을 사용하기 보다 중괄호 사이에 콤마로 구분된 값을 포함한 특수한 syntax를 사용 했습니다.

노래를 만들기 위해서 제가 make_song을 호출하지 않은 라인을 유념하십시오. display_song 함수는 자동으로 호출되지 않습니다. 그래서 다음 줄에 수동으로 호출 했습니다. 네번째 노래는 같은 방법으로 만들었지만, 이를 위해 display_song을 호출하지 않았는데, 이로인해 터미널에서 출력되지 않을 것입니다.

새로운 구조체를 만들기 위해 함수를 사용하는 편이 프로세스를 보다 정확하게 컨트롤하기 좋습니다. 이 경우, 그렇게 만들어진 각각의 노래에 대한 정보를 자동으로 보여줄 수 있었습니다.


Compile the Example

이제 여러분들은 song.h, song.c 그리고 test4.c를 가지게 되었고, 그것들은 컴파일 한 후 결과를 볼수있을 것입니다.

터미널로 변경해서 세개의 파일을 포함하고 있는 디렉토리로 변경하고, "gcc test4.c song.c -o test4" 명령을 내려봅시다.

프로그램을 실행하기 위해 "./test4" 를 입력 해봅시다.

-- 터미널 예시 --
host% gcc test4.c song.c -o test4
host% ./test4
the song is 210 seconds long and was made in 2004
the song is 256 seconds long and was made in 1992
the song is 223 seconds long and was made in 1997
host%


Constants

변수의 값은 프로그램 실행을 바꿀 수 있습니다. 이와 대조적으로 상수는 선언 속에서 값을 한번만 할당하게 되고, 그 값은 프로그램이 재실행 될 때 까지 바뀌지 않습니다.
 
const float goldenRatio = 1.618;
const int daysInWeek = 7;

여러분들은 표준 C 변수타입이면 어떤 것이던지 상수의 타입으로 지정할 수 있습니다. 오직 하나뿐인 꼼수는 변수를 만들 때 값을 제공하는 것입니다.


Enums

우리는 enums 에 대하여 많은 시간을 보낼 수 있지만, 코코아와의 관련성에 초점을 맞추었기 때문에 우리는 아주, 아주 간단하게만 만들어 보겠습니다.

여기에 텍스트 검색 옵션을 정의한 Cocoa의 NSString 클래스에 기인한 enum이 있습니다:
enum {
NSCaseInsensitiveSearch = 1,
NSLiteralSearch = 2,
NSBackwardsSearch = 4,
NSAnchoredSearch = 8,
NSNumericSearch = 64
};

애플의 코코아는 연관된 상수의 일련된 그룹화를 위해 enums를 사용합니다. 이것은 종종 특정 함수의 "mode"를 설정하는 방식을 위해 사용됩니다. 상수의 값은 그저 이름이기 때문에 그렇게 중요하진 않습니다.

여기에 enum이 사용된 예가 있습니다. 열거하는 방법에 대해서 집중하시고, 이 코드가 무엇을 하는지 궂이 이해하려고 하려 애쓰지 않아도 됩니다:
[string compare:anotherString options:NSCaseInsensitiveSearch];
[string compare:anotherString options:NSLiteralSearch];


Libraries

stdio.h 파일이 모든 예제에 포함된어 있는건 표준 C 라이브러리의 일부 헤더파일이기 때문입니다. 라이브러리는 재사용 코드의 모음 입니다. 이것은 함수, 구조체, 상수 그리고 enums와 같이 정의 할 수 있습니다.

수천개에 달하는 사용 가능한 타사의 C 라이브러리들이 있습니다. 몇몇은 .c 소스 파일과 함께 무료입니다. 돈을 지불해야 하는 다른 것들은 소스 코드를 제외한 헤더파일들과 문서만 제공합니다.

Library Diagram
타 사의 라이브러리를 이용하려면 "link"와 컴파일을 해야합니다. 예를들면, 만일 제가 MySQL 데이터 베이스와 소통이 가능한 C 프로그램을 작성을 원한다면, libmysql을 링크하고 이것들의 헤더들을 나의 프로그램에 포함(include)시킬 것입니다.

다른사람에 의해 만들어진 코드를 사용하고자 할 때 그것들의 사용조건을 알아두는 것이 중요합니다. 예를 들자면, 몇몇의 라이센스들은 여러분의 어플리케이션에 소스 코드를 모두 공유하기를 요구할 수 있습니다.

만약 여러분들의 모험심을 느껴보고 싶으시다면, 기본적으로 C 헤더 파일들이 위치한 /usr/include 를 살펴보십시오.


Final Example

여기에 이 튜토리얼의 거의 모든 컨셉들이 사용된 마지막 프로그램이 있습니다. 프로그램을 따라오기전에 아래의 파일들이 필요합니다.

math_functions.h - math function declaration
math_functions.c - math function implementations
song.h - Song struct and related function declarations
song.c - implementation of the Song functions

final.c 파일에 아래의 내용을 붙여 넣어 봅시다.

final.c

#include <stdio.h>
#include "math_functions.h"
#include "song.h"

main ()
{
const int numberOfSongs = 3;
printf ("total number of songs will be: %i\n", numberOfSongs);

int i;
for (i = 0; i < numberOfSongs; i++){
printf ("loop trip %i ", i);
}

printf ("\n");

Song song1 = make_song (223, 1998);
Song song2 = make_song (303, 2004);
Song song3 = { 315, 1992 };

display_song (song3);

int combinedLength = sum (song1.lengthInSeconds, song2.lengthInSeconds);
printf ("combined length of song1 and song2 is %i\n", combinedLength);

float x = (float) song1.lengthInSeconds;
float y = (float) song2.lengthInSeconds;
float z = (float) song3.lengthInSeconds;

float averageLength;
averageLength = average (x, y, z);

printf ("average length is: %f as a float ", averageLength);
printf ("and %i as an int\n", (int) averageLength);
}

이 예는 복잡해 보일 수 있지만, 같은 컨셉들의 반복일 뿐입니다. 만약 내용중에 모르는 부분이 있다면, 앞쪽의 섹션으로 돌아가 다시한번 읽어보세요.


Compile the Example

내게의 파일을 가지고 있는 것이 호가실하다면 마지막에 작성한 final.c 를 더해서 같은 파일에 위치 시켜봅시다. 터미널로 돌아가서 파일들을 포함하는 디렉토리를 변경해줍니다. "gcc final.c song.c math_function.c -o final" 명령어를 입력 합니다.

프로그램을 실행시키기 위해서 "./final" 을 입력합니다.

-- 터미널 예시 --
host% gcc final.c song.c math_functions.c -o final
host% ./final
total number of songs will be: 3
loop trip 0 loop trip 1 loop trip 2
the song is 223 seconds long and was made in 1998
the song is 303 seconds long and was made in 2004
the song is 315 seconds long and was made in 1992
combined length of song1 and song2 is 526
average length is: 280.333344 as a float and 280 as an int


Wrap Up

우리는 아주 큰 땅에 비교적 작은 부분만을 딪게 되었습니다. 여러분들이 마지막 예제의 코드를 이해할 수 있다면, 기본적인 Objective-C 와 Cocoa를 배울 수 있는 준비가 된 것입니다.

더 많은 프로그래밍을 공부를 원한다면 포인터와 메모리 관리와 같은 보다 심오한 토픽들이 필요할 것입니다. 아래 목록이 몇몇의 시작 지점이 되어줄 것입니다.

Theocacao: C Memory and Arrays
Theocacao: C Pointers and Dynamic Memory

마음에 드셨나요? 의견이 있으신가요? 이 튜토리얼에 대한 의견을 보내주세요.
튜토리얼은 많은 노력과 시간이 들여서 작성 했습니다. 당신이 찾인 이 튜토리얼이 유용헸다면, 우리가 알 수 있도록 기부를 부탁드립니다. 우리가 더 많은 기부를 받는다면, 글쓰기에 보다 많은 노력을 기울일 수 있답니다.


Suggested amounts: Useful: $5 | Very Useful: $12 | Priceless: $21

Copyright © 2004-2006 Scott Stevenson
Made with TextMate
Cocoa Dev Central is a servicemark of Tree House Ideas
Site design © 2004-2006 Scott Stevenson

회사를 잠시 쉬는 동안 쉬엄쉬엄 번역을 시작했는데, 내용이 너무 간결하고 재미있어서 너무 빨리 번역이 끝나버렸네요. 번역에 대한 부족한 부분이나 의심쩍은 부분은 가차없이 의견 보내주세요. Gmail : snowrimp 입니다. : )

댓글 7개:

  1. iOS 앱개발 세미나 팟캐스트를 운영하는 simon입니다. 청취자 여러분중에 C언어를 모르시는분들이 많아 어려움을 겪고 계신듯 합니다.

    이분들께 이 글이 상당히 도움이 될것 같아서 저희 사이트(iosappdev.co.kr) 에 링크를 걸까 합니다.

    원하지 않으시면 알려주세요. 링크를 삭제 하도록 하겠습니다.

    simon

    답글삭제
  2. 감솨 합니다. ㅋㅋㅋ

    답글삭제
  3. 너무 잘봤습니다

    objectC를 공부하기 위해 검색을 하다 들어오게되었는데

    actionScript만 아는 저도 금방 이해할수 있게 아주 쉽게 번역,설명해 놓으셨네요

    정말 감사합니다 ^^

    답글삭제
  4. 이거 정말 깔끔하게 너무나 정리 잘해주셨네요.
    감사합니다.!

    답글삭제
  5. 작성자가 댓글을 삭제했습니다.

    답글삭제
  6. 좋은 글 많은 도움이 되었습니다.
    제 블로그(http://breakout.tistory.com/4)에 글을 링크해 두었는데 원하지 않으신다면 연락 주세요 링크 내리겠습니다.
    좋은 하루 보내세요~.

    답글삭제
  7. 구현부에서 함수의 모든것을 정의하는데 굳이 정의부(헤더파일)에서 함수를 똑같이 선언만해주는 이유가 무엇인가요?

    답글삭제