Objetive-C
프로그래밍/iPhone 2010. 6. 15. 13:10Objective-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 |