Cocoa framework

Cocoa란 애플 환경에서 애플리케이션을 제작하기 위한 도구들의 모음입니다. Cocoa가 제공하는 도구 중 가장 대표적인 것이 유저 인터페이스(UI)인데요, Mac OS X와 iOS의 많은 애플리케이션들이 비슷비슷한 UI를 가지고 있는 이유는 바로 이 Cocoa에서 제공하는 UI 기능들을 사용하기 때문입니다.

Cocoa는 UI 뿐만 아니라, 맥이나 iPhone/iPad의 하드웨어를 다루는 데 필요한 많은 기능들을 제공합니다. 또한, 프로그램과 자료구조를 다루는 데 사용하는 많은 표준들도 제공하죠. 애플 환경에서 프로그램을 작성할 때는, 대부분의 경우 Cocoa를 사용한다고 볼 수 있습니다.

이 Cocoa는 여러 개의 Framework로 이루어져 있습니다. Framework는 흔히 얘기하는 Shared Library 또는 API와 비슷한 개념으로, 어떤 기능에 관련된 함수들을 모아놓은 것입니다. 예를 들어, 최근 애플에서 iPhone 앱 내부에 광고를 싣고 돈을 벌 수 있는 iAd 기능을 공개하면서 AdLib framework도 함께 공개했습니다. 개발자는 이제 AdLib framework에 들어있는 클래스들을 사용하여, 자신의 애플리케이션에 광고 기능을 추가할 수 있는 것이죠.

Framework의 계층 구조

따라서 Cocoa는 여러 Framework들의 집합이라고 볼 수 있는데요, 그중에서도 Cocoa에 속하는 Framework는 보통 가장 상위 레벨의 Framework들 입니다. 바꿔 말하면, 프로그래머가 필요한 기능을 가장 손쉽게 사용할 수 있다는 뜻이죠. 이러한 상위레벨의 Cocoa Framework는, 내부적으로 하위 레벨의 Framework를 이용하여 이와 같은 기능을 구현합니다.

한번 예를 들어볼까요? Cocoa의 AppKit Framework에서 제공하는 NSWindow라는 클래스는 애플리케이션의 윈도우를 그려줍니다. 윈도우 이동, 크기 조절 등의 기능을 모두 포함하죠. 프로그래머는 일일히 이런 기능을 구현하지 않아도, NSWindow 클래스를 이용해 유저에게 같은 기능을 제공할 수 있습니다. 따라서 AppKit Framework는 매우 상위 레벨의 Framework라고 할 수 있습니다.

하지만 이러한 윈도우의 기능을 구현하려면, 내부적으로는 보다 하위 레벨의 작업을 처리해야 합니다. 예를 들면 화면에 윈도우를 그리고, 또 크기 조절 아이콘 같은 것들을 배치하는 일들이 필요하겠죠. 이렇게 화면에 그래픽을 표시하기 위해, AppKit Framework는 Core Graphics라는 하위 레벨 Framework를 사용합니다.

이처럼 프로그래머는 상위 레벨의 Framework를 사용하고, 상위 레벨 Framework은 하위 레벨 Framework를 사용합니다. 이로써 프로그래머는 상위 레벨의 Framework만 알면, 여러가지 복잡한 기능들을 손쉽게 구현할 수 있게 됩니다. 하지만 경우에 따라 상위 레벨 Framework가 제공하지 않는 기능을 필요로 할 때는 (예를 들어 별 모양으로 생긴 윈도우를 만들고 싶다면), 프로그래머가 직접 하위 레벨 Framework를 이용하여 원하는 기능을 직접 구현하기도 합니다.

이러한 Framework의 계층 구조를 이해하고 있으면, 원하는 기능을 제공하는 Framework를 빨리 찾을 수 있습니다. 먼저 상위 계층의 Framework에서 필요한 기능을 제공하는 것을 찾고, 만약 원하는 기능이 제공되지 않는다면, 그보다 하위 계층의 Framework들을 검토해 보게 됩니다.

iOS의 경우, 다음과 같은 4계층의 Framework 구조를 갖고 있습니다.


앞서 설명한 Framework의 계층 구조로 이해해 보자면, 예를 들어 Media 계층의 Framework는 내부적으로 하위 계층의 Framework, 즉 Core Services나 Core OS 계층의 Framework를 이용하고, 또 그 자신은 상위 계층인 Cocoa Touch의 Framework를 구현하는데 사용될 수 있습니다.

Cocoa framework의 양대 산맥, Foundation과 AppKit (혹은 UIKit)

Apple이 제공하는 Framework의 종류는 매우 많습니다만, 가장 핵심이 되는 Framework는 2가지 입니다.

먼저, Foundation은 프로그램의 중심을 담당합니다. 매우 대략적인 설명이긴 합니다만, 애플리케이션의 모든 오브젝트들을 관리하는 기본적은 틀을 제공하기도 하고, 메모리를 할당하거나 반환하는 기본적인 규칙을 정의하기도 하며, 리스트나 딕셔너리와 같은 컨테이너들을 제공하기도 합니다. 위 그림에서 Foundation은 Core Services 레이어에 해당하는 Framework입니다. 그리고 Foundation에서 제공하는 클래스들은 모두 NS라는 문자로 시작하게 되지요 (예: NSObject).

한가지 알아둘 만한 것은, Foundation이 이용하는 CoreFoundation이라는 하위 Framework입니다. 보통은 Foundation을 이용하여 프로그램을 작성하지만, 프로그래머가 직접CoreFoundation을 이용하는 경우도 종종 있는데요, CoreFoundation의 클래스들은 모두 CF라는 문자로 시작한답니다. 그래서 프로그램 도중 CF로 시작하는 클래스가 선언된다면, 그것은 프로그램이 직접 CoreFoundation을 사용하는 예입니다.

Mac OS X에서 Foundation과 함께 Cocoa의 핵심을 이루는 또 하나의 Framework는 Application Kit입니다. 보통 AppKit라고 많이 얘기하는데, 주로 유저 인터페이스에 관련된 기능을 제공하며 Foundation과 마찬가지로 NS로 시작하는 클래스들을 가지고 있습니다.

반면 iOS의 경우는 Mac OS X과 사용자 인터페이스가 많이 다릅니다. 따라서 iOS에서 UI를 담당하는 Framework가 따로 있는데요, 바로 UIKit라고 불리는 녀석입니다. AppKit와 달리 UIKit의 클래스들은 UI로 시작하는 이름을 갖고 있습니다. Mac OS X에서 사용하는 클래스와 혼동을 막기 위해서이죠 (예: NSWindow/UIWindow).

Cocoa의 핵심을 이루는 것은 바로 이 두 Framework입니다 (Foundation과 AppKit, iOS의 경우는 Foundation과 UIKit). 이들 Framework를 포함하여 Cocoa의 대부분의 Framework는 Objective-C 언어를 기반으로 작성되어 있는데요, 이 때문에 Cocoa 프로그래밍에서는 Objective-C 환경을 이해하는 것이 필수적이라고 할 수 있죠.

그 이름에서 짐작해 볼 수 있듯이, Objective-C언어는 일반 C 언어와 아주 밀접한 관계가 있습니다. 사실 표준 C 문법에 기반하고 있기 떄문에, 어떤 기준에서는 거의 같은 언어라고 볼 수도 있지요. 그렇기 때문에 일반 C/C++ 환경의 개발에 익숙한 개발자들이 Objective-C로의 전환을 아주 가볍게 생각하기도 합니다.

물론 C/C++의 지식은 Objective-C를 공부할 때 큰 도움이 됩니다만, Objective-C는 사실 C++과 아주 상반되는 철학으로 프로그래밍에 접근합니다. 이 본질적인 차이를 염두에 두지 않는다면, 훌륭한 Objective-C 코드를 작성하기 쉽지 않은 일이죠. 다음 포스팅에서는 이 Objective-C의 독특한 철학의 핵심이 되는 런타임 환경을 이해해 보도록 합시다.






댓글을 달아 주세요

  1. cocoamaker 2012.05.08 19:53  댓글주소  수정/삭제  댓글쓰기

    좋은 정보네요. 퍼갈께요^^