The Role of View Controllers

kirri1124·2022년 1월 14일
1

iOS Review

목록 보기
14/14

자, 이번엔 아는거다!

라고 생각하며 ViewController 공부를 시작했으나, ViewController가 뭔지 설명을 해보라고 하면 할 수 있는가?
필자는 딱 "이거다!" 라고 설명하지 못할 것 같다. 기초 중에 기초이지만, 아직 많이 부족하다고 느끼는 순간이다.

그래서 오늘은 앱의 기초 내부구조인 ViewController에 대해 알아보자.

그래서 뷰컨을 뭐라고 얘기할 껀데요 ㅋㅋ

뷰 컨트롤러는 앱의 기초가 되는 내부구조이다.
모든 앱에는 적어도 하나의 뷰 컨트롤러가 있고! 대부분의 앱에는 여러개의 뷰 컨트롤러를 가지고 있다.

또한 각 뷰 컨트롤러는 앱의 UI 뿐 아니라 UI와 데이터 간의 인터렉션 또한 관리한다. 우리가 사용하는 앱의 모든 UI와 데이터의 업데이트를 관리해주는 것이 바로 뷰 컨트롤러라고 할 수 있다.

그럼 많이 중요하겠네요?

맞다. 뷰 컨트롤러는 앱에서 매우 중요한 역할을 하기 때문에 사실상 거의 모든 작업에 중심에 있다.

그래서 뷰 컨트롤러를 관리하는 클래스 또한 따로 존재하는데, 그게 바로 UIViewController 클래스이다. 우리가 너무도 많이 본 그 클래스 말이다.

UIViewController 클래스는 뷰 관리, 이벤트 처리, 뷰 컨트롤러 간 전환, 앱의 다른 부분과의 Coordinating을 위한 메서드들을 정의할 수 있다.

두가지 유형의 뷰 컨트롤러

사실 뷰 컨트롤러는 두가지의 유형으로 나눌 수 있다.
Content View Controller
기본적으로 뷰 컨트롤러의 역할을 수행하는, 예를들어 앱 내의 데이터를 보여주거나 UI 를 짜는 등의 역할을 수행하는 뷰 컨트롤러이다. 일반적으로 우리가 UIViewController를 직접 서브클래싱해서 사용하는 경우를 말한다.

class ViewController: UIViewController {}

이렇게 그냥 띄워놓고 사용하는 경우를 말하는 것이다.

Container View Controller
여러 요소들을 조합한 인터페이스를 구성할 때 사용하는 뷰 컨트롤러이다.
보통 직접 무언가를 보여주기 위해서 사용하는 경우는 없고, 뷰 컨트롤러 간의 부모 - 자식 관계를 형성해서 자식들을 관리하는 역할을 맡게되는 뷰 컨트롤러 라고 보면 될 듯하다.

근데 UIKit에서 기본적으로 제공하는 System Container View Controller 가 있다.
UITabBarController, UINavigationController, UIPageViewController 등이 그것이다!

근데 보통은 둘 다 섞여있는 상태로 뷰 컨트롤러를 사용하게 된다.

ViewController의 역할

View Management

뷰 컨트롤러의 가장 중요한 역할은 바로 뷰 계층을 관리하는 것이다.
모든 뷰 컨트롤러에는 뷰 컨트롤러의 컨텐츠들을 관리하는 Root View가 존재한다.
그리고 Root View에 우리가 원하는 View 들을 추가하는 방식으로 뷰를 만들어 나간다.

Data Marshaling

뷰 컨트롤러는 뷰가 관리하는 뷰와 앱의 데이터 사이의 중개자 역할을 하게 된다.
UIViewController 클래스의 메서드와 속성등을 활용해 UI를 관리할 수 있다.

marshal 이란 단어를 사전에서 보게 되면, 명사로 쓰일 때는 군대의 원수나 경찰서장, 법원의 집행관 등을 의미하고, 동사로서는 (특정 목적을 위해 사람. 사물. 생각 등을) 모으다, 결집시키다 라는 뜻과 통제하다 라는 뜻이 있다.

즉, 많은 것들을 모으거나 통제한다는 관리적인 개념의 단어라고 볼 수 있다.
프로그래밍 언어에서는 객체의 메모리 구조를 저장이나 전송을 위해 적당한 자료형태로 변형하는 것을 의미한다.

User Interactions (유저 인터렉션)

뷰 컨트롤러는 Responder 객체이며 Responder Chain으로 내려오는 이번트를 처리할 수 있다.
뷰 컨트롤러가 터치 이벤트를 직접 처리하는 경우는 거의 없다.
대신, 뷰는 일반적으로 터치 이벤트를 처리하고 delegate에게 그 이벤트를 전달하는 역할
을 한다.

Resource Management (자원 관리)

뷰 컨트롤러는 뷰와 뷰가 생성하는 객체에 대한 모든 책임(?)을 가진다.
아마도 이 말은 뷰의 모든 객체를 관리한다라는 말인 듯 싶다. UIViewController 클래스는 View 관리를 자동으로 처리한다. 예를 들면 , UIKit은 더 이상 필요하지 않은 View 리소스를 자동으로 해제한다.

사용가능한 메모리가 부족할 때 UIKit은 앱에서 더 이상 필요하지 않은 자원(리소스)을 해제시키게 된다.

또 다른 방법으로는, didReceiveMemoryWarning 메서드를 호출하는 방법이다.
이 메서드를 호출하면 더 이상 필요하지 않거나, 나중에 쉽게 다시 만들 수 있는 객체에 대한 참조를 제거할 수가 있다.

Adaptivity (적응성)

뷰 컨트롤러는 뷰의 표현을 책임지게 되고, 현재 환경에서 적절한 방법으로 화면이 적용되도록 관리한다.

모든 iOS 앱은 iPad와 여러 크기의 iPhone에서 실행될 수 있어야 한다. 각 장치에 대해 서로 다른 뷰 컨트롤러를 제공하는 것 보다는 변화하는 크기에 맞게 뷰를 조정하는 하나의 뷰 컨트롤러를 사용하는 것이 더 간단하고 깔끔하다.

오토레이아웃이 이 개념에서 나온듯 하다.

정리

오늘은 ViewController가 뭔지, 어떤 역할을 하는지 알아보았다.

ViewController는 앱을 구성하는 가장 기본적인 구조이고, 앱 UI뿐만 아니라 UI와 데이터 간의 상호작용 또한 관리하게 된다.

UIViewController는 ViewController를 관리할 수 있는 클래스이고 UI관련 메서드나 속성을 정의할 수 있는 곳이다.

ViewController의 역할은

View Management (뷰 관리) - RootView로 연결되어 View를 관리
Data Marshaling (데이터 중개역할) - View에 보여질 데이터를 중개함
User Interactions (유저 인터렉션) - 터치 이벤트를 delegate에게 넘겨줌
Resource Management (자원 관리) - 메모리 여부에 따라 뷰를 지우거나 생성하는 역할
Adaptivity (적응성) - 어떤 화면이 와도 뷰가 그 기기에 맞게 그려져야 함

이렇게 4개의 역할을 진행한다.

0개의 댓글