Category Archives: iOS/Swift

[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 Method VS Instance Method

Object-C 에서의 메서드 구현에는 정확히 딱 두가지가 있는것 같습니다.

바로 Class Method와 Instance Method인데요. 이 두가지 메서드는 Java로 따져보면 static 메서드와 일반 메서드로 구분될 수 있겠다고 생각합니다.

우선 테스트 코드를 작성하기 위해 Mac OS X이하의 Command Line UtilityFoundation Tool 프로젝트를 생성합니다.

보통 C++하실때 보는 콘솔 어플리케이션쯤으로 생각하시면 되겠네요.

우선 MethodTest라는 Object-C 클래스를 추가합니다.

MethodTest.h
[code]#import <Cocoa/Cocoa.h>

@interface MethodTest : NSObject {

}
+ (void)printWithClassMethod;
– (void)printWithInstanceMethod;

@end[/code]
MethodTest.m
[code]#import “MethodTest.h”

@implementation MethodTest

+ (void)printWithClassMethod {
    NSLog(@”Running with class method”);
}
– (void)printWithInstanceMethod {
    NSLog(@”Running with instance method”);
}

@end[/code]
이제 main 함수에 다음과 같이 기록해 봅시다.
[code]#import <Foundation/Foundation.h>
#import “MethodTest.h”

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here…
    [MethodTest    printWithClassMethod];
    MethodTest *mt = [MethodTest alloc];
    [mt printWithInstanceMethod];
   
    [pool drain];
    return 0;
}[/code]
감이 오시나요? printWithClassMethod는 클래스를 인스턴스화 하지 않고도 호출할 수 있는 메서드입니다.

하지만 printWithInstanceMethod는 꼭 초기화 된 상태에서 호출해야만 하죠.

이를 자바로 한번 풀어보면 다음과 같겠죠.
[code]class MethodTest {
    public static void printWithClassMethod() {
        System.out.println(“Running with class method”);
    }
    public void printWithInstanceMethod() {
        System.out.println(“Running with instance method”);
    }
}[/code]
Class Method와 Instance Method의 차이 이해 되시죠? ^^