1 . Objective-C란 ?
Objective-C는 미국의 브래드 콕 (Brad Cox)씨가 1986년 처음으로 개념을 발표하고 만든 하이브리드 언어 입니다.
많은 부분이 C와 유사하고 약간의 객체지향적인 부분을 합쳐서 만든 언어 입니다.
주로 스몰톡의 객체지향적인 부분을 합쳐서 만든언어라 C++이나 여타 컴파일러식 객체지향적인 언어에 비해
보다 더 객체지향적인 성격을 많이 가지고 있습니다.
Dynamic binding , Dynamic loading , Dynamic typying 등을 지원 다른 언어보다 월등한 유연성을 보여 줍니다.
그리고 이런 언어의 특징들 때문에 nextstep이라는 최초의 객체지향 OS에 과감하게 사용되었으며 , 이후 MacOS X에도 역시 핵심적인 부분에 채용되게됩니다.
넥스트사의 설립자인 스티브 잡스가 Objective-C에 대한 판권을 가져오고 다시 이걸 GNU에 기증하여, 지금의 GCC에도 Objective-C가 포함되게 되었습니다.
뛰어난 능력을 가지고, 쉽게 구할수 있음에도 불구하고 국내에는 Objective-C에 대한 자세한 입문서나 프로그래밈 가이드가 없고 , 관심을 가지고 있는 분들도 적어서 많은 장점들이 알려지지 못하고 별로 쓰이지 않는 언어로 남아있습니다.
2. 간단한 문법
|
3. Dynamic binding , Dynamic typying , Dynamic loading
Dynamic binding은 객체의 메소드를 호출할 때 그 메소드가 뭔지를 정적으로 컴파일 시에 결정할 수 없다는 걸
의미합니다.
C++에서도 버추얼을 이용하면 동일한 기능을 수행하게 되지요. 버추얼이 아닌 C++에서 Sample.new();라고 쓴다면 new함수에 대한 포인터를 컴파일 시에 확보하게 되고 이 주소로 호출하는 동작을 합니다. (Objective-C는 모두 포인터이므로 c++를 예로 들경우 포인터라고 생각하시면 됨) 하지만 Objective-C에서는 콜하는 주소를 컴파일 할 때도 결정할 수가 없습니다. 다만 실행시간 중에 펑션이 있는 주소를 찾아서 그부분의 함수를 호출합니다.
순수하게 함수를 호출하는데 걸리는 시간은 일반적인 C++보다는 많이 걸리게됩니다만, 그차이는 그렇게 심하지 않고 유연성은 더 커집니다. 흔히 trade off라고 하는데 성능을 우선시 할것인가 아니면 유연성을 우선시 할 것인가 하는 문제죠.
나중에 언급하겠지만 빈번하게 한 메소드를 호출할 경우 IMP를 사용해서 메소드를 함수 형태로 호출할 수도 있습니다.
Dynamic typying은 데이터 타잎이 어떤 클래스인지 컴파일 시에 알수 없다는 것을 말합니다. C++같이 타입을 엄격히 체크하는 언어에서는 타잎이 반드시 일치해야 합니다만, Obejctive-C에서는 모든 인스탄스는 id일 뿐입니다. 따라서 인스탄스가 어떤 클래스의 인스탄스인지 실행하고 확인하기 전에는 알 수가 없습니다.
Dynamic loading은 클래스를 실행시간 중에 새로 넣을 수 있다는 뜻입니다. 일종의 플러그 인을 생각하시면 됩니다.
4. selector(동적 메소드 콜)
if (j < 10)
n= @selector(new); // [Sample new]
else
n= @selector (alloc); // [Sample alloc]
[Sample perform: n ];
5. category
: 이미 존재하는 클래스에 새로운 메소드를 추가하기 위해 제공되는 기능이다. 이를 통하여 별도의 subclass를
만들지 않고서도 기존의 클래스의 기능을 확장할 수 있다. 단, category로 새로운 instance variable을 추가할 수
는 없고, 기존의 메소드와 name collision(이름 충돌)이 일어날 경우 category에서 새로 정의된 메소드가 그 이름
을 가져간다는 점에 주의해야 한다
@interface Sample ( Cat ) -(id)cat ; -(int)sample; @end @implementation Sample (Cat) -(id) cat { printf ("This is category sample \n"); return self ; } -(int) sample { printf("This is Category Sample method (sample)\n"); return pri ; } @end |