Tag Archives: Object

[iPhone] Object-C : Allocating and Initializing Objects

Object-C에서 객체를 생성하는 방법은 다음의 두가지 방법을 거쳐야 합니다.

  • 동적으로 새로운 객체를 메모리에 할당
  • 새롭게 메모리에 할당된 객체에 적절한 값들로 초기화

위의 두가지 과정을 거치게 되면 완벽한 객체가 생성되게 됩니다.

위의 두가지 과정을 다음과 같이 한줄의 코드로 표현할 수 있습니다.
[code]id anObject = [[Rectangle alloc] init];[/code]

Object-C에서 새로운 객체를 메모리에 할당하는 Class Method는 NSObject 클래스에 정의되어있습니다.

이 클래스는 Java의 Object클래스와 같이 모든 클래스가 상속받게 되는 최상위 클래스입니다.

NSObject 에서는 alloc, allocWithZone 두가지 주요 메서드가 있습니다.

이 메서드들은 클래스를 포함한 클래스내의 인스턴스 변수들이 사용될 수 있도록 충분한 메모리 공간을 할당하여 주는 역할을 합니다.

alloc과 allocWithZone 메서드들은 자신의 클래스에 새로운 메모리 영역을 할당하고 새롭게 생성되는 인스턴스 변수가 이 객체를 가르키도록 합니다.(Pointer)

그리고 모든 다른 인스턴스 변수들의 값을 0으로 세팅합니다.

일반적으로 객체가 안전하게 사용될 수 있도록 값을 초기화 하는 과정이라고 보시면 됩니다.

초기화를 담당하는 인스턴스 메서드들은 모드 init으로 시작을 하는 명칭을 가지고 있습니다.

이 이름은 강제적인것은 아니지만 코드 컨벤션에 지정된 내용입니다. 따로 인자가 없는 초기화 메서드는 init을 사용하면 되고 인자가 필요한 초기화 메서드일 경우 initWithFrame: 와 같은 메서드명을 사용하면 될것입니다.

모든 클래스에서 init 메서드를 제공하여야 합니다. 또한 이 메서드를 통해 클래스를 초기화 하도록 하는것이 좋습니다.

NSObject의 경우 변수와 각종 정의를 init메서드 내부에서 초기화 하도록 구현되어있습니다.

NSObject의 init메서드를 호출할경우 객체의 모든 내용을 초기화 하고 self(C++/Java에서 말하는 this)를 반환하게 됩니다.

[iPhone] Object-C : Class, Object, Message

Object-C는 아이폰 개발에 사용되는 언어입니다.

C와 C++의 중간 개념이라고들 하던데 확실히 C언어에 객체의 개념을 추가하고 적절한 라이브러리가 추가된 모습이더군요.

공부하면서 한번 정리를 해보도록 하겠습니다.

객체를 생성하기 위해 클래스를 선언하는데 일반적으로 C++을 해보셨던 분들이 이해하기 좀 어려운 모습을 가지고 있습니다.

XCode에서 New -> New File 항목에서 Object-C Class를 선택하여 클래스 파일을 추가합니다.

Foo 라는 클래스를 만들어 보면 Foo.h와 Foo.m 파일이 생성됩니다.

Foo클래스에 변수와 메서드들을 추가해 봅시다. 다음과 같은 방법으로 합니다.

Foo.h

@interface Foo : NSObject {
    IBOutlet NSTextField *textField;
}
- (IBAction)seed:(id)sender;
- (IBAction)generate:(id)sender;
@end

Interface라는 이름을 가지고 선언하긴 하지만 엄연히 클래스를 선언하는 구문입니다.

Foo라는 클래스는 NSObject를 상속받았습니다. NSObject는 NextStep에서 만든 최상위 클래스입니다.

모든 NS로 시작하는 클래스들은 모두 최상위로 NSObject를 상속받습니다. 마치 자바의 Object와 같네요.

또한 NSTextField형의 textField라는 이름의 인스턴스변수(맴버변수)를 선언하였습니다.

IBOutlet은 외부의 다른 객체를 가리킬수 있는 변수를 뜻합니다.

추후에 올려보겠지만 UI상의 컴포넌트 객체들과 변수를 연결할 수 있습니다.

또한 -로 시작하는 줄들은 메서드들입니다. seed메서드만 보면 IBAction을 반환하고 id타입의 sender를 첫번째 인자로 입력 받습니다.

위의 클래스를 구현하면 다음과 같이 합니다.

Foo.m

@implementation Foo

- (IBAction)seed:(id)sender {
    ...
}
- (IBAction)generate:(id)sender {
    ...
}

위와 같이 메서드의 몸체를 구현할때 맴버 인스턴스 변수인 textField에 마음껏 접근할 수 있습니다.

객체 자기 자신을 가르킬 경우에는 자바나 C++에서는 this를 사용하지만 여기서는 self를 사용합니다.

인자를 받을 넘길때도 특이한점이 있군요. 두개 이상의 인자를 받을경우에는 굉장히 복잡해 집니다.

- (int)addNumbers:(int)left rightNumber:(int)right {
    return left + right;
}

위와 같은 메서드는 addNumbers:rightNumber: 라고 부릅니다. 보통의 프로그래밍을 하던 느낌으론 굉장히 의문이 가는 부분입니다.

addNumbers는 int형 값을 반환하는 메서드입니다. 첫번째 인자는 int형 left 변수입니다.

그렇다면 rightNumber는 저게 뭘까요.  보통 인자를 가진 메서드를 셀렉터(Selector)라고 부릅니다.

위의 코드를 이렇게 바꿔 보면 이해가 쉬울것 같네요.

int addNumbers(int left, int right) {
    return left + right;
}

실제로 사용되는 인자의 이름은 left, right이지만 rightNumber와 같은 식의 나누어진 셀렉터를 사용하여 메서드의 인자의 역할을 더욱 분명히 할 수 있는 장점(?)이 있습니다.

이제 함수를 호출하는 방법을 알아보겠습니다.

NSMutableArray *array = [NSMutableArray alloc];

Object-C에서 메서드 호출을 메세지를 보낸다고 표현합니다. 위의 경우에는 다음과 같이 생각하시면 될 것 같네요.

NSMutableArray array = new NSMutableArray();

위와 같이 동적으로 메모리를 잡고 array변수로 가리키게 합니다. 이제 초기화 하는 init 메세지를 보내보겠습니다.

NSMutableArray *array = [NSMutableArray alloc];
[array init];

array는 리시버(receiver)라고 합니다. 이 리시버에 init메세지를 입력합니다.

다음과 같이 위의 두줄을 한줄로 사용할 수도 있습니다.

NSMutableArray *array = [[NSMutableArray alloc] init];

인자를 입력할 경우에는 다음과 같이 사용합니다.

[array addObject:foo];

다수의 인자를 입력할때는 다음과 같은 방법으로 합니다.

[array insertObject:foo atIndex:bar];

위에서 언급했듯이 insertObject는 메서드명이기도 하면서 변수를 가리키는 셀렉터이기도 합니다.

다음에는 아이폰으로 간단한 예제를 만들어 올리도록 하겠습니다.