심심해서 저번주부터 틈틈히 집에서 Cocoa 공부를 해봤다. Cocoa는 Mac OS X의 어플리케이션 개발 프레임워크다. Windows의 MFC 같은 거라고 보면 된다. 첫 연습 프로그램으로 뭐가 좋을까 하다가, 전부터 필요하다고 생각했던 Markdown 리더를 떠올렸다. 간단한 프로그램이지만 벌써 몇가지 기술을 습득할 수 있는 좋은 예제였다.
- WebKit—Safari의 HTML 렌더링 엔진—을 Cocoa 어플리케이션에서 내장하고 사용하는 방법
- 파이프라인을 통해 통신하는 방법
- Interface Builder를 통해 인터페이스를 구성하는 방법
- 인터페이스를 nib 파일로 저장하는 방법
- 아웃렛(outlet)과 액션(action) 메타포에 대한 이해
- Objective-C와 Cocoa에 익숙해질 기회
- Mac OS X 어플리케이션에서 각종 자원들(resources)을 관리하는 방법
일주일밖에 안된 시간이었지만 꽤나 많은 것을 느낄 수 있는 기회였다.
Objective-C는 생각보다 나쁜 언어는 아니다. 그렇지만 요즘 시대와 비교하면 “동적이고 생산성이 높다”는 것을 특징으로 삼기엔 민망한 정도다. C#과는 비교할만하다고 생각한다.
생산성을 올리는 데에는 언어보다 프레임워크가 중요하다. 다만 프레임워크는 언어의 특성에 강한 영향을 받을 뿐이다. Cocoa는 매우 훌륭하고 친절한 프레임워크다. 모든 것들이 직관적이다. Objective-C 뿐만 아니라, Cocoa 역시 Smalltalk의 영향을 강하게 받았다.
긴 메서드 이름들은 짜증이 났다. 다음 코드는 Objective-C + Cocoa로 특정 URL의 내용을 문자열로 받아오는 내용이다. 그 내용의 인코딩이 UTF-8이라고 가정하고 있다.
NSString *string;
NSURL *url;
NSError **outError;
url = [NSURL URLWithString: @"http://vlaah.com/"];
string = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error: outError];
사실 위 내용을 Python으로 옮기면 아래처럼 된다.
import urlopen from urllib
string = urlopen('http://vlaah.com/').read().decode('UTF-8')
코드에 들어있는 식별자(identifier)들의 이름은 매우 중요하다. 그렇지만 더 중요한 것은 친절한 예제가 첨부되어 있는 문서다. 길 필요는 없고, 친절하기만 하면 된다. 실제 코드의 식별자는 문서를 읽은 사람이 그 내용을 떠올리는데 도움을 줄 정도면 충분하다.
처음에는 내가 쓰는 C 컨벤션—정확히 말하면 C++를 하다가 굳은 컨벤션—을 사용하다가, 그냥 Apple이 문서와 각종 Cocoa 사이트에서 예제에 쓰이는 컨벤션을 따랐다. 어차피 수많은 사람들이 사용하는 컨벤션이면 불편할 리는 없다. 컨벤션이 없는 것은 문제지만, 일단 있으면 그 문화에 적응하는 것이 편한 것 같다. 실제로 나는 개인 프로젝트의 PHP 코드들에서는 들여쓰기를 탭 한 칸으로 하지만, 회사의 PHP 코드에서는 스페이스 네 번을 사용하고, Ruby로 무언가를 할 때는 스페이스 두 칸을 사용한다.
아무튼 작성한 어플리케이션의 이름은 Readown으로 정했고, 아래 페이지에서 좀더 자세한 정보를 얻을 수 있다.
http://readown.googlecode.com/
약간 어설픈 아이콘은 후배 이흥섭 군이 만들어줬다.
