Objetive-C

프로그래밍/iPhone 2010. 6. 15. 13:10

Objective-C 언어는 정교한 객체지향 프로그래밍이 가능한 언어이다.

Objective-C 언어는 standard ANSI C 언어를 확장한다.

Objective-C 는 ANSI C 언어의 superset 이며 C 언어의 기본 문법을 지원한다.

C 언어와 같이 헤더파일과 소스파일을 따로 정의한다.


Objective-C 의 파일 확장자

.h : 헤더파일 확장자.

.m : 소스파일 확장자.

.,mm : 소스파일. C++ 코드를 포함할 수 있는 확장자.


소스코드에 헤더파일을 첨부하기 위해서는 #import 지시문을 사용한다.

#import 는 #include 와 비슷하지만 같은 파일을 한번만 포함하도록 한다.






Classes


다른 객체지향 언어에서와 마찬가지로 Objective-C 에서도 Class 는 데이터를 캡슐화할 수 있는 기본적인 구조를 제공한다. Class 의 instance 인 객체는 객체 자신의 메모리 내에 인스턴스 변수의 복사본을 가진다.


Objective-C 의 Class 는 두분으로 나뉘어져 있다. interface 와 implementation 이다.

interface 는 class 의 선언과 인스턴스 변수와 메소드를 정의한다.

interface 는 보통 .h 파일의 확장자를 갖는다.

implementation 은 class 에 대한 실제 코드를 갖는다. implementation 파일은 .m 파일 확장자를 갖는다.





[그림]




MyClass 는 NSObject 클래스를 상속한다. : (콜론) 을 구분으로 클래스 이름과 부모 클래스 이름이 나뉘어진다.

클래스의 선언은 항상 @interface 지시자로 시작하고 @end 지시자로 끝난다.

인스턴스 변수는 {} 코드 블락 내에 선언된다. 모든 인스턴스 변수와 메소드 선언뒤에는 세미콜론이 붙는다.


객체를 변수로 담기위해서는 포인터 타입의 변수를 사용해야 한다. Objective-C 는 strong, weak 타입의 포인터를 지원한다. Strong 타입의 포인터는 변수선언시 클래스의 이름을 사용하며 Weak 타입의 포인터는 클래스 이름 대신 id 사용한다. 


MyClass *myObject1; // strong typing

id myObject2; // weak typing






Methods and Messaging


Objective-C 의 클래스는 두가지 형태의 메소드를 정의할 수 있다. 인스턴스 메소드와 클래스 메소드이다. 인스턴스 메소드는 클래스의 인스턴스 객체에서 실행할 수 있는 메소드이며 클래스 메소드는 인스턴스 생성없이 클래스에서 바로 실행할 수 있다.





[그림]




-(minus) 표시는 인스턴스 메소드임을 알려준다. 메소드의 이름은 insertObject:atIndex: 이다. 메소드의 이름은 :(콜론)을 포함한 모든 signature keywords 의 합쳐진 이름이다. 

 :(콜론)은 메소드에 파라미터(메소드 인자) 가 있음을 나타낸다. 만약에 파라미터가 없다면 :(콜론)을 없애도 된다.

위에 정의된 메소드는 두개의 파라미터를 갖는다.


메소드를 호출할 때는 객체에 메세지를 보내게 된다. 메세지는 메소드의 signature 와 메소드가 필요로하는 파라미터 정보이다. 메세지는 [] 로 감싸진다. [] 내부에서는 메세지를 받는 객체가 왼쪽에 기술되고 메세지는 오른쪽에 기술된다. 예를 들어 insertObjedct:atIndex: 메세지를 객체를 담고 있는 myArray 변수에게 보내기 위해서는 아래와 같이 기술하면 된다.


[myArray insertObject:anObject atIndex:0];


수많은 지역변수가 생성되는 것을 방지하기 위해 중복적인 메세지 호출을 지원한다.

각각의 메세지의 결과는 파라미터 또는 또 다른 메세지의 타겟으로 사용된다


[[myAppObject theArray] insertObject:[myAppObject objectToInsert] atIndex:0];


Objective-C 는 accessor methods 호출시 . (dot syntax) 또한 지원한다. accessor methods 는 객체의 상태를 가져오기 위한 get, set 메소드를 말하며 또한 property 형식으로 정의 된 메소드 -(type)propertyName, (void)setPropertyName:(type).  를 말한다.


[myAppObject.theArray insertObject:[myAppObject objectToInsert] atIndex:0];


또한 객체 할당시에도 사용할 수 있다.

myAppObject.theArray = aNewArray;

위 코드는 [myAppObject setTheArray:aNewArray]; 와 같다.


클래스에게도 메세지를 보낼 수 있다. 일반적으로 클래스 메소드는 클래스의 인스턴스를 생성하기 위해 사용된다. 클래스 메소드의 정의는 인스턴스 메소드와 거의 동일하며 메소드 정의시 +(plus)로 시작한다. 아래 코드는 배열을 클래스 메소드를 사용하여 생성하는 예제이다.


NSMutableArray *myArray = nil; // nil 은 NULL 과 같다.


// 배열을 생성하여 myArray 변수에 담는다.

myArray = [NSMutableArray array];


클래스 구현 예제

@implementation MyClass


-(id)initWithString:(NSString *)aName

{

if(self = [super init]){

name = [aName copy];

}

return self;

}


+ (MyClass *) createMyClassWithString: (NSString *)aName

{

return [[[self alloc] initWithString:aName] autorelease];

}

@end






Declared Properties


properties 를 선언함으로써 accessor methods 를 편리하게 처리할 수 있다.

property 선언은 클래스 interface 내에 기술하며 @property 지시자를 사용한다.

property 선언시에는 accessor method 의 행동을 결정하는 옵션을 추가할 수 있다. 


예제

@property BOOL flag;

@property (copy)NSString *nameObject; // 할당시 객체의 복사본을 담는다.

@property (readonly)UIView *rootView; // get 메소드만 선언한다.


읽기 위한 메소드는 property 의 이름과 동일하며 쓰기 위한 메소드는 set + property 와 같다. 쓰기메소드의 property 이름의 첫글자는 대문자이다.


클래스 구현시에는 @synthesize 지시자를 사용하여 메소드를 생성한다.


@synthesize flag;

@synthesize nameObject;

@synthesize rootView;


또는 아래와 같이 기술할 수 있다.


@synthesize flag, nameObject, rootView;






Strings


Objective-C 는 C 언어에서의 String 처리방법을 지원한다. 하지만 대부분의 Objective-C 프레임웍에서의 문자열은 NSString 객체로 다뤄진다.


Objective-C 에서는 NSString 객체를 생성하기 위해 @ 을 사용한다.


NSString *myString = @"My String\n";

NSString *anotherString = [NSString stringWithFormat:@"%d %s", 1, @"String"];


// C 문자열로 Objective-C 문자열 생성하기

NSString *fromCString = [NSString stringWithCString:"A C string" encoding:NSASCIIStringEncoding];






Protocols and Delegates


protocol 은 어떤 클래스에서도 구현될 수 있는 메소드를 정의한다.

protocol 은 클래스가 아니다.

protocol 은 자바의 interface 와 비슷하다.

protocol 은 delegate object 의 interface 를 정의할 때 자주 사용된다.


@protocol MyProtocol

- (void)myProtocolMethod;

@end

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

13.Arrays  (0) 2010.06.14
12. Strings  (0) 2010.06.14
: