파헤치기 #3. iOS App Programming Guide (3) Core App Objects <1>


이 문서는 2012. 12. 23. 기준으로 작성된 글이므로, 이후에 애플 문서의 내용이 변경될 수 있습니다.
또한 전문 번역가가 아니기 때문에 의역, 오역의 소지가 다분히 많습니다.
참고하시기 바랍니다.

공개 수배 합니다!
유용한 iOS 개발문서를 함께 번역해 나갈 분들을 찾습니다.
현재도 함께 작업중이신 분들 모두 전문 번역가 아닙니다.
모두 열정과 열의로 함께 작업하고 계십니다.
자신의 재능을 자신뿐만 아니라 또 다른 누군가를 위해서 사용한다면 더더욱 빛이 날 것입니다.
함께하길 원하는 분께서는 덧글 또는 이메일 주시기 바랍니다 🙂

# 오늘의 주제

1. Core App Objects of Your App
2. The Data Model 

파헤치기 세 번째 시간입니다.^^

이번 파트는 낭만떡대 님께서 도와주셨습니다. 번역에 도움주셔서 진심으로 고맙습니다 🙂

자, 그럼 출발해 봅시다^^

## The Core Objects of Your App


Core App Objects

 UIKit은 모든 앱을 위한 기반을 제공합니다. 그러나 앱의 특정한 동작을 위해 커스텀 객체를 정의해야 합니다. 당신의 앱은 iOS와의 중요한 상호작용과 이벤트 루프를 관리하는 UIKit 객체로 구성 되야 합니다. 상속, 딜리게이션 그리고 그 외 다른 테크닉들의 조합을 통해 UIKit에 정의된 기본 동작을 수정할 수 있습니다.
 

UIKit 객체들을 커스터마이징 하는 것뿐만 아니라, 객체들을 직접 정의할 수 있습니다. 앱 개발의 가장 큰 부분은 데이터 객체 구현 입니다. 또한 사용자인터페이스 객체를 제공해야 하는데 다행스럽게도 사용자 인터페이스 쉽게 만들 수 있도록 유용한 클래스들을 UIkit에서 제공합니다.


The Core Objects of Your App

사용자에 의해 앱이 구동 될 때부터 종료될 때까지 UIKit 프레임워크는 앱의 수많은 핵심 동작을 관리합니다. 앱의 심장은 UIApplication 객체이며 이 객체는 시스템으로부터 이벤트를 받고 핸들링 하기 위해 커스텀 코드에 이벤트를 전달합니다. 그 외 다른 UIKit 객체들도 당신의 앱 동작을 관리하기 위한 역할을 담당합니다. 이러한 객체들은 앱의 상세구동을 다루기 위해 비슷한 방법으로 당신의 코드를 호출합니다.

UIKit이 어떻게 커스텀 코드와 동작하는지 이해하기 위해서, 다음 그림과 도표를 보면 도움이 됩니다.

그림 2-1은 앱의 가장 보편적인 객체간의 상호작용을 볼 수 있으며, 테이블 2-1은 각각의 객체들의 역할에 대해 설명되어 있습니다. 그림에서 볼 수 있듯이 iOS 앱은 MVC 디자인 패턴으로 구성되어 있습니다. 이 패턴은 데이터를 표현하기 위해 view로 부터 데이터 객체를 분리 합니다. 이러한 분리는 특히 유니버셜 앱을 만들 때 유용한데, 동일한 데이터 객체를 이용하면서 view들 만 교체하여 사용 할 수 있습니다. (즉 동일한 데이터 모델을 사용해 view만 상황에 맞게 표현해주면 아이폰과 아이패드에서 동시에 동작하는 유니버셜 앱 제작에 편리합니다.)

테이블 2-1 The roll of objects in an iOS


Object(객체)


Description(설명)


UIApplication object

 

당신은 UIApplication 객체를
상속작업 없이 있는 그대로 사용합니다. 이 컨트롤러 객체는 상위계층에서의 앱 동작을 조정하고, 앱 이벤트 루프를 관리합니다. 당신의 커스텀 앱 계층 로직은 UIApplication 객체와 함께 동작하는 앱딜리게이트 객체에 속하게 됩니다.

App delegate object

 


App delegate는 앱 구동

UIApplicationMain function에 의해 생성되는
커스텀
객체입니다.
이 객체의 중요한 역할은 앱
내에서
상태 전이를 관리 하는 일
입니다.
예를
들어,
이 객체는 앱이
처음
구동할 때
(또는
background상태에서
다시 재 구동 될 때) 초기화 및
transitions(특정작업, 변화) 핸들링을 담당합니다.
app delegate가
어떻게
state transitions(상태변화)을 관리 하는지를
자세히
알고 싶다면
“Managing App State Changes.”를 읽어보세요.

 iOS 5.0이후 버전에서는
app delegate를 다른
app-related events(앱 관련 이벤트들)를 다루는데 사용할 수 있습니다.
xCode 프로젝트
템플릿들은 app delegate를 UIResponder의
서브클래스로 정의되어 있습니다. 만약 UIApplication객체가
이벤트를 처리하지 않으면 처리되지 않은 이벤트는 app delegate에게 전달됩니다. 이때 다룰 수 있는 이벤트 종류와
자세한
정보는 “UIResponder Class Reference.”을 읽어보세요.


Documents and data

model objects

 


Data model 객체는 앱의 컨텐츠를 저장합니다.
예를
들어,
은행 앱은 금융거래 정보를 저장하고,
그림그리는 앱은 이미지를 저장하거나 더
나아가
그림이 그려지기 위한 명령 순서를 저장하기도 합니다.(후자의 경우, 이미지 객체는 이미지 데이터를 포함하기
위한 보관장소이므로 데이터 객체입니다.)

데이터 모델 객체의 부분 또는 전체를 관리하기
위해
다큐먼트 객체(UIDocument의 서브글래스 객체)를 사용할 수 있습니다.
다큐먼트 객체의
사용은
필수는 아니지만
파일 또는 파일패키지에 데이터를 그룹화해 저장할 수 있는 편리한 방법을 제공합니다.
더 많은 정보는
“Defining a Document-Based Data Model.”을 읽어보세요. 


View controller objects

 


View
controller objects는 앱의
화면 구성을 관리합니다. 하나의 view controller는
하나의 view 와 그 view의 sub-view들을 관리 합니다. 그것들이 화면에 보여지는 순간, 뷰 컨트롤러는 그것들을 앱 윈도우에 올려서 화면에 보여지도록 합니다.

UIViewController
클래스는 view
controller 객체들의 기본 클래스 입니다. UIViewController는 view를 위한 기본 기능을 제공하고 화면에 표현하고, 디바이스의
로데이션에 대응해 view들을 로테이션 하는 역할을 담당하며 그 외 추가의 표준 시스템 행동을 제공합니다. UIKit과 다른 프레임 워크들은 이미지 픽커, 탭바, 네비게이션과 같은 기본 시스템 인터페이스의 동작을 위해 추가의 view
controller 객체들을 제공하고 있습니다. 더 많은 정보를 원하면 "View Controller Programming Guide for iOS"를 읽어보세요.


UIWindow object

 

UIWindow
객체는 스크린에 보여지는 view들을 관장합니다. 대부분의 앱들은 하나의 윈도우를 가지고 있고
그 윈도우는 메인 스크린이 됩니다. 그러나 몇몇 앱들은 외부 디스플레이에 보여지는 컨텐츠들을 위해 추가의
window를 가지는 경우도 있습니다.(외부 모니터 등 외부 화면 출력을 위해)
view를 교체하기 위해 view controller를
사용해 window에 올려진 view들을 변경해야 하고 절대로
윈도우 자체를 교체하면 안됩니다.
덧붙여, 뷰들을 관리하기 위해서 윈도우들은 뷰와 뷰컨트롤러들에게
이벤트들을 전달해주는 UIApplication 객체와 함께 작동합니다. 


View, control, and layer objects

 


View와 Control은 컨텐츠의 시각적
표현을 위해 사용 됩니다. View는 지정된 직사각형 영역에 컨텐츠를 그리고(묘사하고) 그 영역에서 발생하는 이벤트에 응답하는 객체입니다. Control은 버튼, 텍스트필드 같은 특별한 타입의 view들을 의미 합니다.

UIKit
프레임 워크는 많은 종류의 표준화된 view들을 제공합니다. 또한
UIView(또는 그 하위 클래스)를 직접 상속하여 당신만의 커스텀 view를 정의 할 수도 있습니다.

 또한 뷰와 컨트롤들이 결합되는 것과 마찬가지로, 앱들은 코어 애니메이션 레이어와 뷰들이 결합될 수 있습니다. 레이어 객체들은 눈에 보이는 컨텐츠를 표현하기위한 데이터 객체입니다. 뷰들은 레이어를 짧은시간안에 효율적으로 그들의 컨텐츠를 렌더링하기 위해서 사용합니다.커스텀 레이어 객체를 추가하여 복잡한 애니메이션을 구현하는데 사용할 수 있습니다.

하나의 iOS 앱이 다른 앱들과 구분되는 것은 데이터를 어떻게 관리하고 사용자에게 데이터를 어떻게 보여주는가에 따라 달려있습니다. UIKit과 상호작용하는 대부분의 객체들은 당신의 앱을 결정짓지 못하지만 앱의 동작을 개선할 수 있습니다. 예를 들어, 앱 딜리게이트의 메서드가 앱 상태 변화에 대한 알림을 준다면 그에 상응하여 당신의 커스텀 코드가 적절한 반응을 할 수 있을 것입니다.

위의 클래스들에 대한 정보를 얻고 싶다면 해당 클래스 레퍼런스를 보세요. 또한 어떻게 이벤트들이 동작하는지에 대한 flow정보와 그 flow 안에서 당신의 앱이 어떤 반응을 해야 하는지에 대한 정보를 얻고 싶으면 "App States and Multitasking"부분을 참고하세요

## The Data Model

 

The Data Model

앱의 데이터 모델은 데이터 구조와 항상 같은 상태로 데이터를 유지하는데 필요한 작동 로직으로 구성됩니다. 데이터 모델을 앱의 사용자 인터페이스로부터 완전히 분리 하기 싫겠지만 데이터 모델 객체의 구현은 특정 view 또는 view contoller에 의지하면 안되고 분리 되어야 합니다. 사용자 인터페이스로부터 데이터를 분리 시키면 유니버셜 앱(아이폰과 아이패드을 모두 지원하는 앱)을 만들기 쉬워지고, 코드를 부분적으로 재사용하기 좋게 해줍니다.

만약 데이터 모델을 아직 정의 하지 않았다면, iOS frameworks가 데이터 모델을 분리하도록 도와 줄 것입니다. 다음에 나오는 섹션은 데이터모델의 특정 타입을 정의할 때 당신이 사용할 수 있는 객체들을 보여줍니다.


Defining a Custom Data Model

커스텀 데이터 모델을 정의할 때, 상위 레벨 구조를 표현하기 위한 커스텀 객체를 생성하십시오. 그러고 시스템에서 제공하는 객체의 이점을 잘 활용하여 더욱 간편하게 데이터 타입을 만들도록 하세요. Foundation framework는 표 2-2에 나열되어있는 것과 같이 객체지향적으로 문자열, 숫자 그리고 많은 종류의 간단한 데이터들을 관리하기위한 객체들을 제공합니다. 시간도 절약되고, 많은 수의 시스템 루틴들이 기본 객체들을 사용하기 때문에 이 객체들을 사용하는 것이 선호됩니다.

테이블 2-2 Data classes in the Foundation framework


Data

Class

Description

String and text

NSString
(NSMutableString)
NSAttributedString
(NSMutableAttibutedString)

iOS에서 string은 Unicode기반입니다. string클래스들은 다양한 방법으로 string을 생성하고
조작하는 방법을 제공합니다.
Attributed string클래스는 string을 꾸밀 수 있도록
해줍니다(단, 반드시
Core Text와 결합하여 사용하여야 합니다)

Numbers

NSNumber
NSDecimalNumber
NSIndexPath

숫자와 관련된 정보를 저장하고 싶을 때는
number클래스를 이용하세요. NSNumber클래스는 정수(Integer), 실수(floating-point values),
Booleans, 문자(char) 타입을 표현할 수 있습니다. NSIndexPath 클래스는 주로 계층적인 리스트에서 다중 레이어 선택을 명시할 때 주로 사용되는 숫자들의
순서를 저장합니다(주로 테이블뷰에서 많이 사용하죠).

Raw bytes

NSData(NSMutableData)
NSValue

바이트 데이터(Raw streams of bytes)를 저장할 때는 data object를 사용하세요. 데이터 객체는 아카이브 형식으로
객체를 저장할 때도 사용됩니다. NSValue 클래스는 카테고리를 사용하여 확장할 때 또는 point나 rectangle과 같은 데이터 타입을 저장하는데 사용됩니다.

Dates and times

NSData
NSDataComponents

타임스탬프, 달력날짜, 다른 시간관련
정보를 저장할 때 사용하세요.

URLs

NSURL

네트워크 자원의 참조하는 것 뿐만 아니라
URLs 은 파일 저장 위치(file path)를 저장하는데도 사용할 수 있습니다. NSURL클래스는 심지어 파일에 관련된 속성들을 얻어오고 수정할 수 있도록 지원합니다.

Collections

NSArray
(NSMuatableArray)
NSDictionary
(NSMuatubaleDictionary)
NSIndexSet
(NSMutableIndexSet)
NSOrderedSet
(NSMutableOrderedSet)
NSSet
(NSMuatableSet)

collection들은 관련된 객체들을 그룹화해 한곳에 저장할 때 사용하세요. Foundation framwork는 여러 다른 타입의 콜렉션 클래스들을 지원해 줍니다.
 

-         
NSInteger/NSUInteger : 부호가 있는 또는 없는 정수(시스템 아키텍쳐에 따라서
사이즈가 결정됨).
-         
NSRange: 영역을 지정하는 구조체. 예를 들어, 문자열 내에서 선택된 문자들의 영역을 지정할 수 있음.
-         
NSTimeInterval: 주어진 시간 간격의 초 단위 수
-         
CGPont: 위치를 정의하는 x,y좌표
-         
CGSize: 가로와 세로의 넓이 좌표값
-         
CGRect:  사각형 지역을 정의하는 값(CGPoint 와 CGSize를 가진다)
 
물론, 커스텀 데이터 객체는 스칼라 값과
객체변수를 혼합해서 클래스의 멤버 변수로 선언 가능합니다. Listing 2-1은 간단한 사진첩을 위한
클래스 구현부분 입니다. 이 클래스의 인스턴스는 “이미지
배열”, “이미지에 대한 익덱스번호”, “사진첩 제목” 과  “수정가능여부(스칼라 변수인 BOOL)”를 갖습니다.

Listing 2-1 Definition
of a custom data object


주의 : 데이터 객체를 정의할 때, 어떤 멤버변수든간에 객체에 접근하려는 클라이언트트에게 노출시키기 위해서 프로퍼티 선언을 해줄 것을 강력히 권고합니다. 구현파일에 이 프로퍼티를 결합해 주는 것은 당신이 요청하는 속성에 따라서 적절한 접근 메서드를 자동으로 생성해 줍니다. 이것은 객체의 관계가 적절하게 유지되는 것과 적절한 시기에 객체가 제거되는 것을 보장합니다.

당신의 커스텀 객체를 다룰 때 되돌리기 기능이 어떻게 동작할 것인가 고려해 보십시오. 되돌리기 기능을 지원한다는 것은 당신의 객체가 바꾼 것을 깨끗하게 되돌린다는 것을 의미합니다. 만약 당신의 객체가 복잡한 로직을 포함한다면, 당신은 되돌리기 쉽도록 하는 것을 고려해야 합니다. 아래에 당신의 객체에 되돌리기 기능을 구현하기 쉽도록 하는 팁들이 있습니다.

-         
대칭이 되도록 메서드들을 구현 하십시오. 예를 들어, 아이템을
더하는 메서드를 구현하면 아이템을 빼는 매소드도 같이 구현하세요
-         
멤버 변수의 값을 바꾸는 코드를 동작 로직에서 제거하십시오.
-         
많은 단계를 거치는 액션의 경우에는 NSUndoManager 객체를
사용하여 단계를 통합하도록 하십시오.
 
되돌기리 기능을 제공하는 방법에 대한 더 많은 정보를 얻고 싶으면 “Undo Architecture”를 참고하세요.


Defining a Structured Data Model Using Core Data.

Core Data는 객체를 영구적으로 저장할 수 있도록 해주는 프레임워크 입니다. Core Data는 MVC디자인패턴에서 model data를 파일로 영구 저장하고 다시 읽어 들일 수 있도록 해줍니다. 이것은 아카이빙과(“Archives and Serializations Programming Guide를 보세요) 비슷하지만 더 많은 기능을 제공 합니다.
-         
Core Data는 모델 객체의 모든 변화를
관리하기 위한 인프라스트럭쳐 입니다. Core Data는 undo(되돌리기), redo(되돌긴거 취소하기) 기능을 제공하며, 객체들의 상호관계를 유지하도록 지원해 줍니다.
-         
코어데이터는 언제든지 메모리 내에 있는 모델 객체의 일부분을 유지할 수 있도록 해줍니다. 이것은 iOS 앱에서 굉장히 중요합니다.
-         
코어데이터는 모델 객체의 구조를 표현하는데에 사용됩니다. 당신의
모델 클래스의 주요 기능과 그 관계에 대해서 GUI 기반의 편집기를 통하여 정의 할 수 있습니다. 이는 기본값과 값의 범위 등을 설정 등을 포함아여 강력한 기능을 무료로 사용할 수 있도록 제공합니다.
-         
코어데이터는 당신의 객체를 수정한 것에 대하여 분리된 상태로 유지할 수 있습니다. 이는 당신이 원한다면 유용하게 쓰일 수 있씁니다. 예를 들어, 사용자가 하나의 뷰에서 수정을 해도, 다른 뷰에서는 수정한 것의
영향을 주지 않게 할 수 있습니다.
-         
또한 데이터의 버져닝과 마이그레이션을 지원합니다. 이 기능은 예전 데이터를 현재의 버전으로
업그레이드를 하기 쉽게 도와 줍니다.
-         
데이터를 iCloud에 쉽게 저장할 수 있도록 해주며, 다양한
디스바이스에서 접근 할 수 있도록 해줍니다.
 
Core Data 에 대한 자세한 정보는 “Core Data
Programming Guide”를 참고 하세요


Defining a Document-Based Data Model

Document-based 데이터 모델은 디스크에 파일을 저장할 수 있는 편리한 방법입니다. 이 타입의 데이터 모델에서는, 당신은 디스크상의 하나의 파일(또는 하나의 파일 패키지)에 구성되어있는 도큐먼트 객체를 사용합니다. 그 도큐먼트 객체는 파일에 읽기 쓰기에 대해 반응하는 것이 가능하며, 도큐먼트 컨텐츠를 화면에 보여줄 수 있도록 뷰 컨트롤러들과 동작할 수 있습니다. 도큐먼트 객체의 원래 사용목적은 사용자 데이터를 포함한 파일을 관리하는 것입니다. 예를 들어, 앱은 각각의 도큐먼트 객체가 각각의 텍스트 파일을 관리하기 위하여 텍스트 파일들을 만듭니다. 그러나 당신은 도큐먼트 객체를 보호하여야 할 앱 데이터를 파일로 저장할 때도 사용할 수 있습니다.

그림 2-2는 도큐먼트, 파일, 객체 간의 관계를 보여줍니다. 예외 없이 각각의 document는 다른 document와 직접적으로 연결되지 않습니다. 도큐먼트는 하나의 파일(또는 파일 패키지)를 관리하며, 파일 내부의 데이터를 메모리와 연결하는 역할을 합니다. 왜냐하면 파일 내부의 컨텐츠는 유일하고, 각가의 도큐먼트에 연관된 데이터 구조도 유일하기 때문입니다. 

UIDocument 클래스를 사용하여 당신의 iOS 앱에 도큐먼트 객체를 구현하십시오. 이 클래스는 도큐먼트의 측면에서 파일 관리에 필요한 기본 기반을 제공할 것입니다. UIDocument가 가지는 다른 장점들은 아래와 같습니다.

- 적당한 시점에 도큐먼트 컨텐츠가 자동으로 저장되도록 지원한다.

- iCloud에 저장된 도큐먼트들을 관리할 할 수 있습니다. 버전 충돌을 위한 방법도 제공합니다.

- 되돌리기 기능을 제공합니다.

UIDocumet를 이용한 다큐먼트 기반의 앱을 구현해야 하는지 알고 싶다면  “Document-Based App Programming Guide for iOS”를 보세요. 


Integrating iCloud Support Into Your App

데이터를 저장하는 방법과 관계 없이 iCloud는 사용자의 모든 단말에서 데이터를 사용할 수 있게 만드는 가장 좋은 방법입니다. 데이터를 앱의 샌드박스 디렉토르에 저장하는 것 대신 사용자 iCloud저장소에 저장 할 수 있습니다.  그런데 주의할 점은 아이클라우드에 저장하게 되면 파일에 대한 멀티플 엑세스가 가능해지기 때문에 추가의 작업이 필요합니다.

- Document 기반의 앱은 UIDocument 클래스를 통해 iCloud에 접근 할 수 있습니다. UIDocument클래스를 이용하면 iCloud 기반의 파일을 다룰 때 복잡한 인터랙션을 쉽게 다룰 수 있습니다.

- Core Data 를 사용한 앱 또한 Core Data Framework를 이용하면 자동으로 사용자의 모든 단말계정에 데이터를 저장하고 관리 할 수 있습니다.

- 만약 파일 관리를 위하여 커스텀 데이터모델을 구현한다면, 파일이 변경된 것과, 사용자의 다른 기기에 변경된 점을 반영하기 위하여 file presenter와 file coordinator를 사용할 수 있습니다.

- 설정 또는 자주 변경되지 않는 데이트를 공유하고 싶다면, NSUbiquitousKeyValueStore 객체를 사용할 수 있습니다. 이 객체는 문자열, 숫자, 날짜 등 간단한 데이터를 공유할 수 있게 해줍니다.

iCloud를 지원하는 앱을 만들기 위한 더 많은 정보는 “iCloud Design Guide”를 읽어보세요

후아~ 힘드네용 !!!

번역하느라 고생하신 낭만떡대님께 다시 한 번 진심으로 감사의 말씀 전합니다 🙂

by yagom

facebook : https://facebook.com/yagompage
twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   

 


댓글 남기기

Close