관련 설명은 Objective‐C Language Reference 박종암 jongampark@gmail.com 을 참고했음.
문제 있으면 알려주시길...

Class Level Access

클래스 변수와 인스턴스 변수 관련

ClassA.h
#import <Foundation/NSObject.h>

static int count;

@interface ClassA: NSObject
+(int) initCount;
+(void) initialize;
@end


ClassA.m
#import "ClassA.h"

@implementation ClassA
-(id) init {
    self = [super init];
    count++;
    return self;
}

+(int) initCount {
    return count;
}

+(void) initialize {
    count = 0;
}
@end


main.m
#import "ClassA.h"
#import <stdio.h>

int main(int argc, const char* argv[]) {
    ClassA* c1 = [[ClassA alloc] init];
    ClassA* c2 = [[ClassA alloc] init];
   
    // print count
    printf("ClassA count: %i\n", [ClassA initCount]);
   
    ClassA* c3 = [[ClassA alloc] init];

    // print count again
    printf("ClassA count: %i\n", [ClassA initCount]);
   
    [ClassA initialize];
    printf("ClassA count: %i\n", [ClassA initCount]);
   
    [c1 release];
    [c2 release];
    [c3 release];
   
    system("PAUSE");
    return 0;
}


결과
ClassA count: 2
ClassA count: 3
ClassA count: 0
계속하려면 아무 키나 누르십시오 . . .

init 메소드가 id 타입을 반환하는 것에 주의
static int count = 0; 클래스 변수 선언 방식. 좋은 위치는 아님. 자바의 static class variables 구현하는 것처럼 하는 것이 더 나음.
The + denotes a class level function.
+(void) initialize 메소드는 Objective-C가 프로그램 시작 시 콜함. 또한 모든 클래스에 대해서 콜함. 클래스 레벨 변수를 초기화하기에 좋은 위치.

id
Objective-C는 동적인 언어입니다. 이 말은 runtime시에 객체가 변할 수 있다는 것을 의미하며, 또한 해당 객체에 대한 method도 변할 수 있습니다.. 이것은 Apple에서 만들던 Dylan의 설명서를 보면 쉽게 이해할 수 있을것입니다. 아무튼 이렇게 동적이다보니, 기존의 static typing을 하던 방식으로 객체에 대한 포인터를 사용하면 불편한 면이 있을 수 있겠습니다. 그래서인지 Objective-C 에는 모든 객체를 두루 포인팅할 수 있는 타입을 새로 정의해 놓았는데 바로 id입니다. 다음의 예를 봅시다.

id mySong = [[Song alloc] init];

이렇게 하면 mySong은 Song이라는 타입의 객체를 가르키게 됩니다.
물론 static typing을 써서 다음과 같이 할 수도 있습니다.

Song mySong = …

이것은 흡사 C/C++의 void *와 비슷합니다.
만약 아무것도 안가르키고 있다면 nil 이라는 이미 정의된 keyword를 null 객체를 가르키기 위해서 사용할 수 있습니다.

id mySong = nil;

id 타입은 객체에 대해서 어떤 정보도 가지고 있지 않습니다. 단지 가르키고 있는게 객체라는 것만을 의미할 뿐입니다. 그러므로 id 로 선언된 변수는 어떤 객체라도 가르킬 수 있습니다. 이것은 C/C++ 관점에서 보자면 문제를 일으킬 수 있습니다. 즉 가르키고 있는 객체가 어떤 형태인줄 알아야 뭔가를 할 수 있을텐데, 이것만으로는 알아낼 방도가 없기 때문입니다. 그래서 isa 라는 instance variable을 묵시적으로 가지고 있게 됩니다. 이것은 실제 그 객체가 어떤 형인지를 기록해 놓는 것인데, 이것을 이용해서 runtime시에 알아낼 수 있게 됩니다.
이런 메커니즘을 이용해서 dynamic typing이 가능해 집니다.

즉, init 메소드에서 id 타입으로 반환하고 동적으로 typing해서 사용.

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

[Objective C] 05 The Id Type  (1) 2009.10.29
[Objective C] 04 Exceptions  (0) 2009.10.28
[Objective C] 02 Access Privledges  (0) 2009.10.27
[Objective C] 01 Creating Classes  (0) 2009.10.27
[Objective C] 환경설정  (0) 2009.10.27