iPhone 프로그래밍을 들어가기 전에 배워야 할 기본적인 Objective C에 대해서 알아보자.

 

 Objective C는 Mac에서 쓰는 프로그래밍 언어이다.

 iPhone 프로그래밍을 하기 위해서는 반드시 알아야 하는 언어이다.

 이 내용은 원문 "Programming in Objective C 2.0"을 읽고 작성되었으며 철저히 기본 C와 C++를 익혔던 사람의 입장에서 쓰여졌다.

 그러므로 여기 내용이 이해가 가지 않는다면 C,C++를 먼저 정독하고 보거나, 그냥 서점에 있는 "Programming in Objective C 2.0"책을 사서 배우길 권한다.(하지만 이책 역시 C와 C++를 모르는 사람이 접하기엔 너무 간결하게 설명하고 있다..)

 

 그리고 나도아직 Objective C를 잘 모르는 상태에서 시작하는 것이니 완전한 설명은 기대하지 말자.

 

 이곳에서 언급되는 Objective C 내용들은 C와 다른 부분만 적을 것이므로, 나오지 않는부분은 C와 동일하다고 보면 된다.

 찾기 (Ctrl + F)를 사용하면 정보검색이 빠르다.

 

1.Xcode에서 기본 프로그래밍 환경 조성하기

 

 

Finder를 클릭후 자신의 하드디스크를 클릭하면, developer 폴더가 있다.

Developer -> Application -> Xcode를 실행시킨다.

 

 

요런 화면이 뜨면 Create New Xcode Project를 누른다.

 

 

거기서 왼족 하단에 Application을 클릭. 오른쪽 상단에 Command Line Tool을 선택하고 가운데에 Type를 "Foundation"으로 맞추고 choose를 누른다.

 (만약 저 type에서 C를 한다면 친근한 c문법을 기초로 하는 printf("Hello World");가 보일 것이다. 하지만 우리는 Objective C를 해야 하니 Foundation을 선택하자.)

 

 

 

요런 화면이 뜨는데 참 Visual Studio랑 닮은 것 같다. 왼쪽은 폴더들을 표시하고

오른쪽 상단은 폴더안에 파일들을 표시하고

제일 큰 부분을 차지하는 오른쪽 하단 창은 파일의 내용을 표시한다.

 

안에 이미 Hello World를 기본으로 출력해주는 프로그램이 완성되어 있으므로 위의 "Build and Go"를 클릭하면 실행된 화면을 볼수 있다.

.

.

.

 

 응? 아무것도 안보이는데?... 아.. 생각해보니 콘솔창은 Hello World를 출력하고 바로 사라진 모양이다. 콘솔창을 띄워서 어떻게 출력이 되었는지 보자.

 

 

상단메뉴에 RUN을 클릭해보면 Console이라고 있다. 그걸 눌러보면 막 난잡한 글속에 "Hello World"글귀가 보인다. 제대로 실행된 것이다.

 

 이정도면 Objective C 프로그래밍 연습할 준비가 되었다.

 

2.전처리구문

 

 C에서는

 #include <stdio.h>

 

 이렇게 하였으나

 

 Objective C에서는

 #import <Foundation/Foundation.h>

 

 이렇게 한다. Foundation.h는 stdio.h와 비슷한 입출력기능 같은 내용이 정의되어있는 헤더이다.

 

3. 확장자명

 

 C는 ***.c  ,   C++은 ***.cpp 확장자를 가지나

 Objective C는 ***.m   Objective C++는 ***.mm을 가진다

 

4. 출력구문

 

 C는 printf 함수를 사용하나 Objective C는 NSLog를 사용한다.

 

 예) NSLog(@"Hello World %i %i", a , b);

 

   printf에서는 정수형 인수를 %d로 표현하지만, 여기선 %i로 표현한다. 문자열 앞에 @는 NSLog에서 문자열을 출력하는데 쓰는 문법이므로 너무 크게 신경쓰진 말자.

 

5. 클래스 선언

 

C++에서

class Golf : NSObject

{

   int a;

   int b;

   void printMember(void)

}

 

void Golf::printMember(void)

{

 printf("a is %d, b is %d", a , b);

}

 

로 NSObject에서 상속된 Golf 클래스를 생성했다면

 

Objective C에서는

@interface Golf : NSObject

{

  int a;

  int b;

}

-(void) printMember;

 @end

 

@implementation Golf

 

-(void) printMember

{

 NSLog(@"a is %i, b is %i", a, b);

}

@end

 

로 표현한다.

 

 차이점은 @interface로 시작해서 @end로 끝난다는 점이다. interface안에서는 선언만 하고 메소드의 구현은 implementation에서 이루어진다.

 메소드 선언 부분의 '-(void) printMember'에서 맨앞에 -는

 

-(void) printMember 로 만들시에는

 클래스 인스턴스가 만들어졌을때만 사용이 가능한 메소드이며

 

+(void) printMember 로 만들시에는

 인스턴스가 없어도 메소드를 사용할 수 있다.

 

예) -(void) printMember 메소드 호출

 Golf *one = [[Golf alloc] init];

 [one printMember];

 

 첫째줄 :one이라는 포인터 변수를 만들고 동적할당으로 주소를 받는다.

 둘째줄 : one을 통해 메소드 printMember를 호출한다.

 

예) +(void) printMember 메소드 호출

 [Golf printMember];

 

 그냥 클래스명과 메소드 이름만 써서 바로 호출할 수 있다.

 (하지만 이것은 심각한 에러를 초래할 수 도있다. 왜냐하면 printMember 메소드는 인스턴스 내의 변수의 값을 출력하기로 되어 있기 때문에 존재하지도 않는 것을 출력하려고 하기 때문이다.)

 

 여기서 처음보는 것이 있는데

 [Golf alloc]

 일 것이다.

 

 Golf는 클래스 이름이고 alloc은 메소드 이름이다. alloc 메소드는 C에서의 malloc함수와 비슷한 역할을 한다. 근데 Golf내에는 alloc이라는 메소드가 없는데 메소드를 호출이 가능한 것은 NSObject 클래스에서 상속받았기 때문이다. Golf클래스는 NSObject에게서 상속받았기 때문에 alloc 메소드로 동적할당 받을 수 있으며, init 메소드로 초기화를 쉽게 할 수 있다.

 

 NSObject를 기억해두자.

 

 몇가지 예문을 통해 C와 다른점을 보자.

 

예문1. 분수 출력 프로그램

------------------------------------------------------------------

 

//분수를 다루는 프로그램 - 클래스 버전

#import <Foundation/Foundation.h>

//-- @interface부분---

@interface Fraction: NSObject

{

  int numerator;

  int denominator;

}

-(void) print;

-(void) setNumerator: (int) n;

-(void) setDenominator: (int) d;

@end

 

//---implementation 부분--

@implementation Fraction

-(void) print

{

 NSLog(@"%i/%i", numerator, denominator);

}

-(void) setNumerator: (int) n

{

  numerator = n;

}

-(void) setDenominator: (int) d

{

 denominator = d;

}

@end

 

//---program 부분--

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

{

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

  Fraction *myFraction;

//Fraction 인스턴스 생성

  myFraction = [Fraction alloc];

  myFraction = [myFraction init];

//분수를 1/3로 설정한다

  [myFraction setNumerator: 1];

  [myFraction setDenominator: 3];

//print 메서드를 분수로 표시한다.

  NSLog(@"The value of myFraction is:");

  [myFraction print];

  [myFraction release];

 

  [pool drain];

  return 0;

}

 

-----------------------------------------------------------

 

결과는

 The value of myFraction is:

 1/3

 

 또 처음보는게 나왔다. setNumerator setDenominator 메소드가 인수를 받는다.

setNumerator 메소드는 C문법에서의

 

(void) setNumerator(int n);

{

  numerator = n;

와 동일하다.

 2개 이상의 인수를 받는법은 나도 지금은 모르니 알면 써놓겠다.

 

 

예문2. 연습

--------------------------------------------------

#import <Foundation/Foundation.h>

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

{

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

 

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

{

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

 

 int integerVar = 100;

 float floatingVar = 331.79;

 double doubleVar = 8.44e+11;

 char charVar = 'W';

 

 NSLog (@"integerVar =  %i", integerVar);

 NSLog (@"floatingVar = %f", floatingVar);

 NSLog (@"doubleVar = %e", doubleVar);

 NSLog (@"doubleVar = %g", doubleVar);

 NSLog (@"charVar = %c", charVar);

 

 [pool drain];

 return 0;

 

}

 

----------------------------------------------------------------

 

실행결과

 

 integerVar = 100

 floatingVar = 331.79

 doubleVar = 8.440000e+11

 doubleVar = 8.44e+11

 charVar = 'W'

 

 말이 필요없다. Objective C에서도 C처럼 비슷한 변수 선언을 한다. 보고 깨닫도록 하자.

 

6. 클래스 & 메소드 관리 방법

 

 아는 사람들은 잘 알겠지만 왠만하면 선언문과 구현부분은 헤더와 c파일에 나누어 놓는게 좋다는 것을 알 것이다. Objective C에서도

 

***.h

에 다 선언해놓고,

 

구현부분은

***.m

부분에 해놓는게 좋다.

 

***.h 내용

 

#import <Foundation/Foundation.h>

@interface Gogo: NSObject

{

 int a;

}

-(void) print;

@end

 

***.m 내용

 

#import "***.h"

@implementation Gogo

-(void) print

{

 NSLog(@"Hi there");

}

@end

 

 

이런식으로 관리하길 바란다. (***는 임의의 파일명이다)

 

7. 프로퍼티(property)

 C++에서는

 

class KT

{

public:

 int a;

}

 

void main()

{

 KT *instance = new kT;

 KT->a = 3;

}

 

이런식으로 인스턴스의 변수의 값을 직접적으로 접근이 가능하다.(멤버가 public(공용)이라는 전제에서만..)

 하지만 Objective C에서는

 

@interface KT:NSObject

{

 int a;

}

@end

 

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

{

 KT *instance = [[KT alloc] init];

 instance->a = 3;  //이런 문법은 불가.

}

 

 instance->a 같이 접근하는 문법은 존재하지가 않는다. 그렇기에 따로 멤버의 값을 조정하는 setMember 메소드 같은걸 만들어서 조절을 할 수밖에 없는데...

 

 프로퍼티(property)라는 문법을 사용하면 쉽게 멤버 값을 바꿀 수 있다. 우선은 클래스 선언부분에

 

@interface KT:NSObject

{

 int a;

}

@property int a; //이부분 추가

@end

 

 위와 같이 추가하고 구현 부분에

 

@implementation KT

 

@synthesize a; //이부분 추가

 

@end

 

 저 부분을 추가한다.

저렇게 해놓으면 메인에서

 

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

{

 KT *instance = [[KT alloc] init];

 [instance a = 3];  // 이런 방법도 가능하고

 instance.a = 3; //이런 방법도 가능하다.

}

 

 저렇게 사용이 가능하게 된다.

 어휴.. 평소에 잘 쓰던 문법도 Objective에서는 저렇게 설정해줘야만 되나보다.

 

 오늘은 여기까지...

'프로그래밍 > Mac' 카테고리의 다른 글

Objective C를 배워보자(2)  (1) 2011.09.09
아이폰 SDK 개발자가 되자 (Part2)  (0) 2011.09.09
아이폰 SDK 개발자가 되자 (Part1)  (0) 2011.09.09
블로그 이미지

TailsPrower

,