순수중독, 방동근, Stefan, PureHolic, Mac, iPod, Travel, Korea…
C++ 을 하면서 어려우면서도 좋다는 것을 알게된 포인터(Pointer)와 레퍼런스(Reference : 참조)가 있다. 하지만 오래간만에 생각하니깐 이 둘의 차이점과 사용할 때를 명확하게 구별하기가 어려웠다.
차이점
C++에서는 레퍼런스는 선언과 동시에 정의되어야 하며 레퍼런스는 포인터처럼 다른 객체로 바꿀 수 없다.
그리고 일부에서는 NULL레퍼런스를 가질 수 있다고 하기도 하지만 개인적인 생각에는 레퍼런스는 "레퍼런스는 NULL을 가지지 않는다" 라는 것이 전제가 된다고 생각한다. 실제로 레퍼런스는 alias의 개념이 강하기 때문이다.
레퍼런스를 사용할 때
레퍼런스는 값의 수정을 못하게 보장해준다는 점에서 괜찮다고 생각된다. 그리고 가능한 레퍼런스를 사용하여 나도 모르는 값의 참조를 막아주는 것이 좋을 것 같다.
저번에 Google Earth와 Geotagger라는 프로그램을 이용해서 사진에 지도태그를 삽입하는 방법을 적은 적이 있다. 하지만 이렇게 정리한 사진들을 그저 플리커(Flickr)에 올리는 것만으로밖에 사용할 수 없었는데, 이를 이용해서 iPhoto에서 바로 구글맵스에서 그 위치를 보여주는 방법을 애플포럼에서 alexken님께서 알려주셨다.
하지만 방법에 유일한 단점이 있었으니 올려진 파일은 한국어를 이용해서만 사용할 수 있게 만들어주신 것이다. 나 같이 영어상위로 사용하는 사람들에게는 "보기"라는 버튼이 보이지 않아, 혹시 내가 직접 nib파일을 수정하면 되지 않을까? 싶은 생각에 해보았는데 성공하였다.
- 때때로 위의 사진과 다르게 Referencing Outlets 항목이 없을 때가 있다. 이때는 File's Owner에서 오른쪽 클릭한 뒤에 거기에 있는 mGPSShowButton 오른쪽에 있는 Square Textured Button 항목을 해제(x)하자.

그래도 코코아 프로그래밍을 공부하고 있었던 바람에 Interface Builder를 이용해서 쉽게 수정하여 사용할 수 있게 되었다. 다른 플러그인들도 이런식으로만 만들 수 있다면 한번 해보고 싶은데... 머리가 아파온다. ^^;
혹시 모르니 꼭 위의 작업을 하기 전에 백업을 하고 실패할 땐(?) 언제든지 다시 덥쳐써서 사용하자. 그리고 위의 수정을 통하여 Show 버튼을 나타내게 했지만 지도 태그가 없는 사진에도 뜨게 된다. -_-;
Objective-C는 브래드 콕스(Brad Cox)란 사람이 옛날 옛적에 C에 스몰토크와 비슷한 클래스들과 메시지 전송 매커니즘들을 추가하여 만든 언어이다. 그래서 문법은 생소할지 몰라도 전체적인 모습은 C언어를 공부하였다면 쉽게 다가갈 수 있다. Objective-C에서 추가된 클래스와 메시지 전송 매커니즘에 대해서 공부를 하였다.
NSMutableArray *foo; foo = [NSMutableArray alloc]; // NSMutableArray의 인스턴스 생성 [foo init]; // foo가 가르키는 객체에 init 메시지 전송 [foo release]; // foo의 인스턴스를 해제
위의 예제를 보면 알 수 있지만 [foo init] 의 의미는 C언어에서 foo.init(); 과 동일한 의미이다. C언어에서 없는 클래스와 관련된 명령들은 대부분 [ ] 대괄호 안으로 입력이 되는 것을 볼 수 있다.
C언어에서 확장된 Objective-C기 때문에 객체의 선언 부분은 약간 특이하다. 특히 적응되지 않는 [ ] 대괄호의 사용은 언젠가 계속 접하다보면 편해지길 바라며 쓸 뿐이다.
File > New file... > Objectvie-C class 선택하여 작성.
foo.h 파일
#import <Cocoa/Cocoa.h> @interface foo : NSObject { NSMutableArray *array; int foo_no; int prev_no; int next_no; } - (void)setNumber:(int)no; - (int)foo_no; - (int)prev_no; - (int)next_no; @end
foo.m 파일
#import "foo.h" @implementation foo - (void)setNumber:(int)no { foo_no = no; } - (int)foo_no { return foo_no; } - (int)prev_no { return prev_no; } - (int)next_no { return next_no; } @end
위와 같이 Objective-C에서의 클래스는 다른 언어(JAVA, C# 등)들과 의미는 같지만 문법이 약간 다르다. 적응하는데 약간 시간이 걸릴듯하다.
Objective-C의 메시지 전송 매커니즘의 문법은 많은 프로그래머들이 매우 멋지다고 말을 한다. 그 이유는 간단하다. 모든 메서드의 인수의 의미 파악이 쉽기 때문이다.
NSMutableArray *foo; foo = [[NSMutableArray alloc] init]; [foo insertObject:bar]; [foo insertObject:bar atIndex:7]; [foo release];
위의 예제처럼 인수를 넘길 땐, : 를 이용한다. 그리고 복수의 인수가 있을 경우에는 InsertObject:bar atIndex:7 이렇게 적어준다. 스몰토크를 사용할 줄 아는 사람은 이것이 쉽게 다가 온다는데... 난 전혀 안 다가온다. 나중에 이용하면서 적응해 나가야할 듯하다.