소개
만약에 당신이 차의 운전을 배울 때, 여러가지 일을 동시에 처리하는 연습을 할 필요가 있습니다. 클러치와 가솔린과 브레이크 페달등 각각에 대해서 알고 있지 않으면 안됩니다. 프로그래밍도 같아서, 많은 것을 마음에 새겨 둘 필요가 있습니다. 그렇치 않으면 당신의 프로그램은 크래쉬해버리는 것이지요. 어쩌면 당신은 운전을 배우기 시작하기 전부터 차의 내부구조 정도야 훤히 알고 있었을지도 모르겠습니다만, Xcode를 사용해서 프로그래밍을 시작하기 전에 이러한 잇점은 없습니다. 당신을 혼란시키지 않도록, 실제의 개발 환경에 관한 자세한 설명은 뒤로 하고 , 우선은 당신이 잘 알고 있을 법한 간단한 수식을 Objective-C의 코드로 공부를 시작하기로 합시다. 

초등학교에서 다음과 같은 계산식의 빈곳 체우기 문제를 했을겁니다.
2 + 6 = ... 
... = 3 * 4 (*기호는 컴퓨터로 곱하기(×)을 나타내는 일반적인 기호입니다) 중학교에 들어가면 이러한 공백을 사용하는 것은 남들보다 뒤쳐지고 , x와 y라고 불리는 변수 (혹은 「대수」라고 하는 부르는 법)을 사용하게 됩니다. 다시 생각해 보면, 이러한 대수롭지 않은 기호의 변경이 당시는 왜 혼란이라고 어렵게 느낀 것일까요?
2 + 6 = x
y = 3 * 4

변수
Objective-C에서도 마찬가지로 변수를 사용합니다. 변수는, 예를 들면 숫자와 같은, 특정한 데이터를 나타내기 위한 편리한 이름에 지나지 않습니다. 아래에 변수에 특정한 값을 대입하는 Objective-C의 명령 문장, 즉 코드가 있습니다. 

//[1]
x = 4;

세미콜론
x라고 하는 이름의 변수에 4 라고 하는 값이 대입됩니다 (「x는 4이다」라고 하는 의미가 아니므로 주의. 어디까지나 값의 대입입니다). 명령 문장의 마지막에 세미콜론(;)이 있는 것에 주의해 주십시오. 
모든 명령 문장의 마지막에는 세미콜론을 두지 않으면 안됩니다. 왜일까요? 샘플 [1]의 코드는 기계적으로 보일지도 모르겠습니다만, 컴퓨터는 이 코드라도 무엇을 해야 할지 완전히 이해가 가지 않습니다. 당신이 입력한 이러한 문장을, Mac이 이해가 가는 0과 1의 2진수로 변환하기 위해서는, 컴파일러라고 불리는 특수한 프로그램이 필요합니다. 인간이 입력한 문장을 읽고, 이해하는 것은 컴파일러에 있어서 매우 대단한 작업입니다. 그래서 당신은 특정한 단서, 예를 들면 특정한 명령이 어디에서 끝나고 있는 것인가라고 하는 정보를 컴파일러에 줄 필요가 있습니다. 그것이 세미콜론이 나타내는 의미입니다. 

 만약 세미콜론을 하나라도 당신의 코드에 빼먹는다면 그 코드는 컴파일(source code를 Mac이 실행할 수 있는 형식으로 변환하는 것) 할 수 없고, Mac이 실행가능한 프로그램을 만드는 것이 되지 않습니다. 단, 컴파일러가 당신의 코드를 컴파일 할 수 없을 때는 당신에게 불평을 하므로, 그다지 지나치게 걱정하지 않아도 괜찮습니다. 다음의 장에 설명하겠습니다만, 컴파일러는 코드의 어디가 틀린 것인지 찾는 것을 도와 줍니다.
 
변수의 이름을 붙이기
변수의 이름자체는 컴파일러에 있어서는 특별한 의미는 없습니다만, 이해하기 쉬운 변수의 이름은 프로그램을 보다 읽기 쉽고, 보다 이해하기 쉽게 합니다. 그리고 코드 안의 에러를 발견할 때에 큰 도움이 됩니다. 
 프로그램의 에러는 일반적으로 버그라고 부르고 있습니다. 또 버그를 찾아 수정하는 것을 디버그라고 부릅니다. 
그 때문에, 실제의 코드를 쓸 때, 예를 들면 x 처럼 무엇을 나타내는지 이해하기 힘든 변수의 이름은 피해야 합니다. 예를 들면 이미지의 가로 폭을 나타내는 변수라면, pictureWidth라고 하는 이름을 기입해야 하지요 [2]. 
//[2]
pictureWidth = 8;

세미콜론 붙히는것을 잊어먹는것은 컴파일러에 있어서 큰문제가 된다고 하는 것부터, 프로그래밍은 사소한부분까지 중요하다고 하는 것을 알 것입니다. 주의해야 할 잘잘한 규칙의 하나로서, 코드는 대문자와 소문자를 구별한다고 하는 것을 말할 수 있습니다. pictureWidth라고 하는 변수명은 pictureWIDTH나 PictureWidth라고 하는 이름과는 같지 않습니다. 일반적인 규약을 따라, 나는 몇몇의 단어를 조합해서 변수명으로서 사용하고, 최초의 단어의 끝 머리 문자는 소문자에서, 그 이외의 단어는 대문자로 시작하도록 하고 있습니다. 샘플 [2] 처럼합니다. 이러한 규칙을 지키는 것으로, 프로그래밍중에 대문자소문자의 혼동을 줄일 수 있습니다. 
변수의 이름은 하나의 단어(때에로 한 문자)로부터 만들어 내니 주의해 주십시오. 
 프로그래머는 자유롭게 변수의 이름을 선택할 수 있습니다만, 지켜야 할 몇개의 룰도 존재합니다. 그 룰 모두를 설명할 수도 있습니다만, 현시점으로 그것을 읽는 것은 조금 지루한 것이지요. 지켜야 할 최소의 룰은, Objective-C에 의해 이미 예약되고 있는 이름 (즉 Objective-C에 있어서 특별한 의미를 가지는 단어)을 사용해서는 안된다라고 하는 것입니다. 단어를 조합해서 변수명을 만들면 (예를 들면 pictureWidth), 그 변수명은 문제 없습니다. 변수명을 읽이 쉽게 하기 위해서는 변수명 안에 적당히 대문자를 사용하는 것들 입니다. 이 규칙을 지키는 것으로, 당신이 만드는 프로그램의 버그를 줄일 수 있을 것입니다. 
몇개의 룰을 배워 이제 단락을 마치기로 합시다. 문자의 이외에 숫자도 사용할 수 있습니다만, 변수명을 숫자로부터 시작할 수는 없습니다. 또 underscore(_)을 사용할 수도 있습니다. 아래에 몇몇의 변수이름 예제가 있습니다. 

옳은 변수명의 예
door8k
do8or
do_or

잘못된 변수명의 예
door  8(공백을 포함하고 있다)
8door (숫자로부터 시작되고 있다)

언급되지 않는 예
Door8(대문자로부터 시작되고 있다)


계산내에서 변수를 사용
이것으로, 변수을 어떻게 값을 주면 좋을지 알았으므로, 계산을 실행할 수 있습니다. 사진의 면적을 계산하는 코드를 봅시다. [3]
 
//[3]
pictureWidth=8;
pictureHeight=6;
pictureSurfaceArea= pictureWidth*pictureHeight;
놀랍게도 컴파일러는 공백의 유무는 무시합니다 (하지만 변수명이나 키워드는 제외함). 코드를 더 보기 쉽게 하기 위해서, 공백을 사용할 수 있습니다. 
//[4]
pictureWidth = 8;
pictureHeight = 6;
pictureSurfaceArea = pictureWidth * pictureHeight;

정수와 실수
이제 예제 [5], 특히 최초의 2줄에 주의해서 봅시다. 
//[5]
pictureWidth = 8;
pictureHeight = 4.5;
pictureSurfaceArea = pictureWidth * pictureHeight;
수치는 크게 나누어서 2종류로 구별할 수 있습니다. 정수값(integer)과 실수(float)입니다. 
[5.1]과 [5.2]이 각각의 수치의 예입니다. 정수값은, 예를 들면 어떠한 명령을 특정한 회수로 되풀이하기 위해서 회수를 꼽는 (제7장 참조) 때등에 사용됩니다. 또 실수치,혹은 부동 소수치는, 예를 들면 야구의 타율등을 나타내는데도 사용합니다. 
샘플 [5]은 아마도 제대로 동작하지 않습니다. 문제는, 당신이 사용하려고 하고 있는 변수의 이름과, 그 변수가 가지는 데이터의 타입(데이터의 「형」이라고 부릅니다), 즉 정수값인가 소수치인가를 사전에 컴파일러에 전하지 않으면 안된다는 점입니다. 전문적으로 말하면 이것은 「변수의 선언」이라고 불립니다. 
//[6]
int pictureWidth;
float pictureHeight, pictureSurfaceArea;
pictureWidth = 8;
pictureHeight = 4.5;
pictureSurfaceArea = pictureWidth * pictureHeight;

[6.1]의 행의 처음에 「int」라고 하는 단어는, 변수pictureWidth가 정수값int형인 것을 나타내고 있습니다. 다음 행에서는, 변수명을 콤마에서 매듭짓는 것으로, 한번에 둘의 변수를 선언하고 있습니다. 더욱 자세하게 말하면 [6.2]의 기술은 둘의 변수 둘다를 소수치float형인 것 가리키고 있습니다. 이 경우, pictureWidth만을 다른 둘의 변수와 다른 형으로 하는 것은 조금 이상합니다만, int와 float를 곱셈하면 그 결과가 float가 되기 위해서, [6.2]에서는 pictureSurfaceArea라고 하는 변수를 float로서 선언하고 있는 것이라고 하는 것을 이해해 주십시오. 

컴파일러는 왜, 변수가 정수일지 그것과도 소수를 포함하는 수치일지를 알 필요가 있습니까? 컴퓨터 프로그램은, 실행할 때 데이터를 보존하기 위해서 컴퓨터의 메모리의 일부를 필요로 합니다. 그 때문에 컴파일러는 각변수를 위해서 메모리(바이트)영역을 확보하고 있습니다. 다른 형의 데이터, 이 경우 int와 float는, 각각 다른 메모리의 양이라고 표현(메모리 위로 어떻게 써 넣을 것인가)이 필요하기 때문, 컴파일러는 각각의 변수에 필요한 것 만큼의 메모리와 옳은 표현을 준비할 필요가 있습니다.

만약 매우 큰 수치나 매우 정밀도가 높은 소수의 수치을 사용하고 있으면, 어떻게 됩니까? 그것들의 큰 값은 컴파일러가 준비한 조금의 메모리 용량에 끝까지 들어가지 않게 되어버립니까? 그 대로. 이것에는 둘의 해결 방법이 있습니다. 하나는 int,float보다도 큰 (혹은보다 정밀도가 높다) 수치를 가질 수 있는 별도의 변수를 사용하는 것입니다. 많은 시스템은 long long과 double라고 하는 보다 큰 변수의 타입을 가지고 있습니다. 만약 이 변수에조차 끝까지 들어가지 않을 경우, 두번째의 해결 방법입니다만, 프로그래머로서 그 문제를 경계하는 것이 당신의 일입니다. 어쨌던 이것은 이러한 입문 가이드의 내용에는 어울리지 않으므로 적당히 해 둡니다. 
 덧붙이자면, 정수값도 소수치도 예를 들면 당신의 은행계좌와 같이 큰값을 다룰 수 있습니다. 만약 변수가 음수의 값이 될 수 없음을 알고 있는 것이라면, 그 변수가 취급할 수 있는 수치의 범위를 넓힐 수 있습니다. 
//[7]
unsigned int chocolateBarsInStock;
초콜릿 바의 수에 음수의 값은 있을 수 없으므로, 여기에서는 unsigned int를 사용할 수 있습니다. 
unsigned int타입의 변수는 0이상의 값을 다룰 수 있습니다. 

변수의 선언
변수의 선언과 동시에 그 변수에 값을 대입하는 것도 가능합니다. 
//[8]
int x = 10;
float y=3.5, z = 42; 이렇게 하는 것으로 타이핑의 양을 조금만 절감할 수 있습니다. 

수학적 연산
이전의 샘플로, 곱셈명령을 시험해 보았습니다. 이하의 기호 (정식으로는 연산자라 부릅니다)에 의해, 기본적인 수학적 계산을 할 수 있습니다. 
+ 가산
- 감산
* 곱셈
/ 나눗셈

연산자를 사용하는 것으로 여러가지 종류의 계산을 할 수 있습니다. 만약 프로의 Objective-C프로그래머의 코드를 읽는 기회가 있으면, 다른점을 알아 차릴겁니다. 
 x = x + 1;이라고 쓰는 대신 프로그래머는 [9]이나 [10]과 같은 서식을 잘 사용합니다. 
//[9]
x++;
//[10]
++x;
어느쪽의 의미도 「x를 1 늘린다」입니다. 단 경우에 따라서는, ++이 변수 앞에 있을지 뒤에 있을지에 의해 큰 차이가 있습니다. [11]과 [12]의 샘플을 보아 주십시오. 
//[11]
x =10;
y =2*(x++);
//[12]
x =10;
y =2*(++x);
[11]의 코드가 실행되면, y는 20에, x는 11이 됩니다. 즉 2*x가 y에 대입된 뒤, x의 값이 1 늘려집니다. 대조적으로 [12.2]에서는, 2을 곱하기 전에 x의 값이 1 늘려집니다. 그러므로 실행후는 x는 11에 y는 22이 됩니다. 샘플 [12]은 다음 샘플 [13]과 같은 의미입니다. 
//[13]
x = 10;
x++;
y = 2* x;
따라서 프로그래머는 둘의 행을 한행으로 간추릴 수 있습니다. 개인적으로는 [11]과 같은 서식은 프로그램을 읽기 어렵게 한다고 생각합니다. 이러한 생략을 하는 것도 괜찮습니다만, 거기에는 버그의 가능성도 있다고 하는 것에 주의해 주십시오. 

괄호
당신이 이미 어떻게든 고등학교를 졸업한 후라면, 이것은 이미 완전히 옛날의 기억이 되고 있을지도 모르겠습니다만, 괄호는 계산을 실행하는 순번을 지정하는데도 사용되는,이라고 하는 것을 상기해 주십시오. 또 *과 /은 +과 -보다도 우선됩니다. 즉 4+2*3은 10이 됩니다. 괄호를 사용하는 것으로 우선 순위가 낮은 +이나 -을 먼저 실행할 수 있습니다. 예를 들면 (3+4)*2은 14이 됩니다. 

나눗셈
나눗셈연산자를 사용할 때는 대수롭지 않은 주의가 필요합니다. int에 대하여 사용할 경우와 float의 경우에서는 결과가 다르기 때문입니다. 다음 [14, 15]의 예를 보아 주십시오. 
//[14]
int x = 5, y = 12, ratio;
ratio = y / x;
//[15]
float x = 5, y = 12, ratio;
ratio = y / x;
[14]의 예에서는 결과는 2이 됩니다. [15]의 샘플로만, 아마 당신이 기대하고 있을 것인 결과 2.4을 얻을 수 있습니다. 

 나머지 구하기
그다지 당신이 아마 그다지 친숙하지 않을 연산자로서 %(나머지)가 있습니다. 이 연산자는 퍼센티지(percentage)를 계산하는 것이 아닙니다. %의 결과는 앞의 숫자를 뒤의 숫자로 나누었을 때의 나머지입니다. (수치뒤의 숫자가 0, %의 동작은 정의되고 있지 않습니다). 
//[16]
int x = 13, y = 5, remainder;
remainder = x % y;
변수remainder의 결과는 3이 됩니다. 
아래에 몇몇의 %계산의 결과를 보여줍니다.
21 % 7 is equal to  0
22 % 7 is equal to  1
23 % 7 is equal to  2
24 % 7 is equal to  3
27 % 7 is equal to  6
30 % 2 is equal to  0
31 % 2 is equal to  1
32 % 2 is equal to  0
33 % 2 is equal to  1
34 % 2 is equal to  0
50 % 9 is equal to  5
60 % 29 is equal to  2
% 연산 아이는 때로 편리하게 사용할 수 있습니다만, int형의 값에만 사용할 수 있다고 하는 점에 주의해 주십시오. 
%를 사용방법의 하나로서 짝수인가 홀수인가의 판정이 있습니다. 짝수라면 % 2의 결과가 0이 됩니다. 그렇지 않으면 홀수입니다. 예로서 아래에 샘플을 소개합니다. 
//[17]
int anInt;
//Some code that sets the value of anInt
if ((anInt % 2)==0)
{
  NSLog(@”anInt is even”);
}
else
{
  NSLog(@”anInt is odd”);
}

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

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

05:프로그램을 컴파일해서 실행  (0) 2011.06.21
04:화면에 표시하기  (0) 2011.06.21
03:함수  (0) 2011.06.21
02:노 코멘트(no comment)? 그것은 안됨!  (0) 2011.06.21
01:프로그램은 인스트럭션의 연속  (0) 2011.06.21
00:시작하기 앞에  (0) 2011.06.21
Posted by tklee

댓글을 달아 주세요