코코아가 무엇인가요

OSXDEV

Jump to: navigation, 찾기

목차

[편집] Cocoa가 무엇인가요?

Cocoa는 카본과 자바와 함께 Mac OS X 운영체제의 프로그램 환경입니다. 객체지향 소프트웨어 라이브러리와 런타임을 갖추고 있으며 다른 응용프로그램 환경과 함께 통합된 개발 환경을 공유합니다.
이 챕터는 이 정의와 목적의 설명, 기능, 물리적인 형태에 대한 설명을 담고 있습니다. Cocoa에 대한 이 실용적인 설명을 읽는 것은 개발자로 Cocoa를 이해하는데 있어서 필수적인 단계입니다.

[편집] Cocoa 환경

Cocoa 프로그램은 점차적으로 Mac OS X 의 표준이 되고 있습니다. iPhoto와 Safari, Mail 프로그램 모두 Cocoa 프로그램 입니다. 이 프로그램들은 똑똑한 디자인과 풍부한 기능, 멋진 유저 인터페이스로 인해 상당한 칭찬을 받아왔습니다. 하지만 일반 사용자들에게 어떻게 이 프로그램들이 전통적인 개발 주기에 비해 디자인 단계로부터 배포까지 이렇게 빠르게 만들어 질 수 있었는지는 명확하지 않을 것입니다. Cocoa가 카본을 대신할 프로그램으로 그리고 개발 환경으로 대신 사용할 수 있으며 더 나아가 주목할 수밖에 없는 이유가 무엇일까요?

[편집] Cocoa를 소개합니다

모든 개발환경과 마찬가지로, Cocoa는 런타임의 측면과 개발의 측면의 두가지 모습을 가지고 있습니다. 런타임의 측면에서, Cocoa 프로그램들은 아쿠아 유저 인터페이스를 표현하며 파인더, 닥, 그리고 모든 환경의 다른 프로그램들 등 운영체제의 다른 시각적인 부분들과 긴밀히 통합되어 있습니다. 사용자의 컴퓨팅 체험의 흠없는 한 부분으로 Cocoa의 런타임측면은 훌륭하게 작동합니다.

하지만 개발자들에게는 개발측면이 더 흥미로울 것입니다. Cocoa는 강력하고, 다양한 기능을 갖춘 Mac OS X 응용프로그램을 빠르게 만들 수 있도록 해주는 객체지향 소프트웨어 컴포컨트(클래스들)가 통합된 스위트입니다. 이들 클래스는 재사용 가능하며 적용 가능한 소프트웨어의 기본 토막입니다. 개발자들은 클래스를 그 자체로 사용하거나 그들의 구체적인 필요에 따라 확장할 수 있습니다. 유저인터페이스에서 Bonjour 네트워킹까지 Cocoa 클래스들은 거의 모든 개발 필요에 맞게 이미 존재하고 있으며, 필요를 충족시킬 클래스가 존재하지 않을 경우라면 존재하는 클래스를 쉽게 확장해서 사용할 수 있습니다.

Cocoa는 다른 어떤 객체지향 개발환경보다 독특한 혈통을 가지고 있습니다. 1989년 NeXTSTEP이라고 소개된 이래로 오늘날까지, 지속적으로 다듬어지고 테스트되어져왔습니다.("A Bit of History"를 보십시오.) 우아하며 강력한 디자인은 응용프로그램 뿐 아니라 커맨드라인 툴, 플러그인, 그리고 다양한 종류의 번들을 빠른 속도로 개발하기에 매우 적합합니다. Cocoa는 응용프로그램의 행동과 외양의 많은 부분을 무료로 제공하여, 개발자의 시간을 프로그램을 돋보이게하는 기능들에 더 할애할 수 있도록 합니다.(Cocoa가 제공하는 것들에 대해 더 알고싶으시다면 Cocoa 프로그램의 특징을 읽으십시오.)

Cocoa 소프트웨어를 개발할때 몇가지 프로그램 언어를 사용할 수 있습니다. 가장 주된 언어는 Cocoa에서 자신의 런타임을 가지고 있는 Objective-C 입니다. Objective-C는 객체지향 프로그래밍을 지원하기 위해 (Smalltalk으로부터 파생된) 특정한 문법과 세만틱을 더 확장시킨 ANSI C의 슈퍼셋입니다. 추가된 몇몇 컨벤션들은 단순하며 학습 및 사용이 쉽습니다. Objective-C가 ANSI C에 기반을 두고 있기 때문에 C 코드와 Objective-C코드를 쉽게 섞어 사용할 수 있습니다. 뿐만아니라, Cocoa 프로그래밍 인터페이스가 아닌 곳, 카본이나 BSD 등에서 정의된 함수를 호출할 수 있습니다. 심지어 여러분의 Cocoa 코드와 C++코드를 섞어서 링크하여 함께 실행시킬 수도 있습니다. 마지막으로, Cocoa는 자바 클래스들과 자바 인터페이스에 상응하는 Objective-C의 적용을 연결지어주는 메카니즘을 통해 자바 또한 지원합니다. Cocoa에서는 특정한 범위 내에서 순수 자바 객체를 Cocoa객체와 혼용할 수 있습니다.

주의: Cocoa-Java는 Java와 친숙한 개발자들을 위한 학습 환경입니다. 본격적인 개발에는 추천하지 않습니다. Objective-C의 발전에 Cocoa-Java API가 대응하지 않습니다


심지어 Python/Objective-C 브릿지인 PyObjC를 이용해서 코코아 프로그래밍을 할 수도 있습니다. PyObjC는 번역된, 인터랙티브한 객체 지향 언어인 Python으로 Cocoa 프로그램을 작성할수 있도록 합니다. PyObjC는 Python 객체가 Objectice-C 객체에 마치 Python 객체 인 것처럼 메시지를 전송할 수 있게 하며, 반대로 Objective-C 객체가 Python 객체에 메시지를 보내는 것도 가능하게 합니다. 더 많은 정보를 원하시면 애플 디벨로퍼 커넥션 웹사이트에서 "Using PyObjC for Developing Cocoa Applications With Python"을 읽으십시오.

Cocoa 클래스의 핵심 라이브러리는 Foundation과 Application Kit 두 개의 프레임웍에 포함되어 있습니다. 이 둘은 다른 모든 프레임웍과 마찬가지로, 동적으로 공유가능한 라이브러리(때로는 호환성을 위한 몇개의 버젼의 라이브러리)뿐만 아니라 헤더파일, API 문서, 관련된 리소스들을 포함합니다. Application Kit 과 Foundation은 Cocoa 프로그래밍의 인터페이스에서 그래픽 유저 인터페이스를 포함하고 있는 클래스와 그렇지 못한 클래스로 나뉘어져 있는 것을 반영하고 있습니다. 이 두 프레임웍은 어느 Cocoa 프로젝트이건 응용프로그램을 만드는 경우라면 필수적입니다. Mac OS X은 Cocoa 프로그래밍 인터페이스를 제공하는 몇몇 작은 프레임웍도 제공하고 있습니다. 그 예로 Screen Saver나 Address Book 프레임웍이 있으며 더 많은 프레임웍들이 시간이 지남에 따라 추가되어 질 것입니다. 추가적인 정보를 위해 "The Cocoa Frameworks"를 읽으십시오.

[편집] Mac OS X에서 Cocoa의 위치

그림 1-1은 단순화한 Mac OS X 시스템 아키텍쳐를 보여줍니다.

그림 1-1 Mac OS X 아키텍쳐 - 단순 보기
그림:A_cc_cfg_osx_functional.gif

이 그림은 Mac OS X의 주요한 구성요소와 의존성을 잘 모르는 사람들에게 분명히 보여주기 위한 목적으로 단순화된 것입니다. 하지만 이 단순함 때문에 중요한 세부사항을 빼먹거나 다른 것들을 불분명하게 합니다. 이러한 세부사항은 Cocoa가 어떻게 Mac OS X의 다른 요소들과 어울리는 지를 보여주는 중요한 부분입니다.

그림 1-2는 아키텍쳐 세팅의 Cocoa의 위지를 더 잘 보여줍니다. 이 도표는 Mac OS X의 Darwin기반부터 다양한 응용프로그램 환경까지의 소프트웨어 레이어를 보여줍니다. 중간에 끼여있는 레이어들은 Core Services 와 Application Services 두개의 핵심 프레임웍에 포함된 시스템 소프트웨어 계층을 표시합니다. 이 도표는 한 레이어에 있는 요소들이 그 아레에 있는 레이어에 일반적으로 의존성을 가지고 있음을 보여줍니다.

Figure 1-2 Mac OS X 아키텍쳐에서 살펴본 Cocoa
그림:A cc cfg osxlayers.gif

어떤 면에서 이 도표는 이전 도표보다 더 단순합니다. 예를 들면, Aqua 유저 인터페이스와 (Core Graphics 프레임웍에 구현된)Quartz를 표현하는데 중요한 역할을 하는 시스템 요소는 Application Services 레이어에 포함되어 있습니다. 아키텍쳐 계층의 가장 기반은 Darwin입니다. Cocoa를 포함한 모든 Mac OS X은 제대로 기능하기 위해 Darwin에 의존하고 있습니다.

하지만 코코아 클래스와 감싸고 있는 프레임웍의 특정한 하부프레임웍을 더 자세히 살펴본다면, 코코아가 다른 Mac OS X의 부분에 특정한 의존성을 가지고 있는 곳이 어디인지, 또 자신의 인터페이스를 통해 기반기술을 노출시켜주고 있는 곳이 어디인지를 볼 수 있을것입니다.

노트 : Cocoa가 특정한 프레임웍에 의존성을 가지고 있지만, 그들 위에 위치하고 있는 것은 아닙니다. 몇몇 경우에, 코코아는 다른 프레임웍(예를 들어, Carbon)과 같은 위치에 있으며 그런 동등한 위치에 있는 프레임웍들은 할수 없는 것들을 하기도 합니다. Cocoa는 기반기술 위에 있는 단순한 객체지향 레이어가 아닙니다.


Figure 1-3 Cocoa 아키텍쳐 자세히 살펴보기- 주요 의존성들
그림:A cc cfg systemlayers3.jpg
Apple은 Cocoa를 잘 디자인하여 프로그래밍 인터페이스를 통하여 응용프로그램들이 필요로 할만한 기반기술들의 기능에 접근할 수 있도록 하였습니다. 그러나 Cocoa의 프로그래밍 인터페이스를 통해 노출되어 있는 기능 외의 것들을 필요로 하거나 응용프로그램에서 일어나고 있는 것들을 정밀하게 다뤄야 할 필요가 있다면, 기반 프레임웍을 직접 사용할 수도 잇습니다. (주요한 예는 Core Graphics입니다. Core Graphics의 함수나 OpenGL의 함수를 호출하여 여러분이 작성한 코드는 Cocoa의 드로잉 메소드를 사용했을 때보다 더 복잡하고 미묘한 이미지를 그릴 수 있습니다.) 다행이도, 이런 로우레벨 프레임웍을 사용하는 것은 대부분의 의존적인 프레임웍의 프로그래밍 인터페이스가 standard ANSI C로 작성되었고 Objective-C가 그 슈퍼셋이기 때문에 문제가 되지 않습니다.

노트: 이 아키텍쳐 오버뷰는 Cocoa가 가지고 있는 인터페이스나 혹은 Mac OS X의 다른 부분에 의존성을 모두 표시하고자 하는 것이 아닙니다. 프레임웍의 아키텍쳐 측면의 일반적인 아이디어를 제공하고자 더 흥미로운 것들만을 살펴보고 있습니다.


Cocoa가 의존하거나 클래스와 메소드를 통해 노출하고 있는 주요 하부 프레임웍은 Core Foundation, Carbon, Core Graphics (Quartz), Launch Services, Print Core (the printing subsystem)입니다:

  • Core Foundation. Foundation 프레임웍의 많은 클래스들은 대응하는 Core Foundation의 불투명한 타잎들에 기반하고 있습니다. 이 가까운 관계로 Core Foundtion과 Foundation 타입들 간에 형 변환을 비용없이 브릿징할 수 있게 합니다. Core Foundation의 몇몇 적용은 Darwin 계층의 BSD 부분에 기반하고 있습니다.
  • Carbon. Cocoa 가 제공하는 몇몇 서비스는 Carbon을 이용합니다. 이것은 다양한 Carbon 프레임웍이 Core Services와 Application Service 계층에서 시스템 전반에 위치하고 있기 때문입니다. Carbon Core는 이들 프레임웍중 특히 중요합니다. 예를 들어, Cocoa가 다양한 파일 시스템 표현간의 변환을 하는데 사용하는 File Manager 같은 것이 Carbon Core에 포함되어 있습니다.
  • Core Graphics. Cocoa 드로잉, 이미징 클래스들은 (자연스럽게) Quartz와 window 서버를 구현하는 Core Graphics 프레임웍에 밀접하게 기반하고 있습니다.
  • Launch Services. NSWorkspace 클래스는 Launch Service의 기반 기능들을 노출시킵니다. Cocoa는 또한 Launch Services의 응용프로그램-등록 기능을 이용하여 응용프로그램과 문서에 연결된 아이콘들을 받아옵니다.
  • Print Core. Cocoa 프린팅 클래스는 프린팅 하부시스템에 객체 지향 인터페이스를 제공합니다.


여기에 추가하여, Cocoa는 Carbon 환경의 Text Encoding Converter 서비스를 몇몇 스트링-인코딩 변환을 위해 사용합니다. 다양한 Cocoa 메소드도 전원 관리를 위해 I/O Kit 프레임웍, QuickDraw 드로잉을 위한 QuickDraw (QD)프레임웍 애플 이벤트 처리를 위한 Apple event(AE) 프레임웍 그리고 폰트 지원을 위해 ATS프레임웍의 일부를 노출시킵니다.

더 읽어보기: Mac OS X Technology Overview에서 프레임웍, 서비스, 기술, 다른 Mac OS X의 요소들의 개요를 살펴볼 수 있습니다. Apple Human Interface Guidelines에서는 어떻게Aqua human interface가 표현되고 행동해야하는지를 알 수 있습니다.


[편집] Cocoa 프로그램의 특징

코드 한줄 작성하지 않고도 Cocoa 프로그램을 작성하는 것이 가능합니다. Xcode를 이용해서 새로운 Cocoa 애플리케이션 프로젝트를 만든 후, 프로젝트를 빌드하십시오. 그것으로 끝입니다. 물론, 이 프로그램은 별로 할 수있는 기능이 없어보이고, 그닥 흥미롭지 않을 것입니다. 하지만 이 아주 단순한 프로그램은 더블클릭으로 띄울 수 있고 Dock에 아이콘을 띄우며, 메인 메뉴와 Window라 이름지어진 창을 띄우고, 숨기기 명령으로 숨길수 있으며, 다른 실행 중인 프로그램과 잘 작동하고, 종료 명령으로 종료할 수 있습니다. 창을 움직이고 크기를 조절하고, 최소화시키고 닫을수도 있습니다. 심지어 창안에 있는 빈 내용을 프린트까지 할 수도 있습니다.

아주 약간의 코드가 더해진다면 할 수 있는 일이 얼마나 될지 상상해보십시오.

Cocoa는 개발자에게 많은 것을 아주 적은 프로그래밍의 노력으로도 얻을 수 있도록 합니다. 물론, 생산적인 코코아 개발자가 된다는 것은 새로운 개념과 디자인패턴, 프로그래밍 인터페이스, 그리고 개발툴에 익숙해 지는 것을 의미하며 여기에 들여야하는 노력이 적지는 않습니다. 하지만 친숙함은 더 큰 생산성을 이룰 수 있도록 합니다. 프로그래밍은 대부분 Cocoa가 제공하는 프로그래밍 요소들을 당신만의 로직을 정의하는 커스텀 객체와 코드와 함께 조합하고 전체의 조합을 함께 맞춰가는 과정이 됩니다.

당신의 약간의 노력과 함께(때로는 노력 없이도) Cocoa가 프로그램에 가치를 어떻게 더해주는지 아래의 짧은 목록을 통해 살펴보십시오:

  • 기본적인 애플리케이션 프레임웍—Cocoa는 이벤트로 발생한 행동(behavior), 그리고 응용프로그램-, 창-, 작업공간-관리를 위한 기반기술을 제공합니다. 대부분의 경우는 직접 렌더링 라이브러리로 드로잉 명령을 보내거나 이벤트를 다뤄야할 필요가 없습니다.
  • 유저 인터페이스 객체—Cocoa는 프로그램의 유저 인터페이스를 위해 바로 사용할 수 있는 객체들의 풍부한 컬렉션을 제공합니다. 대부분의 이런 객체들은 유저 인터페이스를 만들기 위한 개발 프로그램인 Interface Builder를 통해 사용 가능합니다. Interface Builder의 팔렛트로부터 프로그램의 인터페이스의 표면에 원하는 객체를 끌어당겨놓고, 객체의 속성을 설정하고, 다른 객체와 연결하면 됩니다. (물론 당연히 객체를 초기화하고 구성하며 연결하는 것을 직접 코드로 작성할 수도 있습니다.) 아래의 표는 Cocoa 인터페이스 객체의 예입니다.



windows text fields radio buttons drawers
sheets tab views table views browsers
pop-up lists sliders image views color wells
combo boxes scroll views text views steppers

추가로, Cocoa는 유저인터페이스를 지원하는 기술을 갖추어 사용자 인터페이스와 커스텀 객체간의 접근, 허가, 객체들 사이의 연결 등을 수행하는 것들을 포함합니다.

  • Drawing and imaging—Cocoa는 프레임웍 이용해 효과적으로 커스텀 뷰를 그릴 수 있게 하며 그래픽 포커스를 고정시키거나 뷰(혹은 그 일부)를 "더러운 상태"로 표시할 수 있게 합니다. 비지어 패스 그리기, 아핀 변환, 이미지 합성, 이미지의 다양한 표현을 만들어내기 위한 프로그래밍 툴을 포함합니다.
  • System interaction—Cocoa는 당신의 응용프로그램이 파일시스템, 작업공간, 그리고 다른 응용프로그램들과 상호작용할 수 있는 방법들을 (그리고 제공하는 서비스를 사용할 수 있는 방법들을) 제공합니다.
  • Data exchange—Cocoa는 복사 및 붙여넣기, 드래그 앤 드랍 모델, Services메뉴를 통해 응용프로그램 내에 그리고 응용프로그램들 간의 데이터 교환을 단순화 시킵니다.
  • Performance—당신의 프로그램의 성능을 향상시키기 위해, Cocoa는 멀티쓰레딩, 유휴시간 프로세싱, 늦은 자원 로딩, 메모리 관리, run-loop 수정을 위한 프로그래밍의 지원을 합니다.
  • Document-based applications—Cocoa는 각각의 창을 포함하는 문서를 무제한으로 가질 수 있는 응용프로그램(예를 들어, 워드프로세서)을 위한 아키텍쳐를 지정해 놓았습니다. 사실, 프로젝트 형식을 “Document-based application” 으로 지정해 놓으면, 이런 종류의 프로그램의 많은 구성요소들이 이미 여러분을 위해 만들어져 있습니다.
  • Scripting—응용프로그램을 스크립팅 가능하게 만드는 정보와 스크립팅을 지원하는 Cocoa 클래스들을 통해 여러분의 응용프로그램을 스크립팅 가능하게 만들 수 있습니다. AppleScript의 스크립트에서 보내지는 스크립트에 반응하는 프로그램을 만들 수 있는 것입니다. 응용프로그램들은 또한 스크립트를 실행시키거나 개별 Apple 이벤트를 다른 프로그램에 이용해 명령을 보내고 데이터를 받을 수 있습니다. 결과적으로, 모든 스크립트 가능한 응용프로그램은 사용자와 다른 프로그램 모두에게 서비스를 제공할 수 있게 됩니다.
  • Internationalization—Cocoa는 오랜 시간동안 다듬어진 국제화와 지역화 접근법을 사용합니다. 이 접근법은 사용자의 선호 언어 목록에 기반하여 응용프로그램의 번들안에 지역화된 자원들을 집어넣습니다. 또한 지역화된 문자열을 만들어내고 접근하기 위한 툴과 프로그래밍 인터페이스도 제공합니다. 게다가, Cocoa의 텍스트 처리는 기본적으로 Unicode이기에 국제화가 더욱 용이합니다.
  • Undo management—사용자의 액션을 undo manager에 등록시킬 수 있으며, 사용자가 적절한 메뉴 아이템을 선택하면 undo manager는 undo를(그리고 redo를) 처리할 것입니다. 관리자는 undo와 redo 수행을 분리된 스택에 유지합니다.
  • Text—Cocoa는 복잡한 텍스트 시스템을 통해 (편집 가능한 텍스트 뷰를 표시하는) 단순한 텍스트 작업에서부터 kerning, ligature, 철자 확인, 이미지 삽입 같이 더욱 복잡한 텍스트 작업까지 수행할 수 있도록 합니다.
  • Printing—텍스트 시스템과 비슷한 방식으로 프린팅 아키텍쳐는 문서와 응용프로그램의 다른 내용물을 인쇄할 수 있도록 합니다. 가장 단순한 수준으로 어느 뷰의 내용물이건 다 인쇄할 수 있습니다. 좀 더 복잡한 수준에서는 내용물과 프린트된 내용물의 포맷, 프린트 작업 방식, 프린트 패널의 추가적인 뷰들을 지정해줄 수 있습니다.
  • Preferences—유저 디폴트 시스템은 전체 시스템 설정이나 응용프로그램 특정의 환경설정을 저장할 수 있는 시스템 데이터베이스에 기반하고 있습니다.
  • Networking—Cocoa는 분산 객체 아키텍쳐를 포함하여, Cocoa 프로세스 하나가 같은 컴퓨터나 다른 컴퓨터의 다른 프로세스와 통신을 가능하게 합니다. 또한 응용프로그램에 Bonjour 기능을 이용할 수 있도록 프로그래밍 인터페이스도 제공합니다.
  • Multimedia—Cocoa는 Quicktime 비디오와 기본적인 오디오 기능을 제공합니다.


추가적으로, Cocoa는 접근을 쉽게하며, 확인을 수행하며, 유저 인터페이스와 커스텀 객체간의 연결을 지어주는 것들을 포함하는 유저 인터페이스를 지원하는 기술을 가지고 있습니다.

[편집] 개발환경

Cocoa가 자신만의 개발 환경을 가지고 있다고 말한다면 그것은 아주 정확한 표현은 아닙니다. 일단, 개발자들은 애플의 주 개발 프로그램인 Xcode와 Interface Builder를 이용해 Carbon과 같이 다른 Mac OS X 응용프로그램 환경의 프로그램을 개발하는데 사용할 수 있습니다. 심지어, Cocoa 프로그램을 Xcode나 Interface Builder를 전혀 사용하지 않고 개발할 수도 있습니다. 예를 들자면, Metrowerks의 CodeWarrior를 이용해 Cocoa 프로젝트를 관리하고, 컴파일하고, 디버그 할 수 있습니다. 또한, 정말 하드코어하게 하고 싶다면, Emacs와 같은 텍스트편집기를 이용하고, 응용프로그램을 make files를 통해 커맨드라인에서 빌드하고, gdb 디버거를 사용해 커맨드 라인에서 응용프로그램을 디버깅 할 수 있습니다.

그러나, Xcode와 Interface Builder가 Cocoa 소프트웨어를 개발하는데 있어서 선호되는 프로그램입니다. 이 프로그램들은 Cocoa 자체의 시작과 역사를 함께합니다. 따라서 툴과 프레임웍 사이의 상호운용성이 매우 높습니다. Xcode와 Interface Builder가 함께 Cocoa 소프트웨어 프로젝트의 디자인, 관리, 빌드, 디버그를 놀랍도록 쉽게 만들어줍니다. 또한 AppleScript Studio를 통해 Cocoa 응용프로그램을 스크립팅 가능하게 만들거나 다른 응용프로그램을 조절하기 위해 AppleScript를 사용하는 프로그램을 만들수 있도록 합니다.

[편집] Xcode

Xcode는 Apple의 Mac OS X상의 통합된 개발 환경(IDE)을 이끄는 엔진역할을 합니다. 이 응용프로그램을 이용해 프로젝트의 탄생에서 배포에 이르기까지 대다수의 프로젝트 상세 내용을 처리해줍니다. 이 프로그램을 이용하여 다음과 같은 것들을 할 수 있습니다.

  • 프로젝트를 생성하고 다루며, 타겟 필요사항, 의존성, 빌드 스타일을 지정합니다.
  • 신택스 컬러링, 자동 들여쓰기 등의 기능이 있는 편집기에서 소스코드를 작성합니다.
  • 헤더 파일과 문서를 포함해 프로젝트의 요소를 탐색하고 검색합니다.
  • 프로젝트를 빌드합니다.
  • 그래픽 소스 수준의 디버거를 이용해 프로젝트를 디버그합니다.

Xcode는 C, C++, Objective-C, Objective-C++, Java로 쓰인 소스코드로부터 프로젝트를 빌드합니다. 커맨드라인툴, 프레임웍, 플러그인, 커널 익스텐션, 번들, 응용프로그램을 포함해 Mac OS X에서 지원되는 모든 형태의 실행코드를 생성합니다. Xcode는 빌드와 디버깅 툴, 실행코드 패키징(정보 프로퍼티 리스트와 지역화된 번들), 빌드 프로세스(카피파일, 스크립트파일, 다른 빌드 단계를 포함), 사용자 인터페이스(분리된 멀티 뷰 코드에디터 포함)를 거의 무제한으로 사용자화할 수 있습니다. 또한 몇몇 소스코드 관리 시스템(CVS, Perforce등)을 지원하여 파일을 저장소에 저장하고 수정하며, 업데이트된 버젼을 받으며 버젼을 비교할 수 있습니다.

Figure 1-4 Xcode안의 프로젝트의 예.
그림:A cc cfg pb example.jpg
Xcode는 특히 코코아 개발에 적합합니다. 프로젝트를 생성할때, Xcode는 Cocoa프로젝트 타입에 대응하는 초기 개발 환경을 구축합니다. 타입들로는 응용프로그램(Objective-C 나 Java), 툴, 번들, 그리고 프레임웍이 있습니다. Xcode는 Cocoa 소프트웨어의 컴파일에 GNU C 컴파일러(gcc)를 사용하며 소프트웨어의 디버깅에는 GNU 소스-수준의 디버거(gdb)를 사용합니다. gcc와 gdb 모두 Cocoa가 NeXTSTEP("약간의 역사"를 보십시오)일때부터 Cocoa 개발에 사용되었으며, 수년간 Cocoa 바이너리의 작성과 디버깅을 지원하도록 다듬어지고, 확장되고 잘 맞춰져왔습니다.

Xcode는 또한 임포트된 모든 Cocoa 프레임웍의 클래스와 커스텀 클래스 모두를 상속관계에 따라 볼수 있도록 하는 클래스-브라우징 기능을 갖추고 있습니다. 클래스 브라우저로부터 어느 클래스에 대한 문서든 요청할 수 있습니다. 또 디자인 툴들도 포함하고 있는데 Core Data 응용프로그램에서 사용된 개채들의 관계와 속성을 디자인하는데 사용할 수 있습니다.

Xcode는 다른 주 개발 프로그램인 Interface Builder와도 잘 통합되어 있습니다. Interface Builder에서 클래스(수퍼클래스, 아웃렛, 액션)을 정의할 수 있으며, 프로젝트의 각 클래스의 헤더파일과 소스파일의 틀을 생성할 수 있습니다. Xcode에서 커스텀 클래스의 액션과 아웃렛을 추가한 후, Interface Builder에서 이 개체들을 nib파일에 추가할 수 있습니다.


노트: 간단히 말하면 아웃렛은 한 객체와 다른 객체 사이의 압축된 연결입니다.(그리고 한 객체의 변수로 지정됩니다) 버튼이나 슬라이더 같은 객체들에 조작이 가해졌을때 타겟이라고 불리는 (일반적으로 커스텀 객체인)객체에서 불려지는 메소드 입니다. Interface Builder는 또한 타겟과 다른 객체(컨트롤이라고 불립니다)간의 연결 또한 압축합니다. 아웃렛, 타겟, 액션에 대해 더 알고 싶다면, "Outlets" 과 "The Target-Action Mechanism" 을 보십시오.


더 읽을거리:Xcode Quick Tour Guide에서 Xcode의 개관과 다른 개발 툴 문서들의 링크를 볼 수 있습니다.


[편집] Interface Builder

Cocoa 프로젝트를 위한 두번째 주 개발 프로그램은 Interface Builder입니다. 이름이 말해주듯, Interface Builder 는 유저 인터페이스를 만들기 위한 도구입니다. Interface Builder는 Cocoa가 NeXTSTEP으로 탄생할 때부터 있어왔습니다. 그 이후로 이런 류의 프로그램중 최고라는 평가를 널리 받아왔습니다. 놀랍지 않게도, Cocoa와의 통합은 매우 잘 되어 있습니다. 게다가, Carbon 응용프로그램을 개발하는데도 사용할 수 있습니다.

Interface Builder는 세가지 주요 디자인 요소로 이루어져 있습니다.

  • Nib files. nib 파일은 사실 사용자 인터페이스에 나타나는 객체들의 압축된 형태를 포함하고 있는 파일 랩퍼(불투명한 디렉토리)입니다. 핵심적으로, 이 아카이브는 각 객체의 크기와 (창인 경우) 화면상의 위치, 윈도우안에서의 위치 등의 정보를 담고있는 객체 그래프 입니다. Cocoa에서의 nib 파일은 커스텀 클래스의 프록시 정보와 Cocoa 바인딩 기술을 이용하여 만들어진 것들을 포함한 객체간의 연결 정보등을 담고 있습니다. Interface Builder를 이용하여 유저 인터페이스를 만들고 저장하면, 다시 프로그램을 띄울때 모든 필요한 정보는 nib 파일 안에 저장됩니다. nib 파일은 인터페이스에서 사용되어지는 이미지와 소리 파일도 포함할 수 있습니다.

Interface Builder는 nib파일을 Cocoa 프로젝트 안의 localized 디렉토리에 저장합니다. 프로젝트가 빌드되어질 때, nib 파일은 해당하는 만들어진 번들의 localized 디렉토리에 복사되어집니다.(따라서 nib 파일을 이용해서 쉽게 유저 인터페이스를 지역화할 수 있습니다.) Cocoa 응용프로그램은 Xcode에서 만들어지면 기본적으로 메인 nib 파일을 가지고 있으며, 실행되었을때 이 파일이 자동으로 로드되고 표시되어집니다. 이 메인 nib 파일에는 응용프로그램의 메인 메뉴와 아마 하나 혹은 그 이상의 윈도우를 포함하고 있습니다. 응용프로그램은 필요가 있을 시에 환경설정 창이나 문서 창 같은 이차 nib 파일을 띄울 수 있습니다.

Interface Builder는 nib 파일의 내용을 nib 파일 창 안에 표시합니다. nib 파일 창에서 또한 커스텀 클래스를 정의할 수 있으며 객체간 연결을 조사할 수 있습니다.

  • Palettes. Interface Builder의 Palette 윈도우는 각각 관련된 유저-인터페이스 객체를 포함하고 있는 복수의 pane 혹은 "palette"를 포함하고 있습니다. 스크린이건, 창이건, 어느 종류의 뷰이건, 혹은 메인메뉴이건 적합한 표면에 Palette로부터 객체를 드래그하여 유저 인터페이스를 만들 수 있습니다. (Palette 객체 자신이 보여져야할 필요는 없지만, 인터페이스에 어떤 식으로든 영향을 미쳐야 합니다.) palette로부터 객체가 드래그되어지면 Interface Builder는 그 객체의 기본 인스턴스를 생성합니다. 이 객체는 런타임에 생성되고 그때를 대비해 만들어져있는 프록시 객체가 아니라 진짜 Cocoa 객체입니다. 원한다면, 여러분의 커스텀 객체도 Interface Builder palette에 놓을 수도 있습니다.
  • Inspector. Interface Builder는 유저 인터페이스의 객체를 위한 (Info 창에 지정되어 있는)인스펙터를 갖추고 있습니다. Info 창은 몇개의 선택할 수 있는 pane들로 이루어져 객체의 초기값과 크기 등을 설정할 수 있도록 합니다. (크기와 많은 변수들은 직접 지정해줘서 설정해줘야 합니다.) 두개의 pane에서는 객체들 간의 연결을 설정해 줄수 있습니다. 하나는 아웃렛과 액션을 이용하는 방법이며 또 다른 하나는 바인딩을 이용하는 방법입니다. 다른 pane에서는 커스텀 클래스로 Application Kit 슈퍼클래스를 대치할 수 있도록 합니다. 또 다른 pane들에서는 help 태그, 유저-인터페이스 객체와 연결된 AppleScript 이벤트 핸들러등 특화된 설정들을 해줄 수 있습니다.



Figure 1-5 는 Interface Builder에서 열려있는 nib 파일과 주변 창들을 보여줍니다.

Figure 1-5  Interface Builder 상의 TextEdit의 환경 설정 창.

그림:A cc cfg ib example.jpg
Interface Builder에서 유저 인터페이스를 만드는 일반적인 순서는 매우 분명합니다.

1. 창이나 패널을 스크린에 드래그합니다. (패널은 다이얼로그나 보조 창과 같습니다)
2. 창의 초기(혹은 영구) 위치, 크기, 속성값들을 설정합니다.
3. 텍스트필드, 테이블뷰, 팝업 리스트와 같은 객체들을 창이나 혹은 전에 위치시킨 뷰에 드래그합니다.
4. 이들 객체의 초기(혹은 영구) 위치, 크기, 속성값들을 설정합니다.
5. 응용프로그램의 커스텀 클래스를 정의합니다.
이 과정은 Interface Builder 안에서 하거나 이전에 생성한 헤더 파일을 Interface Builder에 로딩하는 것으로 할 수도 있습니다. 커스텀 클래스를 정의할때, Interface Builder는 그 아웃렛과 액션을 지정할 수 있도록 합니다.
6. 객체 사이의 바인딩 혹은 연결을 설정합니다. 다음 두개의 형태 중 하나의 형식을 띄게 됩니다.

  • 응용프로그램의 뷰, 컨트롤러, 모델 객체 사이의 바인딩을 설정합니다.
  • 레퍼런스된 객체에 아웃렛을 연결하고, 타겟 객체의 적절한 메소드에 액션을 연결합니다.

7. 인터페이스를 저장하고 테스트합니다.
Interface Builder 는 (커스텀 비헤이비어를 제외하고) 각 디자인 단계마다 인터페이스를 테스트 할 수 있는 기능을 갖추고 있습니다.
8. 각 정의된 클래스의 헤더 파일과 소스 파일을 생성합니다. 이 파일들은 해당 Xcode 프로젝트에 나타납니다.

Interface Builder는 객체를 움직이거나 이동시킬 때 Aqua Human Interface Guideline에 따라 각 위치한 객체에 맞춰져 임시로 파란 줄을 보여주는 기능을 갖추고 있습니다. 이 규칙준수는 다른 유저 인터페이스 객체들과 창의 경계에 추천하는 상대적인 크기, 배치, 위치등을 포함합니다.

더 읽을거리: 이 유저-인터페이스 툴에 대한 정보를 더 원하신다면 Interface Builder를 읽으십시오. 추가로, "Nib Files"에서는 nib 파일과 응용프로그램에서의 사용방법에 대해 더 알수 있습니다. 아웃렛, 타겟-액션 기술, Cocoa 바인딩 기술에 대한 개관은 “Communicating With Objects”에서 찾을 수 있습니다.



[편집] AppleScript Studio

수년간 Mac OS X의 특징 중의 하나는 AppleScript 언어로 사용자들이 응용프로그램을 조정할 수 있다는 것이었습니다. 많은 사용자들은 다수의 응용프로그램에서 관련된 복잡한 작업을 수행하는 것을 한번에 묶어서 처리할 수 있도록 해주는 이 기능을 필요 불가결하다고 여기고 있습니다. AppleScript의 기능은 Mac OS X에서 더 진척되었습니다. AppleScript Studio는 복잡한 유저 인터페이스를 다루기 위해 AppleScript 스크립트를 사용하는 Cocoa 응용프로그램을 만들기 위한 개발 기술입니다.

AppleScript Studio는 AppleScript, Xcode, Interface Builder, Cocoa의 기술을 연동하여 AppleScript 솔루션을 만들어내기 위한 정교한 환경을 제공합니다. 이것을 사용하여 응용프로그램이 다음과 같은 것들을 할 수 있게 됩니다.

  • AppleScript 스크립트를 실행합니다.
  • 응용프로그램의 유저 인터페이스를 조정합니다.
  • 스크립팅 가능한 응용프로그램이나 시스템의 스크립팅 가능한 부분을 조정합니다.


AppleScript Studio가 AppleScript를 Xcode, Interface Builder, Cocoa와 통합시키기 때문에 스크립터들은 이들의 강점과 기능으로부터 이득을 얻을 수 있습니다. Interface Builder palette로부터 풍부한 유저인터페이스 셋을 드래그하고 그들이 원하는 대로 수정하여 사용할 수 있습니다. Aqua human interface guidelines을 따르기 위해 이미 내장된 지원을 얻을 수 있습니다. 또한, 복수의 타겟과 빌드 스텝으로 복잡한 프로젝트를 빌드하고 관리할 수 있습니다.

이 개발환경을 통해 전통적으로 AppleScript 스크립트를 만드는데 사용되었던 Script Editor 프로그램에서 가능했던 것보다 훨씬 더 많은 것들이 가능하게 됩니다. 다음과 같은 것들이 포함됩니다.

  • 원하는대로 큰 스크립트를 작성 가능합니다.
  • 스크립트 안에서 검색 및 대치가 가능합니다.
  • 다양한 명령 수행시에도 한번에 한명령씩 스크립트 디버깅이 가능합니다.
  • 스크립트의 핸들러와 프로퍼티에 쉽게 접근할 수 있습니다.
  • 응용프로그램 스크립팅 용어를 가지고 작업해야할 경우 융통성있는 딕셔너리 뷰어를 사용할 수 있습니다.


더 읽을거리: 더 많은 정보는 AppleScript Studio Programming Guide에서 접할 수 있습니다.


[편집] 다른 개발 툴

Xcode와 Interface Builder가 Cocoa 프로그램을 개발하기 위한 주요 툴이지만, 다른 십수개의 툴들도 제공됩니다. 이 이차적인 프로그램들과 커맨드라인 툴들이 프로그램 개발의 몇몇 단계에서 도움이 될 것입니다.

이 섹션은 이차적인 개발 프로그램들을 살펴보고, 몇몇 커맨드라인 툴들을 짧게 알아볼 것입니다. 그러나, 커맨드라인 툴은 매우 많고 약간의 압축된 정보도 이 문서의 범위를 벗어납니다. 가장 좋은 방법은 매뉴얼 페이지(man pages)를 통해 /usr/bin나 /usr/sbin에 위치한 툴들에 대해 알아보는 것 입니다. 이렇게 하기 위해서는 터미널 쉘에서 man 뒤에 툴의 이름을 입력하면 됩니다. /Developer/Tools에 애플이 개발한 커맨드라인 툴도 있습니다.

[편집] Performance Tools

다음 프로그램들은 응용프로그램의 성능을 측정하고 분석하기위해 사용됩니다. /Developer/Applications 에서 찾아볼 수 있습니다.

  • Sampler 는 프로그램의 작동 행태와 메모리 할당을 분석합니다. 이름이 예시하듯, Sampler는 정기적으로 프로그램의 펑션 콜 스택을 샘플링합니다. 샘플링 세션이 끝나면, 가장 많이 접한 함수나 메소드를 보여줍니다. 이 정보를 통해 CPU 타임을 많이 차지하는 함수나 메소드가 무엇인지 알게 해주며 메모리가 지나치게 할당되어지는 함수나 메소드에 대해서 알 수 있습니다.
  • ObjectAlloc는 어느 프로그램의 메모리 할당과 해제를 추적합니다. 이 데이터는 반복적인 할당과 전반적인 할당 추세를 보여줍니다. Objective-C 코드에서는 ObjectAlloc가 alloc 메소드 호출 뿐 아니라 copy, retain, release, autorelease 메소드의 호출도 기록합니다. 또한 이들 메소드에 대응하는 Core Foundation 함수들도 malloc 및 관련 함수들에 의해 할당된 메모리와 함께 기록합니다.
  • MallocDebug는 현재 프로그램에서 할당된 모든 메모리 블럭을 할당 시의 콜 스택에 따라 정리하여 보여줍니다. 한눈에 프로그램이 얼마나 많은 메모리를 할당하고 있는지 알 수 있으며, 메모리가 어디서 할당되었는지, 그리고 어느 함수가 많은 메모리를 할당받았는지를 알 수 있습니다. MallocDebug는 또한 할당된 메모리중 프로그램의 어디에서도 레퍼런스되지 않은 부분을 찾게 해주어 메모리 누수가 있는 부분을 찾아 정확해 어디서 메모리가 할당되었는지 추적할 수 있게 합니다.
  • QuartzDebug는 응용프로그램 자신을 표시하는 방법을 디버그 하도록 도와주는 툴입니다. 드로잉과 이미징 작업을 많이하는 프로그램의 경우에 특히 유용합니다. QuartzDebug에는 다음과 같은 몇가지 디버깅 옵션이 있습니다.
    • 각 드로잉 수행 후 그래픽 컨텍스트의 컨텐츠를 플러쉬해주는 오토-플러쉬 드로잉
    • 업데이트 되기전 스크린의 일부 지역을 노란색으로 칠해주는 모드
    • 시스템 전역의 창 목록의 스태틱 스냅샷을 찍어주는 옵션. 각 창의 소유자가 누군지 알게하며 메모리를 얼마씩 차지하고 있는지 알 수 있습니다.
  • Thread Viewer는 각 프로세스의 쓰레드의 활동을 표시합니다. 각 쓰레드의 활동의 타임라인을 액션에 따라 다른 색으로 보여줍니다. 타임라인을 클릭하여 그 지점의 샘플 백트레이스 활동을 얻을 수 있습니다.


성능 측정을 위해, 다음과 같은 커맨드라인 툴들을 이용할 수도 있습니다.

  • top, 현재 동작하고 있는 프로세스에 대한 샘플 통계수치를 정기적으로 보여줍니다.
  • gprof, 프로그램의 실행 프로파일을 생성합니다.
  • fs_usage, 파일-시스템 접근 통계를 표시합니다.

성능 측정을 위한 다른 많은 커맨드라인 툴도 사용가능합니다. Cocoa 응용프로그램 개발시에 사용할 수 있는 성능 측정 툴과 프로그램, 개념, 기술, 성능에 관련된 전략등에 대해 더 많이 알고 싶다면, Performance Programming Topics를 보십시오.


노트:Introduction to Performance Overview에서 Mac OS X의 퍼포먼스 툴을 다루고 있습니다.


[편집] Other Tools

다음 툴들도 Cocoa 프로그램 개발시에 유용할 수 있습니다. (/Developer/Applications 에서 찾을 수 있습니다.)

  • Icon Composer와 icns Browser. 응용프로그램과 문서 아이콘을 Icon Composer를 이용해 다양한 포맷의 이미지를 icns 파일로 만들 수 있습니다. icns Browser 프로그램을 이용해 아이콘을 다양한 크기와 bit depth, bit mask로 만들 수 있습니다.
  • FileMerge는 (소스 파일, 헤더 파일, 프로퍼티 리스트 같은) 텍스트파일을 시각적으로 "diffs" 해주며, 선택적인 통합 기능을 갖추고 있습니다.
  • Package Maker는 응용프로그램(그리고 다른 종류의 소프트웨어)를 Installer 프로그램으로 설치할 수 있도록 패키징 해줍니다.
  • Property List Editor 는 XML 혹은 예전 스타일의 property list를 만들고 수정할 수 있는 편집기 입니다.


[편집] The Cocoa Frameworks

무엇이 프로그램을 Cocoa 프로그램으로 만들까요? Cocoa 개발을 다양한 언어로 할 수 있으므로 언어가 결정하는 것이 아닙니다. (복잡하고 시간이 오래 걸리겠지만) 커맨드라인 툴을 이용해 Cocoa 응용프로그램을 만들 수 있으므로 개발 툴이 결정하지도 않습니다 모든 Cocoa 프로그램에 공통적으로 존재하고 다른 것들과 구분지어 주는 것은 루트 클래스인 NSObject로부터 궁극적으로 상속받고, Objective-C 런타임에 궁극적으로 기반하고 있는 객체들로 이루어져 있다는 것입니다.

note:위의 문장도 약간 검증이 필요합니다. 먼저, Cocoa는 다른 루트 클래스인 NSProxy도 제공합니다. 하지만 NSProxy는 Cocoa 프로그래밍에서 거의 사용되지 않습니다. 둘째로, 여러분만의 루트 클래스를 만들 수 있지만, (Objective-C 런타임과 상호작용 하도록 코드를 작성하는 것을 수반하여)많은 작업이 필요하며, 시간을 들일만한 가치가 없을 것입니다.


Mac OS X은 몇몇 Cocoa 프레임웍을 포함하고 있으며, 애플과 써드파티 업체들은 항상 더 많은 프레임웍을 발표하고 있습니다. 풍부한 Cocoa 프레임웍 가운데 다른 것들보다 더 돋보이는 두개의 프레임웍이 있습니다. Foundation과 Application Kit은 Cocoa프레임웍의 핵심입니다. 그리고, Foundation 프레임웍의 클래스를 사용하고 연결하지 않고 Cocoa 프로그램을 개발할 수 없습니다. (Cocoa 통합 프레임웍에 연결할때 자동적으로 이들 프레임웍에 연결됩니다.) Foundation과 Application Kit 프레임웍은 Cocoa 개발에 필수적이며 모든 다른 프레임웍은 이차적이며 필요에 따라 선택 가능합니다.

다음 섹션에서는 두개의 핵심 Cocoa 프레임웍을 살펴보고 그외 이차적인 프레임웍을 간단히 살펴봅니다. 이 거대한 프레임웍에 좀 더 잘 접근하기 위해 Foundation과 Application 프레임웍의 소개는 작은 십수개의 클래스를 기능에 따라 그룹지어 계층구조로 이루어져있습니다. 이 그룹 분류가 논리적으로 잘 되어 있지만, 다른 방법으로도 분류할 수 있습니다.

[편집] Foundation

Foundation 프레임웍은 어느 Cocoa 프로그램의 형태에서든 이용할 수 있는 기본 클래스 레이어를 정의하고 있습니다. Foundation과 Application Kit의 클래스들을 구분짓는 것은 유저 인터페이스입니다. 객체가 유저 인터페이스에 나타나지 않거나, 유저 인터페이스만을 지원하는데 사용되는 것이 아니라면, Foundation에 속하는 클래스입니다. 커맨드 라인 툴이나 인터넷 서버와 같은 경우라면, 다른 프로그램은 사용하지 않고 Foundation 프레임웍만을 사용하여 Cocoa 프로그램을 만들 수 있습니다.

Foundation 프레임웍은 다음 목적을 달성하고자 디자인 되어졌습니다.

  • 객체의 기본 행동을 정의하며 메모리 관리, 객체 변화 가능성, 알림과 같은 것들을 위한 통일된 방식을 소개합니다.
  • 국제화와 지역화를 번들 기술과 유니코드 스트링으로 지원합니다.
  • 객체 보존을 지원합니다.
  • 객체 분산을 지원합니다.
  • 포팅 가능성을 지원하기 위해 운영체제 독립성의 몇몇 측면을 제공합니다
  • 숫자값, 문자열, 컬렉션과 같은 프로그래밍 원시값을 위한 객체 랩퍼나 equivalent를 제공합니다. 또한, 하부의 시스템 개체, 포트, 쓰레드, 파일시스템과 같은 서비스에 접근하기 위한 유틸리티 클래스도 포함하고 있습니다.

Cocoa 응용프로그램은 자체가 항상 Foundation 프레임웍에 연걸되어야 하는 것과 마찬가지로 Application Kit에 연결되어집니다. 클래스 계층은 NSObject라는 동일한 루트 클래스를 가지며, 많은 수의 Application Kit의 메소드와 함수는 Foundation 객체를 파라미터나 리턴 값으로 가집니다. 몇몇 Foundation 클래스는 애플리케이션을 위해 디자인 된 것처럼 보이지만-두개를 예로 들자면, NSUndoManager와 NSUserDefaults–, 유저 인터페이스와 관여하지 않고 사용 될 수 있기에 Foundation 프레임웍에 포함되었습니다.


[편집] Foundation Paradigms and Policies

Foundation은 Cocoa 프로그램에 몇몇 패러다임과 정책을 소개하여 특정한 상황에 프로그램의 객체들이 일관성있는 행동과 기대가 가능하도록 합니다. 다음과 같은 것들을 포함합니다.

  • 객체 소유권과 객체 폐기. 자동 가비지-컬렉션 기술 대신, Foundation은 객체가 그들이 만들고, 복사하고, 명시적으로 retain한 다른 객체를 릴리징 하는 것에 대한 책임을 지는 방식을 채택하였습니다. NSObject(클래스와 프로토콜)은 객체의 retain과 release 메소드를 정의하고 있습니다. (NSAutoreleasePool 클래스에 정의된) Autorelease pools은 지연된 릴리즈 기술을 구현하여 Cocoa 프로그램들이 호출자가 객체에 대한 책임이 없는 경우의 반환에 일관적인 컨벤션을 가질 수 있도록 합니다. 객체 소유권, 폐기에 대한 더 많은 사항은 Memory Management Programming Guide for Cocoa 에서 찾을 수 있습니다.
  • Mutable 클래스 변형. Foundation의 많은 밸류 클래스, 컨테이너 클래스는 immutable 클래스의 하위에 mutable 변형을 가지고 있습니다. 캡슐화된 값이나 그런 객체의 멤버쉽의 동적인 변화가 필요하다면, mutable 클래스의 인스턴스를 만들 수 있습니다. immutable 클래스를 상속받기 때문에, mutable 인스턴스를 immutable 타입을 받는 메소드에 보낼 수도 있습니다. 객체 변형을 더 알고싶으시다면 "Object Mutability"를 보십시오.
  • Class clusters. 클래스 클러스터는 추상 클래스이며, 추상 클래스가 통합 인터페이스 역할을 하는 private 구상 서브클래스들의 모음 입니다. 상황에 따라(특히 객체를 만드는 메소드에 따라) 적합한 최적화된 클래스의 인스턴스가 반환됩니다. 예를 들어, NSString과 NSMutableString은 다양한 종류의 스토리지 필요에 따른 다양한 private 서브클래스 인스턴스의 중개자 역할을 합니다. 수년간 구상 클래스들의 모음은 응용프로그램에 오류를 내지않고 변화해 왔습니다. 클래스 클러스터에 대해 더 알고싶으시면, “Class Clusters”를 보십시오.
  • Notifications. Notification은 Cocoa의 주요 디자인 패턴 중의 하나입니다. (observer로 불리는)객체가 다른 객체가 무엇을 하고 있는지, 혹은 사용자나 시스템 이벤트로부터 어떤 것을 받고 있는지에 대해 지속적으로 정보를 얻을 수 있게 합니다. notification을 발생시키는 객체는 notification의 observer의 존재여부나 정체를 모르고 있을 수 있습니다. notification에는 동조, 비동조, 분산 notification 과 같은 종류가 있습니다. Foundation notification 메카니즘은 NSNotification, NSNotificationCenter, NSNotificationQueue, NSDistributedNotificationCenter 클래스에 의해 구현되어 있습니다. 더 많은 정보는 “Notifications”를 참고하십시오.


[편집] Foundation Classes

Foundation 클래스 계층은 NSObject 클래스에 기반하고 있습니다. NSObject 클래스는 NSObject, NSCopying 프로토콜과 함께 기본적인 객체 속성과 행동에 대해 정의합니다. NSObject와 기본적인 객체 행동에 대해 더 알고싶다면, “The Root Class”를 보십시오.

Foundation 프레임웍의 나머지 부분은 몇몇 독립 클래스와 관련있는 클래스들의 그룹으로 구성되어 있습니다. 문자열, 바이트 배열과 같은 기초 데이터 타입을 대표하는 클래스, 다른 객체를 저장하는 콜렉션 클래스, 날짜와 같은 시스템 정보를 대표하는 클래스, 포트, 쓰레드, 프로세스와 같은 시스템 개체를 대표하는 클래스들이 있습니다. Figure 1-6, 1-7, 1-8 클래스 계층 도표는 이들 클래스를 상속관계 뿐만 아니라 논리적인 그룹으로 분류해 놓았습니다.

Figure 1-6 The Foundation class hierarchy—Objective-C (part one)
그림:A cc cfg objc foundation.gif

Figure 1-7 Foundation class hierarchy—Objective-C (part two)
그림:A cc cfg objc foundation2.gif

Figure 1-8 Foundation class hierarchy—Objective-C (part three)
그림:A cc cfg objc foundation3.gif

이들 도표는 Foundation 프레임웍의 클래스들을 다음 카테고리에 (특별히 언급한 다른 관계들과 함께) 논리적으로 그룹지어 놓았습니다:

  • Value 객체. Value 객체들은 다양한 타입의 데이터를 데이터에 접근을 가능하게 하면서 다양한 수정을 제공하면서 캡슐화합니다. 객체이기 때문에 포함된 값들과 그 객체는 아카이브될 수 있으며 분산되어질 수 있습니다. NSData는 바이트 스트림을 위한 객체지향 스토리지를 제공합니다. 반면, NSValue와 NSNumber는 단순 스칼라 값의 배열을 위한 객체지향 스토리지를 제공합니다. NSDate, NSCalendarDate, NSTimeZone, NSCalendar, NSDateComponents, NSLocale 클래스는 시간, 날짜, 달력, 그리고 장소를 대표하는 객체들을 제공합니다. 날짜와 시간 차이를 계산하는 메소드, 날짜와 시간을 다양한 포맷으로 표시하는 메소드, 그리고 지역에 기반해서 시간과 날짜를 조절하는데 사용되는 메소드들을 제공합니다.
  • Strings. NSString은 널문자로 끝나는 특정 인코딩 바이트 배열을 위한 객체지향 스토리지를 제공하는 밸류 객체의 또 다른 타입입니다. NSString은 문자열 인코딩을 UTF-16, UTF-8, MacRoman, 그리고 다른 많은 인코딩으로 변환하기위한 지원을 포함하고 있습니다. NSString은 또한 문자열을 검색하고, 조합하고, 비교하는 메소드와 파일-시스템 경로를 다루기 위한 메소드를 제공합니다. NSScaner 객체를 이용해 NSString 객체의 단어와 숫자를 파싱할 수 있습니다. (도표에 콜렉션 클래스에 나타나있는) NSCharacterSet는 NSString과 NSScanner의 다양한 메소드에서 사용되어지는 문자 셋들을 대표합니다.
  • Collections. Collections는 특정 정렬 방식으로 (주로 밸류)객체를 저장하거나 꺼내는 객체입니다. NSArray는 0으로 시작하는 인덱싱을 하며 NSDictionary는 key-value pair를 이용하며, NSSet은 비정렬된 객체 스토리지를 제공합니다. (NSCounterSet은 collection을 유일하게 만들어줍니다) NSEnumerator 객체로 collection의 요소들을 순서대로 접근할 수 있습니다. Collection 객체는 프로퍼티 리스트의 핵심요소이며, 다른 객체들과 마찬가지로 아카이브하고 분산시킬 수 있습니다.
  • Operating-system services. 많은 Foundation 클래스는 운영체제의 다양한 저수준 서비스들에 접근을 쉽게 하면서 운영체제의 특징으로부터 분리시킵니다. 예를 들어, NSProcessInfo는 응용프로그램이 실행되는 환경에 대한 쿼리를 가능하게 하며, NSHost는 네트웍에서 호스트 시스템의 이름과 주소를 제공합니다. NSTimer 객체를 이용하여 특정 시간 간격으로 다른 객체에 메시지를 보낼 수 있으며, NSRunLoop으로 응요프로그램이나 다른 종류의 프로그램의 입력 소스를 다룰 수 있습니다. NSUserDefaults는 (호스트당 하나의) 글로벌 프리퍼런스와 유저 마다의 기본 값(프리퍼런스)의 시스템 데이터베이스에 대한 프로그래밍 인터페이스를 제공합니다.
    • File system and URL. NSFileManager는 파일의 생성, 이름 변환, 삭제, 이동과 같은 파일 오퍼레이션을 위한 일관성있는 인터페이스를 제공합니다. NSFileHandle은 (파일 내부 탐색과 같은)저수준 파일 오퍼레이션을 허용합니다. NSBundle은 번들에 저장된 리소스를 찾아 그들 중 일부를 동적으로 로드할 수 있습니다(예로 nib 파일과 코드). NSURL과 NSURLHandle을 이용해 데이터의 URL 소스를 대표하고, 접근하고, 다룰 수 있습니다.
    • Interprocess communication. 이 카테고리의 대부분의 클래스는 다양한 종류의 시스템 포트, 소켓, 네임서버를 대표하며 저수준 IPC를 구현하는데 유용합니다. NSPipe는 프로세스간 단방향 커뮤니케이션 채널인 BSD pipe를 표현합니다.
    • Threading and subtask. 다양한 lock 클래스들이 경쟁하는 쓰레드에 의한 자원 처리를 위한 접근을 조절하는 메카니즘을 제공함과 동시에 NSThread를 이용해 멀티쓰레드 프로그램을 만들 수 있습니다. NSTask로 응용프로그램이 child 프로세스를 떼어내 작업을 수행하게 하며 진척 상황을 모니터하게 할 수 있습니다.
  • Notifications. “Foundation Paradigms and Policies”에서 notification 클래스의 요약을 보십시오.
  • Archiving and serialization. 이 카테고리의 클래스들은 객체 분산과 존속을 가능하게 합니다. NSCoder와 서브 클래스들은 NSCoding 프로토콜과 함께 객체가 포함하는 데이터를 클래스 정보를 데이터와 함께 저장하는 방법으로 아키텍쳐에 독립적으로 표현합니다.
  • Expressions and predicates. NSPredicate, NSCompoundPredicate, NSComparisonPredicate 과 같은 predicate 클래스는 논리 조건을 캡슐화하여 fetch나 필터 객체를 제한합니다. NSExpression 객체는 predicate 으로 expression을 표시합니다.
  • Spotlight queries. NSMetadataItem, NSMetadataQuery, 관련된 쿼리 클래스들은 파일 시스템 메타데이터를 캡슐화하고 메타데이터를 쿼리할 수 있도록 합니다.
  • Objective-C language services. NSException 과 NSAssertionHandler는 assertion을 만들고 코드에 예외[exception]를 처리할 수 있는 객체지향적인 방식을 제공합니다. NSInvocation 객체는 프로그램이 저장하고 이후에 다른 객체에서 메시지를 호출하는데 사용할 수 있는 Objective-C 메시지의 스태틱 표현입니다. NSUndoManager와 Distributed Objects 시스템에서 사용되어집니다. NSMethodSignature 객체는 메소드의 타입 정보를 기록하고 메시지 포워딩에 사용됩니다. NSClassDescription은 클래스의 관계와 속성의 정의와 쿼리를 위한 추상클래스 입니다.
  • Scripting. 이 카테고리의 클래스는 프로그램이 AppleScript 스크립트와 Apple 이벤트 커맨드에 응답할 수 있도록 합니다.
  • Distributed objects. 분산 객체 클래스를 이용해 한 컴퓨터나 네트웍의 다른 컴퓨터간의 프로세스들 끼리의 커뮤니케이션을 할 수 있습니다. 이들 클래스 중 두가지, NSDistantObject 와 NSProtocolChecker는 나머지 Cocoa 클래스들과 달리 NSProxy를 루트클래스로 갖습니다.
  • Networking. NSNetService 와 NSNetServiceBrowser 클래스는 무설정 네트웍 아키텍쳐인 Bonjour를 지원합니다. Bonjour는 IP 네트웍의 서비스에 등록하거나 검색하기 위한 강력한 시스템입니다.


[편집] Application Kit

Application Kit 은 이벤트 중심의 그래픽 유저 인터페이스를 구현하기 위해 필요한 모든 객체를 포함하고 있는 프레임웍입니다. 창, 다이얼로그, 버튼, 메뉴, 스크롤러, 텍스트 필드등 많은 목록을 포함하고 있습니다. Application Kit 은 스크린에 효율적으로 그리고, 하드웨어 장비와 스크린 버퍼와 의사소통하며, 그리기 전에 스크린영역을 클리어하며, 뷰를 클립하는 등의 모든 상세작업을 다룹니다. Application Kit 의 클래스들의 수가 처음엔 매우 많아 보일 수 있지만, 대부분의 Application Kit 클래스들은 간접적으로 사용하게 됩니다. 도한 Application Kit을 어느 정도의 수준에서 사용할지를 선택할 수 있습니다.

  • Interface Builder를 사용하여 유저 인터페이스 객체로부터 응용프로그램의 컨트롤 객체로의 연결을 생성합니다. 이 연결은 유저 인터페이스를 다루며 유저 인터페이스와 내부 데이터 구조간에 데이터의 흐름을 조절합니다. 이를 위해 (Cocoa 바인딩을 위해)이미 존재하는 컨트롤러 객체를 사용하거나 하나 혹은 그 이상의 커스텀 컨트롤러 클래스를 구현해야할 필요가 있을 수도 있습니다. 특히 이들 클래스의 액션과 delegate 메소드들이 그렇습니다. 예를 들어, (기본 구현이 적합한 경우가 아니라면)사용자가 메뉴 아이템을 선택했을때 불려질 메소드를 구현해야할 필요가 있습니다.
  • 유저 인터페이스를 프로그래밍을 통해 조절하려면 Application Kit 클래스들과 프로토콜에 더 친숙해져야 합니다. 예를 들어, 사용자가 아이콘을 한 창에서 드래그하여 다른 창으로 이동하려면 약간의 프로그래밍과 NSDragging... 프로토콜에 대한 지식이 필요합니다.
  • NSView나 다른 클래스를 서브클래싱하여 자신만의 객체를 구현하십시오. NSView를 서브클래싱 할때는, 그래픽 함수들을 사용하여 자신만의 드로잉 메소드를 작성합니다. 서브클래싱은 Application Kit이 어떻게 작동하는지에 대한 더 깊은 수준의 이해를 필요로 합니다.


[편집] Application Kit 개요

Application Kit읜 125개의 클래스와 프로토콜로 구성되어 있습니다. 모든 클래스는 궁극적으로 Foundation 프레임웍의 NSObject 클래스를 상속받습니다. Figure 1-9와 1-10의 도표는 Application Kit 클래스의 상속관계를 보여줍니다.

Figure 1-9 Application Kit class hierarchy—Objective-C (part one)
그림:A cc cfg objc appkit.gif

Figure 1-10 Application Kit class hierarchy—Objective-C (part two)
그림:A cc cfg objc appkit2.gif

도표를 통해 볼 수 있듯이, Application Kit의 계층구조는 넓지만 깊이는 얕습니다. 계층구조에서 가장 깊이 있는 클래스들은 루트클래스로부터 고작 5개정도의 슈퍼클래스를 가지고 있으며, 대부분의 클래스들은 그보다 더 적은 슈퍼클래스를 갖습니다. 이 계층구조의 주요 가지들중 일부가 특히 더 흥미롭습니다.

Application Kit의 가장 큰 가지의 핵심운 NSResponder Class 입니다. 이 클래스는 responder chain을 정의합니다. responder chain은 유저 이벤트에 반응하는 객체의 순차적인 목록입니다. 사용자가 마우스 버튼을 클릭하거나 키를 누르면, 이벤트가 생성되어 responder chain으로 전달되어 응답할 수 있는 객체를 찾습니다. 이벤트를 처리하는 모든 객체는 NSResponder 클래스를 상속받아야만 합니다. Application Kit의 핵심클래스인 NSApplication, NSWindow, NSView는 NSResponder 클래스를 상속받습니다. 이들 responder 클래스에 대해 더 알고싶으시다면 "The Core Application Architecture”를 읽으십시오.

Application Kit에서 두번째로 큰 클래스가지는 NSCell로부터 나옵니다. 이들 클래스 그룹에서 기억해 둘만한 것은 이 클래스들이 NSView를 상속받는 NSControl을 상속받는 클래스들을 대략 반영하고 있는 것입니다. 유저 액션에 반응하는 객체들의 유저 인터페이스로 Application Kit은 컨트롤 객체와 셀 객체를 분리하는 구조를 사용하고 있습니다. NSControl과 NSCell, 이들의 하위클래스들은 사용자가 응용프로그램의 일정 측면을 조절하기 위해 그래픽적으로 다룰 수 있는 버튼, 슬라이더, 브라우저와 같은 일반적은 유저 인터페이스 객체 셋을 정의합니다. 대부분의 컨트롤 객체는 하나 혹은 그 이상의 셀 객체와 연관되어 있으며 셀 객체는 드로잉과 이벤트 핸들링의 세부 내용을 구현합니다. 예를 들어 버튼은 NSButton 객체와 NSButtonCell 객체로 이루어져 있습니다. 더 많은 정보는 “Control and Cell Architecture”에서 얻을 수 있습니다.

컨트롤과 셀은 Application Kit의 중요한 디자인 패턴에 기반한 메카니즘을 구현합니다. 그것은 바로 타겟-액션 메카니즘입니다. 셀은 사용자가 셀을 클릭하거나 다른 액션을 취할 때 특정한 객체에 보내져야하는 메시지를 구별하는 정보를 담고 있습니다. 사용자가 컨트롤에 조작을 가할때(예를 들어 마우스 포인터로 클릭하는 것등으로)컨트로은 필요한 정보를 셀로부터 가져와서 타겟 객체에 액션 메시지를 보냅니다. 타겟-액션은 타겟 객체가 무엇이고 불러진 메소드가 무엇이 되어야 하는지에 대해 지정하는 것으로 사용자 액션에 의미를 부여하도록 합니다. 일반적으로 Interface Builder에서 컨트롤 객체로부터 응용프로그램이나 다른 객체로 컨트롤-드래깅하여 타겟과 액션을 지정합니다. 프로그래밍을 통해서도 타겟과 액션을 지정할 수 있습니다.

Application Kit의 다른 중요한 디자인 패턴은 delegation입니다. 텍스트필드나 텍스트뷰와 같은 유저 인터페이스의 많은 객체는 delegate를 정의합니다. delegate는 대리를 시키는 객체를 대신하거나 협력하여 동작하는 객체입니다. 유저 인터페이스의 작동에 응용프로그램의 특정 로직을 알게할 수 있습니다. Application Kit의 delegation, 타겟-액션, 다른 패러다임과 메카니즘은 “Communicating With Objects”에서 더 많은 정보를 접할 수 있습니다. 이들 패러다임과 메커니즘이 기반하고 있는 디자인 패턴에 대한 논의는 “Cocoa Design Patterns”에서 찾을 수 있습니다.

다음 섹션은 Application Kit과 그 클래스들, 프로토콜의 구조적인 측면과 기능 들에 대해 간단히 설명하고 있습니다. Figure-9, Figure-10에 보여진 클래스 계층도에 따라 그룹 지어져 있습니다.

[편집] General User-Interface Classes

사용자 인터페이스의 전반적인 작동을 위해 Application Kit은 다음 클래스들을 제공합니다.

  • 글로벌 응용프로그램 객체. 모든 응요프로그램은 NSApplication의 singleton 인스턴스를 이용해 메인 이벤트 루프를 조정하며, 응용프로그램의 창과 메뉴를 관리하고, 적합한 객체에 이벤트를 보내며, 최고 수준의 autorelease 풀을 설정하며, 응용프로그램 수준의 이벤트의 notification을 받습니다. NSApplication 객체는 delegate를 가지며, 응용프로그램이 시작하거나 종료되거나, 숨겨지거나 활성화되거나, 사용자에 의해 선택된 파일을 열어야하거나 하는 등의 일의 알림을 받게됩니다. NSApplication 객체의 delegate와 delegate 메소드의 구현을 설정하는 것으로 NSApplication을 서브클래싱 하지 않고 응용프로그램의 행동을 사용자화 할 수 있습니다. “The Core Application Architecture”에서 singleton 응용프로그램 객체에 대해 상세히 다루고 있습니다.
  • Windows and views. 윈도우와 뷰 클래스인 NSWindow와 NSView 역시 NSResponder를 상속받기에 사용자 액션에 응답하도록 디자인 되어졌습니다. NSApplication 객체는 NSWindow 객체의 목록을 가지고 있습니다. 그중의 하나는 응용프로그램에 속하는 각 윈도우이며 각각의 NSWindow 객체는 NSView 객체의 계층도를 가지고 있습니다. 뷰 계층은 윈도우 내의 이벤트를 다루는 것과 드로잉에 사용되어집니다. NSWindow 객체는 윈도우-수준의 이벤트를 처리하며, 다른 이벤트를 뷰에 뿌려주며, 뷰가 그려질 공간을 제공합니다. NSWindow 객체 또한 행동을 커스터마이즈 할 수 있도록 delegate를 갖습니다.


NSView는 윈도우안에 표시되는 모든 객체의 슈퍼클래스입니다. 모든 하위클래스는 그래픽 함수를 이용하여 드로잉 메소드를 구현합니다. 새로운 NSView를 만들때 drawRect:가 오버라이드하는 첫번째 메소드입니다.

“The Core Application Architecture”에서 NSView와 NSWindows 객체에 대한 설명을 찾으실 수 있습니다.

  • Controller classes for Cocoa bindings. 추상 NSController 클래스와 해당 구상 하위클래스인 NSObjectController, NSArrayController, NSTreeController는 Cocoa 바인딩의 구현을 위한 부분입니다. 이 기술은 객체에 저장된 응용프로그램 데이터와 유저 인터페이스의 데이터 표시를 자동적으로 일치시켜줍니다. “The Model-View-Controller Design Pattern”에서 이들 컨트롤러 객체들에 대한 설명을 찾을 수 있습니다.
  • Panels (dialogs). NSPanel 클래스는 NSWindow의 서브클래스이며, 이를 이용해 임시정보, 글로벌 정보, 혹은 긴급 정보를 표시합니다. 예를 들어, 에러 메시지나 특수한 상황에 대한 사용자 응답을 물을 경우 NSWindow의 인스턴스 대신 NSPanel의 인스턴스를 사용합니다. Application Kit은 저장, 열기, 문서 인쇄에 사용되는 Save, Open, Print 다이얼로그 같은 몇몇 공통 다이얼로그를 구현하고 있습니다. 이들 다이얼로그를 사용하여 공통적인 작업에 사용자에게 일관성있는 룩앤필을 제공할 수 있습니다.
  • Menus and cursors. NSMenu, NSMenuItem, NSCursor 클래스는 응용프로그램이 사용자에게 디스플레이하는 메뉴와 커서의 모양새와 행동을 정의합니다.
  • Grouping and scrolling views. NSBox, NSScrollView, NSSplitView 클래스는 윈도우 안의 다른 뷰 객체나 뷰의 컬렉션에 그래픽 악세서리를 제공합니다. NSBox 클래스로 윈도우 안의 요소들을 그룹짓고 그룹 전체에 틀을 그릴 수 있습니다. NSSplitView 클래스로 각각의 뷰는 공통 공간의 일정 부분을 차지하며 수평 혹은 수직으로 뷰를 덧붙일 수 있습니다. 슬라이딩 컨트롤 바를 이용해 사용자가 뷰 사이의 공간을 재할당 할수 있습니다. NSScrollView 클래스와 그 헬퍼 클래스인 NSClipView는 사용자가 스크롤을 컨트롤 할 수 있는 그래픽 객체 뿐만 아니라 스크롤 메카니즘을 제공합니다. NSRulerView 클래스로 자와 마커를 스크롤 뷰에 더 할수 있습니다.
  • Table views and outline views. NSTableView 클래스는 행과 열로 데이터를 표시합니다. NSTableView는 행이 각 레코드에 대응하며 행에 레코드의 속성을 포함하는 데이터베이스 레코드를 표시하는데 적합하지만 그 경우에만 제한된 것은 아닙니다. 사용자는 각 셀을 수정할 수 있으며 행을 재배치 할 수 있습니다. NSTableView 객체의 행동과 컨텐트를 delegate와 data source 객체를 세팅하는 것으로 조절합니다. (NSOutlineView의 인스턴스이며, NSTableView의 서브클래스인) Outline 뷰는 테이블 형식의 데이터를 표시하는 다른 방법을 제공합니다. NSBrowser 클래스와 함께 계층 데이터를 표시하고 찾아다닐 수 있는 객체를 만들 수 있습니다.



[편집] Text and Fonts

NSTextField 클래스는 수정 가능한 단순 텍스트-입력 필드를 구현하고, NSTextView 클래스는 더 큰 텍스트를 위한 폭넓은 편집 기능을 제공합니다.

추상 클래스인 NSText 클래스의 하위클래스인 NSTextView는 확장된 텍스트 시스템에 대한 인터페이스를 정의합니다. NSTextView는 rich text, (그래픽, 파일 등) 첨부, 입력 관리, 키 바인딩, marked 텍스트 속성 등을 지원합니다. NSTextView는 Fonts 윈도우와 Font 메뉴 자와 패러그래프 스타일, 서비스기능, pasteboard(Clipboard)와 함께 작동합니다. NSTextView는 또한 delegation과 notification을 통해 개인화를 할 수 있으며, 따라서 NSTextView를 서브클래싱 할 일은 거의 없습니다. NSTextView 객체를 이미 포함하고 있는 NSTextField, NSForm, NSScrollView와 같은 객체들이 Interface Builder의 팔레트에 위치하므로 프로그래밍으로 NSTextView의 인스턴스를 만드는 경우 역시 거의 없습니다.

NSTextStorage, NSLayoutManager, NSTextContainer 그리고 관련된 클래스들을 이용하여 원 안에 텍스트를 표시하는 것과 같이 더 강력하고 창의력있있는 텍스트 처리를 하는것도 가능합니다. Cocoa 텍스트 시스템은 목록, 테이블, 그리고 불연속적 선택 또한 지원합니다.

NSFont 와 NSFontManager 클래스는 폰트패밀리, 크기, 변화를 캡슐화하며 관리합니다. NSFont 클래스는 각각의 폰트에 한개의 객체를 정의합니다. 효율성을 위해 상당히 많은 데이터를 표시하고 있을수 있는 이들 객체는 응용프로그램의 모든 객체에 의해 공유되어집니다. NSFontPanel 클래스는 사용자에게 Fonts 윈도우를 보여줍니다.

[편집] Graphics and Colors

NSImage 와 NSImageRep 클래스는 그래픽 데이터를 캡슐화하며 디스크에 파일로 저장되어 있는 이미지와 스크린에 표시된 이미지를 쉽고 효율적으로 접근할 수 있도록 합니다. NSImageRep 서브클래스들은 각각 특정 종류의 소스 데이터로부터 이미지를 어떻게 그려야 하는지를 알고 있습니다. NSImage 클래스는 같은 이미지의 다양한 표현방법을 제공하며, 캐슁과 같은 기능또한 제공합니다. Cocoa의 이미징과 드로잉 기능은 Core Image 프레임웍과 통합되어 있습니다.

색은 NSColor, NSColorSpace, NSColorPanel, NSColorList, NSColorPicker, NSColorWell 클래스로 지원되고 있습니다. NSColor 와 NSColorSpace 는 커스텀을 포함해 다양한 칼라 포맷과 표시방법을 지원합니다. 다른 클래스들은 거의 인터페이스 클래스입니다. 이들 클래스는 사용자가 색을 선택하고 적용할 수 있도록 하는 패널과 뷰를 정의하고 표시합니다. 예를 들어, Color 윈도우로부터 어느 color well로 색을 끌어다 놓을 수 있습니다. NSColorPicking 프로토콜은 표준 Color 윈도우를 확장하도록 해줍니다.

NSGraphicsContext, NSBezierPath, NSAffineTransform 클래스는 벡터 드로잉을 도와주며, 스케일링, 회전, translation과 같은 그래픽 변환을 지원합니다.

[편집] Printing and Faxing

NSPrinter, NSPrintPanel, NSPageLayout, NSPrintInfo 클래스는 응용프로그램이 윈도우와 뷰에 표시하는 정보를 프린트하고 팩스하는 방법을 제공합니다. NSView의 PDF 버전도 만들 수 있습니다.

[편집] Document and File-System Support

NSFileWrapper 클래스를 디스크의 파일과 디렉토리에 대응하는 객체를 만드는데 사용하십시오. NSFileWrapper는 메모리의 파일 내용을 저장하여 표시하거나 바꾸거나 다른 프로그램으로 전송할 수 있습니다. 파일을 드래깅할때의 아이콘이나 첨부로 표시하는 아이콘또한 제공합니다. 파일과 디렉토리 컨텐츠를 접근하거나 둘러보기 위해서는 Foundation 프레임웍의 NSFileManager 클래스를 사용하십시오. NSOpenPanel, NSSavePanel 클래스는 파일 시스템에 편하고 친숙한 유저 인터페이스를 제공합니다.

NSDocumentController, NSDocument, NSWindowController 클래스는 문서 기반의 응용프로그램을 위한 구조를 정의합니다. (NSWindowController 클래스는 클래스 계층 도표에 유저 인터페이스 그룹에 나타나있습니다). 이런 응용프로그램들은 동일하게 포함되지만 파일로 저장할 수 있는 유일하게 작성된 데이터를 생성할 수 있습니다. 저장, 열기, 되돌리기, 닫기, 문서 관리 등의 기능이 이미 포함되어 있거나, 쉽게 포함시킬 수 있습니다.

[편집] Internationalization and Character Input Support

응용프로그램이 세계의 다른 지역에서도 사용되어진다면, 리소스들이 언어, 국가, 문화 지역에 따라 커스터마이즈드 되거나 지역화되어야 할 필요가 있을 것입니다. 예를 들어, 응용프로그램은 분리된 일어, 영어, 불어, 독일어 버젼의 캐릭터 스트링, 아이콘, nib 파일, 혹은 컨텍스트 도움말을 필요로 할 수 있습니다. 특정 언어에 해당하는 리소스 파일은 그룹지어져 번들 디렉토리의 하부 디렉토리에 저장되어집니다.(.lproj 확장자를 가지고 있는 디렉토리) 주로 로컬리제이션 리소스 파일은 Interface Builder를 이용해 작성합니다. Cocoa 국제화 기능에 대한 더 많은 정보를 “Nib Files and Other Application Resources”에서 보십시오.

NSInputServer, NSInputManager 클래스는 NSTextInput 프로토콜과 함께, 응용프로그램이 텍스트 입력 관리 시스템에 접근할 수 있도록 합니다. 이 시스템은 다양한 국제 키보드로부터 생성된 키 입력을 해석하며 적절한 텍스트 캐릭터 혹은 컨트롤-키 이벤트를 텍스트 뷰 객체에 전달합니다. (주로 텍스트 클래스가 이들 클래스를 처리하며 프로그래머가 직접 다룰 필요는 없습니다.)

[편집] Operating-System Services

다음 Application Kit 클래스는 응용프로그램에 운영체제 지원을 제공합니다.

  • Sharing data with other applications. NSPasteboard 클래스는 응용프로그램으로부터 복사된 데이터의 저장소인 pasteboard를 정의합니다. 이 데이터는 사용하길 원하는 어느 프로그램에서든 사용할 수 있습니다. NSPasteboard 는 친숙한 컷-카피-페이스트 작업을 구현합니다. NSServicesRequest 프로토콜은 등록된 서비스로 응용프로그램간에 데이터를 소통하기 위해 pasteboard를 이용합니다. (pasteboard는 유저 인터페이스에 Clipboard로 구현되어 있습니다.)
  • Dragging. 약간의 프로그래밍으로 커스텀 뷰 객체는 어디서나 드래그되고 드롭될 수 있습니다. 객체는 NSDragging... 프로토콜을 준수함으로 이 드래깅 메카니즘에 포함될 수 있습니다. 드래깅할 수 있는 객체는 NSDraggingSource 프로토콜을 준수하며, 목적 객체(드롭을 받는 객체)는 NSDraggingDestination 프로토콜을 준수합니다. Application Kit은 커서를 따라가는 것과 드래그되는 이미지를 표현하는 모든 세부사항을 숨겨놓았습니다.
  • Spell checking. NSSpellServer 클래스는 철자-검사 서비스를 정의하고 다른 프로그램에 서비스로 제공할 수 있도록 합니다. 응용프로그램을 철자-검사 서비스에 연결하려면, NSSpellChecker 클래스를 이용합니다. NSIgnoreMisspelledWords, NSChangeSpelling 프로토콜은 철자-검사 메카니즘을 지원합니다.



[편집] Interface Builder Support

추상 클래스인 NSNibConnector 와 두 구상 서브클래스 NSNibControlConnector 과 NSNibOutletConnector 는 Interface Builder의 연결(connection)을 대표합니다. NSNibControlConnector 는 Interface Builder에서의 액션 연결을 관리하며 NSNibOutletConnector 는 아웃렛 연결을 관리합니다.

[편집] Other Frameworks With Cocoa API

표준 Mac OS X 설치의 일부분으로, Apple은 (Foundation 과 Application Kit 에 더해) Cocoa 프로그래밍 인터페이스에 몇몇 프레임웍을 제공합니다. (Carbon이나 다른 종류의 프로그래밍 인터페이스를 제공할 수도 있습니다.) 이 부수적인 프레임웍을 이용해 필수적이진 않더라도 바람직한 기능들을 응용프로그램에 더할 수 있습니다. 몇몇 기억해둘만한 이차 프레임웍들은 다음과 같습니다:

  • Core Data—Core Data 프레임웍은 프로그램이 모델 객체의 그래프를 객체의 생명 주기 동안 관리하도록 도와주며 그 데이터를 관계 데이터베이스나 파일에 영속 저장하는 것도 제공합니다. undo와 redo 관리 기능, 값의 자동 확인, 변화 전파, Cocoa 바인딩과의 통합 같은 기능들을 포함합니다. 더 많은 정보를 얻고 싶으시다면, “Other Cocoa Architectures”Core Data Programming Guide를 읽으십시오.
  • Sync Services—Sync Services를 사용해 존재하는 연락처, 캘린더, 북마크, 응용프로그램 데이터를 싱크시킬 수 있습니다. 존재하는 스키마도 확장시킬수 있습니다. Sync Services Programming Guide에서 더 많은 정보를 찾을 수 있습니다.
  • Address Book—이 프레임웍은 연락처와 다른 개인정보에 대한 중앙화된 데이터베이스를 구현하고 있습니다. Address Book 프레임웍을 사용하는 응용프로그램들은 이 연락처 정보를 애플의 Mail과 iChat을 포함한 다른 응용프로그램들과 공유할 수 있습니다. Address Book Programming Guide에서 더 많은 정보를 찾을 수 있습니다.
  • Preference Panes—이 프레임웍으로 응용프로그램에 동적으로 로드되는 플러그인을 만들어 응용프로그램 자체나 시스템 전체에서 사용자의 프리퍼런스를 기록하는 유저 인터페이스를 얻을 수 있습니다. 더 많은 정보를 원하신다면 Preference Panes을 보십시오.
  • Screen Saver—Screen Saver 프레임웍은 스크린 이펙트 모듈을 만드는 것을 도와줍니다. 스크린 이펙트 모듈은 시스템 프리퍼런스에 의해 로드되고 작동됩니다. Screen Saver Framework Reference에서 더 많은 정보를 얻으십시오.
  • Web Kit—Web Kit 프레임웍은 윈도우 안에 웹 컨텐트를 디스플레이하기 위한 핵심 클래스들의 모음을 제공합니다. 기본적으로 사용자가 클릭한 링크를 따라가는 기능 등이 구현되어 있습니다. Web Kit Objective-C Programming Guide에서 더 많은 정보를 찾을 수 있습니다.



[편집] A Bit of History

오래 전에 Cocoa는 NeXTSTEP으로 알려졌습니다. NeXT Computer는 버젼 1.0의 NeXTSTEP을 1989년 9월에 개발하고 발표하였으며 버젼 2.0 과 3.0 도 곧 출시되었습니다.(각각 1990년과 1992년) 초기에 NEXTSTEP은 응용프로그램의 환경 이상이었습니다. 이 용어는 전체의 운영체제를 말하는 것이었으며, Windowing, (Display PostScript에 기반한)이미징 시스템, Mach 커널, 디바이스 드라이버 등을 포함하고 있었습니다.

그때는 Foundation 프레임웍은 존재하지 않았습니다. 사실 프레임웍이라는 것이 존재하지 않았고, 대신 kit으로 알려진 (동적 공유된)소프트웨어 라이브러리가 있었고 그중 가장 잘 나타난 것이 Application Kit 이었습니다. 지금 Foundation이 차지하고 있는 많은 역할들은 함수, 스트럭쳐, constant, 기타 타입들의 잡동사니 집합으로 이루어져 있었습니다. Application Kit 자체도 현재에 비해 상당히 작은 클래스모음을 가지고 있었습니다. Figure 1-11은 NeXTSTEP 0.9 (1988)의 계층도를 보여주고 있습니다.

Figure 1-11 Application Kit class hierarchy in 1988
그림:A cc cfg appkitc 88.gif

Application Kit에 더해 초기 NeXTSTEP은 오디오와 음악 합성을 위해 Display Postscript 레이어에 고수준의 접근을 가능하게 하는 풍부한 Objective-C 클래스들의 모음을 가지고 있는 라이브러리인 Sound Kit 과 Music Kit을 제공했습니다.

1993년 초 NeXTSTEP 3.1은 Intel, Sparc, Hewlett-Packard 컴퓨터로 포팅되고 판매되었습니다. NeXTSTEP 3.3 또한 주요한 새로운 방향점을 찍었는데, 드디어 초기 버젼의 Foundation이 들어가게 된 것입니다. 이때 즈음에(1993) OpenStep도 출범하였습니다. OpenStep은 Sun 과 NeXT가 협력을 이루어 NeXTSTEP 고수준(특히 Application Kit 과 Display PostScript)을 솔라리스로 포팅하려는 노력이었습니다. 이름의 “Open”은 회사들이 연합해서 발표하는 오픈 API 규격을 언급하는 것이었습니다. 공식 OpenStep API는 1994년 9월에 발표되었으며 처음으로 Foundation 과 Application Kit API를 분리하였으며 "NS" 접두사가 처음으로 사용되었습니다.

1996년 6월까지 NeXT는 윈도우즈 시스템에서 동작하는 OpenStep 런타임 뿐만아니라 Intel, Sparc, HP 컴퓨터에서도 작동하는 OpenStep 4.0 까지 포팅하고 출하하였습니다. Sun은 또한 그들의 Solaris용 OpenStep 포팅을 마치고 그들의 네트웍 오브젝트 컴퓨팅 환경(Network Object Computing Environment)의 일부로 출하하였습니다. 그러나 OpenStep은 Sun의 전체 전략에 중요한 역할을 하지는 못했습니다.

애플이 NeXT Software(그 당시엔 이렇게 불렸습니다)를 1997년에 인수했을때, OpenStep은 Yellow Box가 되었고 (랩소디라고 알려진) Mac OS X Server 와 Windows에 포함되었습니다. 그러다가, Mac OS X 전략의 진화와 함께 마침내, "Cocoa"라고 이름지어지게 되었습니다.



번역자 사용자:Idiel
원본문서링크 http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/index.html?http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/WhatIsCocoa/chapter_2_section_1.html#//apple_ref/doc/uid/TP40002974-CH3-SW16 (Last Updated - 2006-12-20)