본문 바로가기
앱/iOS

iOS와 코코아 터치 프레임워크

by msm1029 2021. 11. 6.
반응형

간단한 토이 프로젝트, 클론코딩 등의 iOS 애플리케이션을 만들어 보았다면 UIApplication, UIViewController, UILable, UIButton등의 클래스를 이용해본 적이 있을 것이다. 이는 Swift 문법에서는 배우지 않는다. 실제로, 플레이그라운드에서

let btn = UIButton()
let title = UILabel()

와 같은 코드를 작성해보면 존재하지 않는 클래스라는 오류가 발생할 것이다.

왜냐하면, 이들 클래스(UI로 시작하는)는 모두 UIKit Framework에 속해있기 때문에 import UIKit을 상단에 작성해야 한다.

 

뿐만 아니라, 네트워크나 날짜 연산 등의 기능 처리를 위해서는 Foundation Framwork, 애니메이션 처리를 위해서는 Animation Framework, 웹과 관련된 기술을 구현하기 위해서는 Webkit Framework 등이 필요한 것처럼 iOS에서는 많은 Framework를 제공하고 있다.

 

이러한 Framework들의 계층을 거슬러 올라가보면 Cocoa Touch Framework라는 것이 있다. iOS 기반 기술들은 대부분 이 Framework를 통해 구현되기 때문에, 앱을 제작하기 위해서는 결국 Cocoa Touch Framework 전체를 이해해야 한다.

 

*프레임워크란?

사전적으로는 '어떤 것을 이루는 뼈대, 기본 구조'라는 의미를 갖는다. 소프트웨어에서 사용하는 프레임워크는 애플리케이션 제작을 빠르고 편리하게 할 수 있도록 미리 뼈대를 이루는 각종 코드를 제작하여 모아둔 것이다.

 

Cocoa Touch Framework

Cocoa Touch Framework는 애플 환경에서 터치 기반의 애플리케이션을 제작하기 위한 도구들의 모음이다.

용도에 따라 여러 개의 하위 프레임워크로 나뉘는데 주요 프레임워크는 다음과 같다.

- Foundation Framework

- UIKit Framework

- GameKit Framework

- iAd Framework

- MapKit Framework

- Address Book UI Framework

- EventKit UI Framework

- Message UI Framework

- UserNotifications Framework

- WebKit Framework

이러한 프레임워크들은 필수 요소가 아니다. 즉, 필요한 프레임워크만 import해서 사용하면 된다.

 

Cocoa Touch Framework를 공부하다보면 Cocoa 환경, Cocoa Framework라는 용어를 접하게 된다.

이름은 비슷하지만 이는 Apple의 데스크톱 운영체제인 OS X(MacOS)에서 실행되는 애플리케이션을 개발하기 위해 사용되던 프레임워크이다. 실제로 Cocoa Touch Framework는 Cocoa Framework를 바탕으로 만들어졌고 현재에도 많은 부분을 공유한다.

교집합에 해당하는 프레임워크로는 Foundation Framework가 있다.

Cocoa Framework는 UIKit Framework 대신 Appkit Framework를 사용한다. 

 

프레임워크의 계층 관계

Cocoa Touch Framework를 구성하는 작은 단위의 프레임워크들은 계층 관계를 이룬다. 이 중 우리가 주로 프로그래밍에 사용하는 것은 상위 레벨 프레임워크들로, 사용자에 가깝고 구체적으로 구현되어 있어 애플리케이션을 만들 때 손쉽게 사용할 수 있는 형태를 말한다. 이를 구체화되어 있다라고 표현한다.

 

반면, 하위 레벨 프레임워크들은 추상적이면서 하드웨어 쪽에 가깝기 때문에 우리가 다루기에는 다소 번거롭지만 그만큼 제한이 많지 않기 때문에 다양한 형태로 확장이 가능하다.

 

대부분의 경우에서 상위 프레임워크는 하위 프레임워크에 의존적이다. 예를 들어, 상위 프레임워크에 속하는 Foundation Framework는 내부적으로 Core Foundation이라는 하위 계층 프레임워크에 의존하고 있다. 따라서, 우리는 직접 하위 프레임워크에 접근할 필요없이 상위 프레임워크가 제공하는 기능을 이용하면 된다.

 

하지만, 애플리케이션을 개발할 때 상위 레벨 프레임워크만 이용하는 것은 아니다. 만약 상위 레벨 프레임워크가 제공하지 않는 기능은 하위 레벨 프레임워크를 이용하여 직접 구현해야 한다. 아래의 그림은 프레임워크 계층 구조이다.

이제 각 계층에 대해 조금 더 자세히 살펴보자.

Core OS 계층 : Kernel, File System, 네트워크, 보안, 전원 관리, Device Driver 등이 포함되어 있다. iOS가 운영체제로서 기능을 하기 위한 핵심적인 영역이다.

 

Core Services 계층 : 이 계층에 속한 프레임워크들은 문자열 처리, 데이터 집합 관리, 네트워크 및 주소록 관리, 환경 설정 등의 핵심적인 서비스를 제공한다. 또한, GPS, 나침반, 가속도 센서, 자이로스코프 센서와 같은 Device Hardware 특성에 기반한 서비스도 제공한다. Foundation Framework가 이 계층에 속하며 Foundation Framework가 의존하는 Core Foundation Framework도 이 계층에 포함되어 있다. 이 외에도 Location, Core Motion, Core Animation, Core Data 등의 프레임워크가 포함되어 있다.

 

Media 계층 : 이 계층에 속한 프레임워크들은 하위 프레임워크인 Core Services 계층에 의존적이며, 상위 계층인 Cocoa Touch 계층에 그래픽 관련 서비스나 멀티미디어 관련 서비스를 제공한다. 대표적으로 Core Graphics, Core Audio 등의 프레임워크가 있다.

 

Cocoa Touch 계층 : 애플리케이션을 직접 지원하는 역할을 담당한다. iOS에서 설치되고 실행되는 모든 애플리케이션은 Cocoa Touch 계층에서 제공하는 여러 가지 기술이나 서비스를 이용하여 기능을 구현하고 동작한다.

 

iOS의 프레임워크 계층은 Hardware와 Applications 사이를 중계하는 위치에 자리한다. 최상단 계층인 Cocoa Touch 계층이 Applications와 연결되어 있고 가장 아래에 위치해있는 Core OS 계층이 Hardware와 연결되어 있다.

 

앱을 구성하는 핵심 객체들

하나의 스크린에 여러 창을 띄울 수 있는 데스크톱과 달리 iOS는 항상 디바이스에 꽉 차는 하나의 화면만 표시할 수 있으며, 다른 프로그램이 실행되면 기존의 화면은 내려가고 그 자리를 대체한다. 이러한 과정을 구현하는 데에 Window와 View 객체가 사용된다.

 

Window는 iOS에서 디바이스의 화면을 빈틈없이 채우기 위한 객체로, 항상 UI 표현 계층의 최상위에 위치한다. Window는 직접 콘텐츠를 가지지 않으며 콘텐츠를 가진 View를 내부에 배치하여 화면을 출력하는 역할을 한다. 화면이 전환되더라도 Window 객체는 전환되지 않으며 단지 내부에 배치된 View의 콘텐츠만 변경된다.

 

View는 콘텐츠를 담아 이를 스크린에 표시하고 사용자의 입력에 반응한다.

 

iOS에서 실행되는 모든 앱은 최소한 하나 이상의 Window와 View를 가진다. 대부분의 경우 Window는 하나이지만 외부 디스플레이가 연결될 경우 새로운 Window 객체를 생성한다. Window 내부에는 수많은 View가 포함되어 있다. 이러한 Window와 View 사이는 View Controller를 통해 연결된다.

 

View Controller는 View의 계층을 관리하여 Window에 전달하고 디바이스에서 감지된 이벤트를 전달받아 처리하는 역할을 한다. Window가 View를 직접 참조하지 않고 View Controller가 중계하는 구조 덕분에 Window 객체에 Custom Code가 난립하는 것을 차단하며 Window 객체 하나가 모든 View를 관리하는 현상을 방지한다.

 

Window 객체는 하나의 View Controller를 Root View Controller로 지정하여 참조한다. Root View Controller로 지정이 되면 스토리보드에서 아래의 그림과 같은 화살표로 Root View Controller임을 식별할 수 있게 해준다. Window 객체는 항상 Root View Controller만을 참조한다.

스토리보드를 통해 편집하는 대부분의 View Controller들은 각자 하나씩의 화면을 담당하여 콘텐츠를 표현하고 View를 관리하는데 이를 Scene이라고 부른다. A, B 두 개의 Scene으로 이루어진 애플리케이션이 있다면 각각의 Scene을 표현할 두 개의 View Controller가 필요하다. 이렇게 Scene을 담당하고 콘텐츠를 표시하는 View Controller를 Contents View Controller라고 한다.

 

일부 View Controller는 Scene을 표현하는 대신, 다른 View Controller와의 연결 관계를 관리하기도 한다. 이들은 내부에 콘텐츠를 배치하는 대신 다른 View Controller를 배치하고 서로 유기적인 관계로 엮이도록 만들어준다. Navigation Controller나 Tab bar Controller 등이 이러한 예이다. 이들은 Contents View Controller와 구분하여 Container View Controller라 한다.

 

View Controller 내부에는 수많은 View들이 존재하는데 각각의 View는 자기 자신을 화면상에 표시하기도 하지만 동시에 다른 View 객체를 포함하는 Container의 역할도 수행한다. 이를 View hierarchy라 한다. View hierarchy에서 다른 View를 포함하는 View는 Superview가 되고 포함된 View는 Subview가 된다.

 

일반적으로 각각의 Scene은 자신만의 View hierarchy를 가지고 있으며 최상위에는 하나의 View가 존재한다. 이 View를 Root View 또는 Contents View라 한다. Table View Controller에서는 Table View가 Root View이며, Collection View Controller에서는 Collection View가 Root View이다. Root View 내부에는 여러 개의 Subview가 추가되며 이들을 View Controller를 통해 Window에 전달한다.  아래는 Window 객체와 View Controller, Root view의 참조 관계를 보여준다.

 

View Controller

View Controller는 앱의 근간을 이루는 객체로, 모든 앱은 최소한 하나 이상의 View Controller로 구성된다. 이들의 주된 역할은 View를 관리하는 것이지만 화면과 데이터 사이의 상호 작용까지 관리하기도 한다. 또한, Window 객체로부터 전달된 이벤트를 받아 Business Logic을 실행하고 그 결과로 얻어진 데이터를 콘텐츠로 만들어 화면으로 표현하는 등의 역할을 한다.

 

다음은 View Controller의 목록과 그 역할이다.

 

- View Controller : iOS에서 가장 기본이 되는 Controller로서 앱의 데이터와 표시될 외형을 연결하여 하나의 동작 화면을 만들어내는 Controller이다.

 

- Navigation Controller : 앱의 화면 이동에 대한 관리와 그에 연관된 처리를 담당해주는 Controller이다.

 

- Table View Controller : 내부에 리스트 형식의 Table View를 포함하고 있어 여러 항목이나 데이터를 화면에 나열하기 위한 목적으로 사용되는 Controller이다.

 

- Tab Bar Controller : 화면을 나타내는 여러 개의 탭이 있고, 탭을 터치하면 화면 전환이 되는 형태의 앱을 만들고자 할 때 사용되는 Controller이다.

 

- Split View Controller : 목록을 나열하는 Master Page와 그 목록에 대한 새부 내용을 보여주는 Detail Page로 구성되는 Controller이다.

 

View Controller가 맡고 있는 역할 중 특히 중요한 역할은 View hierarchy를 관리하는 역할이다. 스토리보드에서 View Controller 위에 배치하는 대부분의 객체들은 모두 Root View에 추가되는 Subview라 할 수 있다. 우리는 항상 모든 객체를 Root View 혹은 그 아래에 추가해야 한다.

 

앞서 앱의 상태 변화와 생명 주기에 대해 살펴본 바가 있다. 이러한 흐름과 생명 주기는 View Controller에도 적용할 수 있다. View Controller는 다음과 같이 네 가지 상태로 나눌 수 있으며 상태 변화에 따라 호출되는 메소드들이 있다.

 

- Appearing : View Controller가 화면에 등장하기 시작한 순간부터 등장 완료 직전까지의 상태이다.

- Appeared : View Controller가 화면에 완전히 등장한 상태이다.

- Disappearing : View Controller가 화면에서 가려지기 시작해서 완전히 가려지기 직전까지의 상태이다.

- Disappeared : View Controller가 화면에서 완전히 가려진 상태이다.

 

 

 

 

 

*이 포스트는 꼼꼼한 재은씨의 Swift:기본편을 토대로 작성되었습니다.

반응형

' > iOS' 카테고리의 다른 글

Swift - 모나드  (0) 2022.01.22
Swift의 연산자  (0) 2022.01.13
iOS - 객체 제어  (0) 2021.11.07
iOS 앱의 구조  (0) 2021.11.05
첫 iOS 앱 클론코딩 후기  (0) 2021.02.10