관련 설명은 Objective‐C Language Reference 박종암 jongampark@gmail.com 을 참고했음.
문제 있으면 알려주시길...
Class Level Access
클래스 변수와 인스턴스 변수 관련
ClassA.h
ClassA.m
main.m
결과
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해서 사용.
문제 있으면 알려주시길...
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 |