날쌘 개발자

꼼꼼한 재은씨 기본편 (2) 본문

ios/책공부

꼼꼼한 재은씨 기본편 (2)

훈식이 2021. 10. 25. 15:55
728x90
Chpt 02
iOS 앱의 구조와 코코아 터치 프레임워크

앱은 커스텀 코드와 시스템 프레임워크 사이에서 매우 복잡한 상호작용을 함.
시스템 프레임워크 - iOS기반의 앱이 실행되는 데에 필요한 기반 환경 제공 - 건드릴 수 없는 영역
커스텀 코드 - 우리가 코드를 이용하여 원하는 기능과 앱의 형태를 구현 - 건드릴 수 있는 영역

엔트리 포인트(Entry Point, 시작 진입점)
C언어나 처럼 오브젝티브-C에서도 main()함수로부터 시작되나, iOS앱에서는 우리가 직접 main()함수를 작성 X, 자동으로 생성 됨
Main()함수가 하는일 : 실행 시 시스템으로부터 전달받은 두 개의 인자값과 AppDelegate클래스를 이용하여 UIApplicationMain()함수 호출하고, 그 결과로 UIApplication객체를 반환 - 이 UIApplicationMain()함수는 iOS앱에 속하는 부분의 엔트리 포인트라고 할 수 있음. - 앱의 핵심 객체를 생성하는 프로세스를 핸들링하고, 스토리보드 파일로부터 앱의 유저 인터페이스를 읽어들일뿐만 아니라 우리가 작성한 커스텀코드를 호출해 줌으로써 앱 생성 초기에 필요한 설정을 구현할 수 있게 해줌. + 이벤트 루프 실행시켜줌

스위프트 기반 프로젝트에는 main.m파일이 존재 X, 엔트리 포인트역시 존재 X
스위프트는 앱 델리게이트 역할을 할 클래스에 @UIApplicationMain 어노테이션을 걸어 표시하는 방식으로 시스템에 델리게이트 클래스 정보를 전달.

UIApplication객체는 앱의 본체라고 할 수 있음. 사실상 앱 그 자체를 의미.

AppDelegate 객체는 커스텀 코드와 연결되어 있음. -> 대부분의 경우 커스터마이징하거나 혹은 서브 클래싱하여 사용할 수 있도록 오픈되어 있음. + iOS 어플리케이션 내에서 오직 하나의 인스턴스만 생성되도록 시스템적으로 보장받음, 앱 전체의 생명주기와 함께함 -> 종종 앱의 초기 데이터 구조 설정을위해 사용됨

MVC 패턴

iOS앱의 객체 관계는 MVC패턴에 기반.
소스 코드 설계 기법으로써, 모델 - 뷰 - 컨트롤러 로 이어지는 세 개의 핵심 구조를 이용하여 애플리케이션을 설계하는 것.

모델 - 데이터 담당
뷰 - 데이터에 대한 화면 표현 담당
컨트롤러 - 모델과 뷰 사이에 위치하여 데이터를 가공하여 뷰로 전달하고, 뷰에서 발생하는 이벤트를 입력받아 처리하는 역할 담당

이 같이 각각의 역할로 쪼개고 나누어 놓은 이유 - 이 패턴이 가지는 장점이 많음. 대표적으로- 데이터와 비즈니스 로직을 시각적인 표현으로부터 분리해줌으로써 화면을 신경쓰지않고도 데이터나 비즈니스로직을 작성 가능.

앱의 상태 변화 - 화면에 나타났거나, 또는 화면으로부터 숨겨졌거나, 시작했거나 종료되었거나 하는 등.
운영체제가 처리하는 영역(ex. 앱을 사용하는 도중 전화가 오면 앱이 화면에서 사라지고 전화 화면이 대신하게 되는 것)

iOS에서 앱이 가질 수 있는 상태값

Not Running - 앱이 시작되지 않았거나 실행되었지만 시스템에 의해 종료된 상태
Inactive - 앱의 전면에서 실행 중이지만, 아무런 이벤트를 받지 않고 있는 상태
Active - 앱이 전면에서 실행 중이며, 이벤트를 받고있는 상태
Background - 앱이 백그라운드에 있지만 여전히 코드가 실행되고 있는 상태
Suspended - 앱이 메모리에 유지되지만 실행되는 코드가 없는 상태(메모리가 부족한 상황이 오면 이 상태에 있는 앱들을 특별한 알림없이 정리함.)

앱의 라이프 사이클(Life Cycle, 생명주기) - Not Running상태에서 시작하여 Inactive, Active를 거친 다음, Suspended상태를 마지막으로 다시 Not Running상태로 돌아가는 주기.
앱의 실행 상태가 변화할 때마다 앱 객체는 앱 델리게이트에 정의된 특정 메소드를 호출
자세한 메소드 목록은 UIAppDelegateProtocol의 공식 문서 참고

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

UIApplication, UIViewController, UILabel, UIButton 등 UI가 붙는 형식의 클래스는 이들이 모두 UIKit프레임워크에 속해 있다는 것을 의미.
-> 스위프트 언어 자체에서 제공하는 클래스가 아닌 프레임워크를 통해 제공되는 클래스 --> UIKit 프레임 워크.

프레임워크(Framework) - 사전적으로 어떤 것을 이루는 뼈대 기본 구조 를 의미. 소프트웨어에서 사용하는 프레임워크는 애플리케이션 제작을 빠르고 편리하게 할 수 있도록 미리 뼈대를 이루는 각종 코드를 제작하여 모아둔 곳
대표적인 것들로는 UIKit 프레임워크, 파운데이션 프레임워크, 웹킷 프레임워크 등.. 이들 프레임워크를 모으면 다시 거대한 하나의 프레임워크가 되는데 이게 코코아 터치 프레임워크

Import Foundation - 파운데이션 프레임워크
Import WebKit - 웹킷 프레임워크
import Address - 주소록 UI 프레임워크
import UserNotifications - 사용자 알림 프레임워크

각각의 프레임워크를 반입해주어야 이들 프레임워크에 정의된 객체들 사용 가능.
앱을 제작하려면 결국 코코아 터치 프레임워크 전체를 이해해야함.

iOS

애플이 개발해서 제공하는 임베디드 운영 체제. 기본적으로 하나의 홈 스크린을 사용.
SDK - iOS용 소프트웨어를 개발할 수 있는 도구. 기기의 홈 스크린에 표현될 네이티브 앱을 개발하고 설치하여 실행하고 테스트하는 데 필요한 도구와 화면을 모두 포함.

네이티브 앱 - iOS시스템 프레임워크를 기반으로 하고 스위프트 또는 오브젝티드-C 언어로 개발되며 iOS를 통해 직접 실행되는 앱
비교되는 개념으로는 웹 앱(Web App)이 있음.
네이티브 앱을 웹 앱과는 달리 기기에 물리적으로 설치되기 때문에 디바이스가 비행기 모드일 때에도 실행할 수 있음.
iOS는 스마트폰이나 태블릿 기기 등의 하드웨어와 우리가 만든 네이티브 앱 사이에서 중계자처럼 동작.
앱은 하드웨어와 직접 대화할 수 X, iOS에서 제공하는 시스템 인터페이스를 통해서만 하드웨어와 커뮤니케이션가능.
이 중계해주는 iOS 인터페이스가 코코아 터치 프레임워크

코코아 터치 프레임워크

애플 환경에서 터치 기반의 애플리케이션을 제작하기 위한 도구들의 모음. 가장 대표적인 것이 유저 인터페이스
다양한 도구들이 용도에 따라 여러 개의 하위 프레임워크로 나누어짐.
대부분은 앱을 만드는데 필수 요소가 아니기 때문에 선택적으로 설정하지만, UIKit프레임워크파운데이션 프레임워크는 그 자체만으로도 굉장히 방대한 내용을 담고있고 앱을 개발하기 위해 반드시 필요한 도구들이기 때문에 이 두개의 프레임워크를 따로 모아 코코아 터치 프레임워크를 이루는 주 프레임워크로 간주함.

파운데이션 프레임워크 - 기본 데이터 형식, 컬렉션 및 앱의 기본 객체와 기본 기술 제공
UIKit 프레임워크 - 유저 인터페이스 도구를 통해 iOS앱을 구현할 수 있는 방법을 제공
쉽게말해 iOS 앱으로서의 특징적인 부분은 UIKit이, 내부적 기능은 파운데이션이 처리.

코코아 프레임워크

코코아 터치 프레임워크는 코코아 프레임워크를 기반으로 탄생. 현재에도 많은 부분을 공유.
코코아 프레임워크에도 두 가지 핵심 프레임워크가 있는데, 파운데이션 프레임워크와 애플리케이션 킷 프레임워크(앱킷)(데스크톱용 유저 인터페이스 역할).
현 시점에서 맥 테스크톱용 애플리케이션의 실행에 사용되는 프레임워크는 코코아 프레임워크 이지만, 이를 제외한 나머지 모든 애플 기기는 코코아 터치 프레임워크를 사용.

프레임워크의 계층 관계

상위 계층 : 보다 사용자에 가깝고 구체적으로 구현되어 있어서 손쉽게 사용할 수 있는 형태. 구체화되어 있다 라고 표현
하위 계층 : 추상적이면서 하드웨어에 가까워 우리가 다루기에는 다소 번거로움. 하지만 그만큼 범용적이고 원천적이기 때문에 다양한 형태로 확장 가능.
대부분의 경우 상위 프레임워크는 하위 프레임워크에 의존적.(ex. 파운데이션 프레임워크는 내부적으로 코어 파운데이션이라는 하위 계층의 프레임워크에 의존)

iOS에서의 프레임워크 계층구조는 위에서부터 Cocoa Touch - Media - Core Service - Core OS

코어 OS 계층 - 커널, 파일 시스템, 네트워크, 보안, 전원 관리, 디바이스 드라이버 등이 포함. 운영체제로서의 기능 핵심적 영역
코어 서비스 계층 - 이 계층에 속한 프레임워크들은 문자열 처리, 데이터 집합 관리, 네트워크, 주소록 관리, 환경 설정 등 핵심적인 서비스 제공. + GPS, 나침반 가속도 세서 등 디바이스의 하드웨어 특성에 기반한 서비스도 제공. 대표적으로 파운데이션 프레임워크.
미디어 계층 - 이보다 하위인 코어 서비스 계층에 의존적이며, 상위 계층인 코코아 터치 계층에 그래픽 관련 서비스나 멀티미디어 관련 서비스 제공
코코아 터치 계층 - 애플리케이션 프레임워크 계층이라고도 불리며, 애플리케이션을 직접 지원함. UIKit 프레임워크가 여기 속함.

코코아 터치 프레임워크의 주요 프레임워크들은 자신들에게 속해있는 객체의 이름에 특정 접두어를 붙이는 경향이 있음

Foundation Framework - NS
UIKit Framework - UI
UserNotifications Framework - UN
MapKit Framework - MK
Core Foundation - CF
Core Graphics - CG
AVFoundation - AV


앱을 구성하는 핵심 객체들

iOS는 항상 디바이스 스크린에 꽉 들어차는 하나의 화면만을 표시. 윈도우와 뷰 객체가 사용됨.
윈도우 - iOS에서 디바이스의 스크린을 빈틈없이 채우기 위한 객체. 항상 유저 인터페이스 표현 계층의 최상위에 위치. 뷰의 일종이지만 직접 콘텐츠를 가지는게 아니라 콘텐츠를 가진 뷰를 내부에 배치하여 화면에 출력하는 역할.
뷰 - 콘텐츠를 담아 이를 스크린상에 표시하고, 사용자의 입력에 반응.
이미지나 텍스트, 각종 도형, 내비게이션 바나 탭바 등 또는 이들이 결합한 다양한 형태의 뷰
모든 애플리케이션은 최소한 하나 이상의 윈도우와 뷰를 가짐.

윈도우와 뷰 사이는 뷰 컨트롤러를 통해 연결됨.
윈도우 객체는 하나의 뷰 컨트롤러를 루트 뷰 컨트롤러로 지정하여 참조. ( 스토리보드에서 화살표를 붙여 루트 뷰 컨트롤러 식별 가능)
루트 뷰 컨트롤러로 지정되지 못한 나머지 뷰 컨트롤러들은 루트 뷰 컨트롤러의 관리 대상으로 연결되거나 다른방식으로 이어짐.

대부분의 뷰 컨트롤러들은 각자가 하나씩의 화면을 담당하여 콘텐츠를 표현하고 뷰를 관리하는데, 이를 씬(Scene)이라고 부름
씬을 담당하고 콘텐츠를 표시하는 뷰 컨트롤러를 콘텐츠 뷰 컨트롤러(Contents View Controller) 라고 함.

일부 뷰 컨트롤러는 씬을 표현하는 역할 대신, 다른 뷰 컨트롤러의 연결관계를 관리하는데, 이들이 컨테이너 뷰 컨트롤러(Container View Controller)
내비게이션 컨트롤러나 탭 바 컨트롤러, 페이지 컨트롤러 등이 컨테이너 뷰 컨트롤러에 속함.

뷰 컨트롤러 내부는 수많은 뷰들로 이루어지는데, 이들은 자기 자신을 스크린상에 표시하기도 하지만, 동시에 다른 뷰 객체를 포함하는 컨테이너의 역할도 수행. 이를 뷰의 계층 구조(View hierachy)라고 함.
뷰의 계층 구조 상에서 다른 뷰를 포함하는 뷰는 슈퍼 뷰(superview)가 되고, 슈퍼 뷰에 포함된 뷰는 서브 뷰(subview)가 됨.
하나의 슈퍼 뷰는 다른 슈퍼 뷰의 서브 뷰가 될 수 있으며, 서브 뷰 역시 하위에 포함된 서브 뷰를 기준으로 슈퍼 뷰가 될 수 있음.
서브 뷰는 슈퍼 뷰를 기준으로 레이아웃 구성, 슈퍼 뷰는 서브 뷰가 레이아웃을 구성할 수 있도록 내부적으로 원점을 포함하는 좌표 체계 제공.

일반적으로 각각의 씬은 자신만의 뷰 계층 구조를 갖고있음.
뷰 계층 구조 최상위에는 하나의 뷰가 존재하는데, 이를 루트 뷰(Root View), 또는 콘텐츠 뷰(Contents View)라고 함.
테이블 뷰 컨트롤러에서는 테이블 뷰가 루트 뷰. 컬렉션 뷰 컨트롤러에서는 컬렉션 뷰가 루트 뷰

UIKit 프레임워크는 버튼이나 레이블, 텍스트 필드와 같은 비교적 단순한 컨트롤뿐만 아니라 테이블 뷰나 이미지 뷰, 스크롤 뷰 등 복잡한 구조의 뷰에 이르기까지 다양한 종류의 뷰를 미리 정의하여 제공.
-> 아이폰용 앱의 화면이나 애플 워치, 그리고. 애플 TV의 화면도 모두 만들 수 있음. -> 서로 호환되는 것은 아님. 운영 체제가 달라 운영 체제별로 애플리케이션을 따로 제작해야 함.
UIKit 프레임워크는 코코아 터치 프레임워크에 속해 있으니 결국 코코아 터치 프레임워크를 이용하면 이들 디바이스에서 동작하는 애플리케이션을 모두 만들 수 있음.

뷰 컨트롤러

앱의 근간을 이루는 객체. 모든 앱은 최소한 하나 이상의 뷰 컨트롤러로 구성됨.
주된 역할은 화면 구성 요소들, 즉 뷰를 관리하는 것이지만, 단순히 여기서 그치지 않고 화면과 데이터 사이의 상호 작용까지 관리하기도 함.
뷰 컨트롤러는 목적에 따라 여러 목적으로 나눌 수 있음.

View Controller ( UIViewController 클래스를 상속)
iOS의 가장 기본이 되는 컨트롤러로서 앱의 데이터와 표시될 외형을 연결해서 하나의 동적인 화면을 만들어 내는 컨트롤러.
내부에 뷰를 포함하므로 원하는 대로 화면을 직접 구성하고 컨트롤들을 배치할 수 있음.

Navigation Controller (UINavigationController 클래스를 상속)
앱의 화면 이동에 대한 관리와 그에 연관된 처리를 담당해주는 컨트롤러.
내부적으로 다른 컨트롤러를 포함하면서 컨트롤러끼리의 화면 이동을 처리해주고. 현재의 페이지 위치에 대한 내비게이션 역할.
뷰를 포함하고 있지 않으므로 하나의 화면을 담당하지는 못하고, 다른 컨트롤러와 결합하여 부분적으로 화면을 구성.

Table View Controller (UITableViewController)
내부에 리스트 형식의 테이블 뷰를 포함하고 있어 여러 항목이나 데이터를 화면에 나열하기 위한 목적으로 사용되는 컨트롤러
View Controller와 마찬가지로 하나의 컨트롤러가 하나의 화면을 이루는 화면 단위 컨트롤러.

Tab Bar Controller (UITabbarController)
화면을 나타내는 여러 개의 탭이 있고, 탭을 터치하면 화면이 전환되는 형태의 앱을 만들고자 할 때 사용.
탭마다 다른 뷰 컨트롤러를 연결하여 화면을 구성하며 앞의 내비게이션 컨트롤러와 마찬가지로 직접 화면 전체를 나타내는 것이 아닌, 복합적으로 화면을 구성하는 역할.

Split View Controller (UISplitViewController)
프로젝트 템플릿 선택 단계에서 Master-Detail Application 선택시 생성되는 기본 컨트롤러
목록을 나열하는 마스터 페이지와 그 목록 각각에 대한 세부 내용을 보여주는 디테일 페이지로 구성.
화면 크기에 따라 두 페이지를 하나의 화면에 조합하여 보여줄 것인지 아니면 두 개의 화면으로 나누어 보여줄 것인지 자동으로 처리해줌.
직접적인 화면을 구현하지는 않고, 마스터/디테일 페이지로 사용할 뷰 컨트롤러들을 화면의 크기에 따라 적절히 조합해주는 역할

컨트롤러 내부에 있는 모든 객체의 대장 격인 루트 뷰는, 일반 뷰나 테이블 뷰, 컬렉션 뷰 등 다양한 뷰가 루트 뷰로 지정될 수 있음.
뷰 컨트롤러의 생명 주기는 장면(Scene)의 전환과 복귀에 밀접하게 연관.

뷰 컨트롤러의 상태 네가지

Appearing - 뷰 컨트롤러가 스크린에 등장하기 시작한 순간부터 등장을 완료하기 직전까지의 상태.
Appeared - 뷰 컨트롤러가 스크린 전체에 완전히 등장한 상태.
Disappearing - 뷰 컨트롤러가 스크린에서 가려지기 시작해서 완전히 가려지기 직전까지의 상태.
Disappeared - 뷰 먼트롤러가 스크린에서 완전히 가려졌거나 혹은 퇴장한 상태.

각 상태가 변할때마다 viewWillAppear() / viewDidAppear() / viewWillDisappear() / viewDidDisappear() 메소드 가 호출됨.

특정 화면에 진입했을 때 로그인이나 권한 여부를 체크하고 싶은 경우.
화면이 표시될 때마다 최신 데이터로 업데이트해주고 싶은 경우
메모리 부족 시 가용 메모리를 확보하는 코드를 작성하고 싶은데, 메모리가 부족한지 체크하고 싶은 경우
화면이 완전히 표시되었는지 체크해서 알림창으로 공지를 띄워주고 싶은 경우
사용자가 저장 버튼을 누르지 않아도 지금 화면 상태를 다음에도 유지하고 싶은 경우

뷰 컨트롤러의 생명 주기는 이런 경우들과 관련이 있음 ( 직접적으로가 아닌, '언제'의 문제를 '어디'의 문제로 바꾸어 주는 역할을 함)

본 글은 꼼꼼한 재은씨의 스위프트 시리즈 기본편 을 읽고 정리한 내용입니다

728x90

'ios > 책공부' 카테고리의 다른 글

꼼꼼한 재은씨 기본편 (4)  (0) 2021.10.31
꼼꼼한 재은씨 기본편 (3)  (0) 2021.10.29
꼼꼼한재은씨 기본편 (1)  (0) 2021.10.21
Doit (2)  (0) 2021.06.08
Doit (1)  (0) 2021.06.08