Kenny's Game Programming

목요일 1월 14, 2010

iPhone Core Application Architecture

Core Application Architecture

애플리케이션이 시작해서 종료하는 시점까지 UIKit 프레임워크는 애플리케이션의 핵심적인 인프라 대부분을 관리한다. 아이폰 애플리케이션은 시스템으로부터 계속해서 이벤트를 받는데 반드시 그것들을 처리해야 한다. 이벤트를 받는 것은 UIApplication 객체가 하지만 이를 처리하는 것은 여러분이 작성한 코드가 담당한다. 이벤트들을 어디서 처리해야 하는지를 이해하기 위해서는 아이폰 애플리케이션의 생명 주기(Life Cycle)과 이벤트 사이클에 대해서 이해할 필요가 있다. 다음 절에서는 이러한 주기와 아이폰 애플리케이션을 개발하는데 사용되는 핵심적인 디자인 패턴에 대해서 설명한다.

 

The Application Life Cycle 애플리케이션 생명 주기


애플리케이션의 생명 주기는 실행과 종료 사이에 발생하는 순차적인 이벤트들을 만들어낸다. 아이폰 OS에서 사용자는 스크린의 아이콘을 선태하여 애플리케이션을 실행한다. 이후에 시스템은 진행 상태를 보여주고 애플리케이션의 main 함수를 호출한다. 이 순간부터 초기화를 위한 작업들이 UIKit으로 넘어오는데, 애플리케이션의 UI를 불러오고 이벤트 루프를 준비한다. 이벤트 루프 과정에서 UIKit은 커스터 객체로의 이벤트 전달과 애플리케이션에서 발생한 명령들을 처리하는 것을 조율한다. 사용자가 프로그램을 종료하는 행동을 취했을 때는 UIKit은 애플리케이션에 이를 알리고 종료 절차를 밟는다.


다음 그림은 아이폰 애플리케이션의 생명 주기를 간략하게 보여준다. 이 도표는 프로그램이 시작해서 종료할 때까지 발생하는 이벤트를 보여주고 있다. UIKit은 애플리케이션 델리게이트에게 특정한 메시지를 보내서 어떤 일이 일어났는지 알려준다. 이벤트 루프 과정에는 이벤트를 애플리케이션의 핸들러에게 그것들을 전달하는데 초기화와 종료를 처리하는 것에 대해서는 별도의 문서에 설명되어 있다. 좀 더 알고 싶다면 나중에 나오는 "초기화와 종료” 와 "이벤트 처리 주기”를 참고하기 바란다.



[그림 1-1] 애플리케이션 생명 주기 (출처 - iPhone Dev Center)



The Main Function 메인 함수

iPhone 애플리케이션에서는 main 함수는 최소로만 사용된다. 대신에, 동작에 필요한 실제적인 작업은 UIApplicationMain에서 이루어진다. 따라서, XCode에서 새로운 아이폰 애플리케이션을 생성하면 모든 프로젝트는 다음과 같은 템플릿 코드가 자동으로 만들어진다. 살펴보면, 메인 함수에는 오직 세 가지 일 밖에 하지 않는다. Autorelease Pool을 생성하고 UIApplicationMain 함수를 호출하고 Pool을 제거하는 것이다. 대부분의 경우는 여러분은 이 코드를 수정하면 안된다.


#import 

int main(int argc, char **argv) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    int retVal = UIapplicationMain(argc, argv, nil, nil);

    [pool release];

    return retVal;
}

[예제 1-1 ] iPhone 애플리케이션의 main 함수


NOTE: AutoReleasePool은 메모리 관리에 사용된다. 이는 코코아에서 작업 수행 중에 만들어진 객체를 자동으로 제거하기 위해 사용되는 매커니즘이다.


위 예제의 핵심인 UIApplicationMain은 초기화를 위해 4개의 인자를 받는다. 비록 이 함수에 전달되는 인자를 바꿀 필요는 없지만, 인자의 용도를 알아둘 필요가 있다. 처음 두 개의 인자는 원래 main에서 받은 것으로 용도는 같다. 세 번째와 네 번 째 문자열 인자는 각각 애플리케이션 객체의 클래스 이름과 애플리케이션 델리게이트 객체의 클래스 이름이다. 애플리케이션 객체의 클래스 이름이 주어지지 않으면 UIKitUIapplication 클래스를 기본으로 사용한다. 애플리케이션 델리게이트 클래스를 명시하지 않으면 UIKit은 애플리케이션의 자원 파일(nib file)에 저장된 객체 중의 하나라고 가정한다. 만약에 뒤의 두 값을 제공한다면 UIapplicationMain 함수는 해당 클래스의 인스턴스를 초기화에 사용한다. , 애플리케이션에서 여러분인 원하는 UIApplication의 서브클래스를 사용하고 싶다면 세 번째 인자에 서블 클래스의 이름을 사용하면 된다.


The Application Delegate 애플리케이션 델리게이트

애플리케이션의 고수준 동작을 모니터링하는 것은 여러분이 작성해야 하는 애플리케이션 델리게이트(application delegate) 객체의 역할이다. 위임(Delegation)UIApplication과 같이 복잡한 UIKit 객체를 상속하는 것을 피하려는 방법이다. 상속하고 메소드를 재정의(override)하는 대신에 원래의 객체는 그대로 두고 커스텀 코드를 위임 객체에 넣는다. 만약 처리해야 할 이벤트가 발생하면 원래의 객체가 정의된 델리게이트 객체에게 메시지를 보내준다. 커스텀 코드를 동작시키고 필요한 동작을 구현하기 위해서 이러한 후킹(hook)을 사용하는 것이다.


Important: 델리게이트(위임) 디자인 패턴은 애플리케이션을 만들 때 느는 수고를 덜어주기 위한 것이므로 이를 이해하는 것이 매우 중요하다. 아이폰 애플리케이션에 사용되는 핵심적인 디자인 패턴에 관해서는 1.6절의 "Fundamental Design Pattern"을 참고하자. 좀 더 자세한 설명은 "Cocoa Fundamentals Guide"를 참고한다.


애플리케이션 델리게이트 객체는 몇몇 중요한 시스템 메시지를 반드시 처리해야 하며 모든 애플리케이션에 반드시 있어야 한다. 이 델리게이트 객체는 UIApplicationDelegate 프로토콜(Objective C)를 구현하는 어떤 것이라도 상관없다. 프로토콜에는 애플리케이션의 생명 주기에 발생하는 이벤트를 후킹(hook)하기 위한 메소드들을 정의하고 있다. 모든 메소드를 구현할 필요는 없지만 4"Handling Critical Application Tasks 중요한 애플리케이션 작업의 처리”에서 설명하는 것들은 구현해야 한다.


UIApplicationDelegate 프����토콜에 대한 보다 자세한 정보는 "UIApplicationDelegate Protocol Reference" 참조 문서에서 찾을 수 있다.


The Main Nib File 메인 자원 파일


The Event-Handling Cycle 이벤트 처리 주기


Fundamental Design Patterns 핵심 디자인 패턴

UIKit 프레임워크의 디자인은 OS X의 코코아 애플리케이션에서 볼 수 있는 많은 디자인 패턴을 사용하였다. 이러한 디자인 패턴을 이해하는 것은 iPhone 애플리케이션을 작성하는데 중요하기 때문에 이들에 대해서 잠시 알아보자. 다음은 핵심 디자인 패턴들에 대한 간략한 개요이다.

 

 

디자인 패턴

설명

Model-View-Controller

MVC 패턴은 코드를 기능적으로 독립적인 세 부분으로 나누는 방법이다. 모델은 애플리케이션의 하부 데이터 엔진을 정의하며 무결성(integrity)을 유지한다. View는 데이터와 무관하게 사용자 인터페이스를 정의한다. Controller는 모델과 뷰 사이의 동기화와 같은 연계를 담당한다.

Delegation

델리게이트(위임) 패턴은 복잡한 객체를 상속하지 않고 수정하는 방법이다. 상속 대신에 복잡한 객체를 있는 그대로 사용하고 별도의 객체, 즉 델리게이트를 통해서 동작을 변경한다. 복잡한 객체는 정해진 시간에 델리게이트의 메소드를 호출해서 커스텀 코드를 실행한다.

Target-Action

컨트롤들은 사용자와의 상호작용을 애플리케이션에 전달하기 위해 Target-Action 디자인 패턴을 사용한다. 사용자가 정해진 대로 컨트롤을 사용하면(버튼을 누른다든지 하는 등의 행동을 통해), 컨트롤은 지정한 대상(Target)에게 메시지(the Action)를 보낸다. 액션 메시지를 받으면 대상 객체(Target)는 그것을 적절하게 처리한다.

Managed memory model

Objective-C 언어에서는 언제 객체를 메모리에서 제거할지 판단하기 위해 참조 카운트 방식을 사용한다. 객체가 처음 생성되면 참조 카운트는 1이다. 이 객체를 사용할 때 retain, release, autorelease 등의 메소드를 통해서 참조 카운트를 늘이거나 줄일 수 있다. 만약 참조 카운트가 0이 되면 Objective-C 실행 환경은 객체의 메모리 해제 루틴(dealloc)을 호출하고 메모리에서 제거한다.

 

[도표 1-1] iPhone 애플리케이션에 사용되는 디자인 패턴


Comments:

Post a Comment:
  • HTML Syntax: Allowed

Feeds

Links

Navigation