최상단 광고

2012년 4월 8일 일요일

델리게이트

애플리케이션의 생명주기.
어떤 프로그래밍 언어이든지, 프로그램이 소스 코드를 통하여 메모리에 적재되고, 각자 정해진 위치에서 역할을 수행하고, 필요가 없어졌을 때 메모리에서 사라지는 생명주기 싸이클이 존제한다. 아이폰 프로그램에서도 예외라고 할 수는 없다.


그림1. 아이폰 애플리케이션 생명주기.

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


애플리케이션 델리게이트.
애플리케이션 델리게이트(application delegate) 객체의 역할은 애플리케이션의 동작을 모니터링 하는 것이다. 델리게이트라함은 위임이라는 뜻을 가지고 있는데, 의미 그대로 메소드의 역할을 위임하는 것이라고 할 수 있다. 변수의 경우, 각 변수가 가지고 있는 값들을 어떤 특졍한 패턴, 함수에의해 변형되어, 개발자의 의도대로 결과 값을 얻을 수가 있다. 이런 특징적인 역할을 하는 함수(모듈, 객체, 메소드라고 정의할 수 있는)들을 특정한 조건이나, 의도를 가지고 묶음으로 만들어내 좀더 간편하게 사용하도록 하는 것이 델리게에트를 사용하는 목적이라고 할 수 있다. 또 한가지 델리게이트를 사용하는 이유는 UIApplication 과 같은 복잡한 객체를 상속하는 것을 피하고, 메소드를 재정의 하지 않음으로써 좀더 객체 지향적인 프로그래밍을 할 수 있도록 도와주게 된다.


그림2. 액션과 각 객체의 실행.

애플리케이션이 어떠한 액션을 만났을때, 그 액션에 맞는 객체의 메소드가 실행이 되게 된다. 이 객체는 객체에서 정의된 액션에 대해서만 행동을 하게 된다. 다양한 액션을 받아들이기 위해서는 그 액션에 대해서 정의를 해 주거나, 그 액션을 가지고 있는 상위 클래스를 상속 받아야 한다. 위 그림에서 action A 를 받아서 행동할 수 있는 것은 object A 뿐이다. action B 는 object B, action C 는 object C 로만 반응이 가능하다. 만약 action A 를 실행해야 하는 상황에서 action B 가 발생을 한다면 object A 는 적절한 대응을 할 수가 없다. action B 에 대응하기 위해서는 object B 가 상속받은 클래스를 동일하게 상속받아야 한다.


그림3. 델리게이트를 통한 확장.

이런 불필요한 자원의 낭비를 줄여주는 것이 델리게이트이다. 델리게이트는 메소드와 메소드를 이어주는 연결고리라고 할 수 있다. 필요한 메소드를 상속을 통한 확장이 아니라, 연결의 의미에서 전달만 하게 된다. 위의 그림처럼 action A, B, C 를 따로 따로 정의해서 사용하는 것이 아닌, object A, B, C 를 하나로 묶어주고, 연결해 줌으로써 좀더 다양한 action에 대응할 수 있는 유연성을 제공한다. 불필요한 상속을 줄여주는 것이다.


델리게이트의 선언.
델리게이트는 다음과 같이 선언되고, 사용할 준비가 된다.

ProjectNameViewController.h 파일
@Interface ProjectNameAppDelegate : NSObject  {
        UIwindow *window;
        ProjectNameController *viewController;
}


ProjectNameViewController.m 파일
- (void)applicatoinDidFinishLaunching: (UIApplication *)application {
        // TODO something
}


델리게이트는 아이폰 프로그래밍에 있어서 뿐만아니라, 객체지향 프로그래밍에 있어서 중요한 요소임에 분명하다. 그 개념이 쉽게 이해가 되지 않을 수 있겠지만, 꼭 이해하고, 사용할 줄 알아야 한다.

댓글 없음: