본문 바로가기

## 아이폰 ##

" object-c " 객체


Chapter 1. 객체(objects)

Objective-C는 C와 주로 객체에 대한 부분만이 다릅니다. 물론 method를 호출하는 문법은 정말 다른데,
이 둘을 제외하고는 C와 동일합니다. 그것은 Objective-C가 C++처럼 새로운 언어라기보다는 C에 대한 superset이기 때문입니다.
그러므로 이 문서에선 Objective-C 만의 기능에 대해서 알아보기로 합시다.

1.1 object

OOP는 객체를 중심으로 프로그래밍을 합니다. 그러므로 객체에 대한 용어를 우선 알고 가는 것이 좋습니다.

C++에서 클래스 내의 변수는 member variable이라고도 말하는데, Objective-C 에서는 instancevariable이라고 합니다. 때때로 이것은 OOP적 표현으로 property라고도 한다는 점을 생각해둡시다.

그리고 C++에서 클래스의 멤버 함수Objective-C 에서는 method라고 합니다. C++의 용어와 Objective-C 에서의 용어는 OOP 관련 책자에서 자주 인용되므로 다 알아두는 것이 좋을 것입니다.

보통 instance variable은 해당 객체의 access 메소드를 이용해서 접근합니다. 즉 get 함수와 put 함수를 사용하게 되는데, 보통 get함수는 해당 instance variable과 같은 이름으로 하기도 합니다.

즉 다음의 예를 봅시다.
@interface Song : NSObject
{
NSString *name; // instance variable
NSString *artist;
}
- (NSString *) name; // instance method
- (NSString *) artist;

이것을 사용해서 Song 클래스에 있는 name이 어떤 값을 가지고 있는지 알고 싶다면 다음과 같이 합니다.
Song mySong;

[mySong name];

이렇게 Objective-C 에서는 instance variable과 같은 이름의 method를 가지는 것이 가능합니다. C/C++식으로 말하자면 instance method인 (NSString *) name은 char *name( void ) 와 같은 식인 것입니다.

맨처음엔 인자를 괄호안에 쓰지 않는 Objective-C 스타일이 좀 이상하게 보일 수도 있지만, 인자가 길어지고 많아질때는 가독성면에서 상당히 도움이 된다는 것을 알 수가 있을겁니다.


아무튼 여기에선 이런 식으로 객체의 instance variable을 억세스한다는 것을 알아두는 것으로 넘어갑시다. 물론 꼭 instance variable과 같은 이름으로 access method의 이름을 정하지 않아도 됩니다. 어떻게 정하라라는 규칙은 없습니다. 여러분이 더 좋다고 생각하는 명명법이 있다면 그렇게 하십시오. 하지만 많은 Objective-C 책들은 이런 식으로 하는 것으로 보아, 은근히 이런 코딩 스타일을 유도하는 것 같습니다.

1.2 object pointer와 dynamic typing

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이 가능해 집니다.

이 변수는 Xcode에서 디버깅을 해보면 볼 수가 있습니다.

'## 아이폰 ##' 카테고리의 다른 글

" object-c " Classess  (0) 2010.10.21
" object-c " Object Messaging  (0) 2010.10.21
" object-c " Language  (0) 2010.10.21
모바일웹 MP4.... 에혀... 이거  (0) 2010.08.13