코코아(Cocoa)

먼저 코코아(Cocoa)라는 단어는, NSObject를 상속받는 모든 클래스, 모든 객체를 가리킬 때 사용하는 단어다.

그렇다면 왜 이름이 하필 코코아일까?

The name, coined by Peter Jensen who was hired to develop Cocoa for Apple, was intended to evoke "Java for kids", as it ran embedded in web pages.

-WIKI-

위키에서 긁어온 위 글을 보면 알 수 있다. 당시 지금이상으로 핫했던 언어인 Java가 커피원산지에서 따온 이름이기 때문에,

애플 개발자는 어린아이도 할 수 있는 자바(Java for kids)라는 의미에서 코코아라고 이름지었다고 한다.😅

코코아 터치(Cocoa Touch)

코코아 터치 프레임워크란 iOS 개발 환경을 구축하기 위한 최상위 프레임워크다.

즉, 일반적으로 iOS개발을 위해 Object-C 혹은 Swift에서 상속하여 사용하는 UIkit, Foundation을 포함한 대부분의 클래스, 객체들이 모두 코코아 터치 프레임워크에 속한다.

참고로 비슷한 이름의 코코아 프레임워크macOS 개발 환경을 위한 프레임워크라고 한다. 그렇기 때문에, 아이폰, 아이패드 등의 터치기반의 iOS 개발환경에 코코아 터치 프레임워크라는 이름이 붙게된 것 같다.

111_0.png

UIKit

UI(User Interface)라는 이름에서 알 수 있듯이, UIKit 프레임워크는 사용자의 인터페이스를 관리하고, 이벤트를 처리하는게 주 목적인 프레임워크다.

사실 iOS이전의 macOS에서는 비슷한 개념으로 Application kit줄여서 Appkit이라는 프레임워크를 사용했었지만, iOS로 넘어오면서 비슷한 개념을 가진 UIkit으로 대체되었다.

UIkit에서 주로 처리하는 사용자 이벤트로는 제스처 처리, 애니메이션, 그림 그리기, 이미지 처리, 텍스트 처리 등이 있다.

또한 테이블뷰, 슬라이더, 버튼, 텍스트 필드, 얼럿 창 등 애플리케이션의 화면을 구성하는 요소도 포함한다.

그렇기 때문에, 자주 사용하는 UIViewController, UIView(당연히 이를 상속하는 버튼, 텍스트 필드 등도 포함), UIAlertController등 앞에 UI가 붙는 클래스들을 사용하려면 반드시 UIkit을 상속해야 한다.

이쯤되면, 거의 화면을 구성하기 위해 필수적으로 상속해야하는 프레임워크라고 봐도 무방할 것 같다.

Foundation

프로그램의 중심을 담당하는 프레임워크이다. 사실 가장 기본적인 원시 데이터 타입(String, Int, Double)부터가 Foundation에 포함되어있기 때문에, 프레임워크를 상속하지 않으면 아무것도 할 수 없다고 봐도 무방하다.

Foundation 내에 포함된 클래스들은 앞에 NS가 붙으며 주로 사용하는 기능들은 다음과 같다.

기본

Number, Data, String: 원시 데이터 타입 사용
Collection: Array, Dictionary, Set 등과 같은 컬렉션 타입 사용
Date and Time: 날짜와 시간을 계산하거나 비교하는 작업
Unit and Measurement: 물리적 차원을 숫자로 표현 및 관련 단위 간 변환 기능
Data Formatting: 숫자, 날짜, 측정값 등을 문자열로 변환 또는 반대 작업
Filter and Sorting: 컬렉션의 요소를 검사하거나 정렬하는 작업

애플리케이션 지원

Resources: 애플리케이션의 에셋과 번들 데이터에 접근 지원
Notification: 정보를 퍼뜨리거나 받아들이기는 기능 지원
App Extension: 확장 애플리케이션과의 상호작용 지원
Error and Exceptions: API와의 상호작용에서 발생할 수 있는 문제 상황에 대처할 수 있는 기능 지원

파일 및 데이터 관리

File System: 파일 또는 폴더를 생성하고 읽고 쓰는 기능 관리
Archives and Serialization: 속성 목록, JSON, 바이너리 파일들을 객체로 변환 또는 반대 작업 관리
iCloud: 사용자의 iCloud 계정을 이용해 데이터를 동기화하는 작업 관리

네트워킹

URL Loading System: 표준 인터넷 프로토콜을 통해 URL과 상호작용하고 서버와 통신하는 작업
Bonjour: 로컬 네트워크를 위한 작업

프레임워크의 계층구조

import UIKit
class asdf{
    var b = DateFormatter()
}

그렇다면, 위 내용대로 한가지 실험을 해보자.

위에서 사용중인 DateFormatterFoundation 프레임워크에 포함된 클래스다. 그러므로 이를 사용하기 위해선 반드시 Foundation프레임워크를 import해야 할 것이다.

그렇다면 위 코드에서는 UIkit만 import했으니 당연히 오류가 발생하겠지?

하지만 위 코드는 정상적으로 실행된다.

이유가 뭘까? 이에 대해 자세히 알기 위해서는 먼저, 각 프레임워크의 계층구조에 대해서 이해해야 한다.

image.png

기본적으로 코코아 프레임워크는 위와같은 계층구조를 갖는다.

하위 계층일수록 하드웨어에 친화적이고, 반대로 상위 계층일 수록 사용자 친화적이다.

이 중 UIKit은 가장 위인 Cocoa Touch 계층이고 그보다 두단계 FoundationCore Service 계층이다. 그렇기 때문에 UIkitFoundation 프레임워크를 상속했을 가능성이 높다.

결과적으로 UIkit을 상속하는 것 만으로, Foundation도 함께 상속한 결과를 내는 것이다.

각 계층에 포함된 프레임워크들은 다음과 같다.

Cocoa Touch 계층

하위 계층의 프레임워크를 사용하여 애플리케이션을 직접 구현하는 프레임워크.
UIKit, GameKit, MapKit

Media 계층

상위 계층인 코코아 터치 계층에 그래픽 관련 서비스나 멀티미디어 관련 서비스를 제공
Core Graphics, Core Text, Core Audio, Core Animation, AVFoundation

Core Service 계층

문자열 처리, 데이터 집합 관리, 네트워크, 주소록 관리, 환경 설정 등 핵심적인 서비스들을 제공.
또한 GPS, 나침반, 가속도 센서나 자이로스코프 센서와 같이 디바이스의 하드웨어 특성에 기반한 서비스도 제공.
Foundation, Core Foundation, Core Location, Core Motion, Core Animation, Core Data

Core OS 계층

커널, 파일 시스템, 네트워크, 보안, 전원 관리, 디바이스 드라이버 등이 포함
iOS가 운영 체제로서 기능을 하기 위한 핵심적인 영역

image.png

이제 UIkit 프레임워크의 내부를 들여다보자.

자세히 볼 필요도 없이 첫 줄부터 Foundation을 상속하고 있다는 것을 확인할 수 있다.

물론 그렇다고 해서, 모든 상위계층이 하위계층을 포함하고 있다거나, 같은계층끼리의 포함관계가 없는 것은 아니다.
예를들어 같은 계층의 GameKit은 UIkit을 상속하고있고, Foundation은 CoreFoundation을 상속하고 있다.

참조

https://www.edwith.org/boostcourse-ios/lecture/17996/
https://pole2win.tistory.com/entry/Objective-C-cocoa-core-foundation