본문 바로가기

개발/Objective-C

Object-c에서의 delegate

Object-C 프로그래밍에 있어서 델리게이트는 매우 중요한 요소라고 할 수 있다. 게다가 이 델리게이트는 아이폰 애플리케이션의 생명주기와도 깊은 연관이 있다. 델리게이트가 없다면 생명을 잃어버린 애플리케이션이라고 말 할 수 있다.



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



그림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 <UIApplicationDelegate> {
        UIwindow *window;
        ProjectNameController *viewController;
}


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


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

 
* 많은 내용이 책 또는 검색 후 개인적인 생각을 포함하여 개인용도로 쉽게 찾아보기 위해 정리한 것입니다.
본의 아니게 정리도중 출처를 읽어버린 경우가 있어 출처를 밝히지 못한 곳도 있으니 양해바랍니다.
문제가 될 경우 댓글 달아주시면 삭제/보완처리를 하겠습니다.
감사합니다.

'개발 > Objective-C' 카테고리의 다른 글

OBJECT-C 아키텍쳐  (0) 2010.09.06
delegate  (0) 2010.09.06
retain 관련 알아둘것  (0) 2010.09.06
프로퍼티  (0) 2010.09.01
object - c Initialization  (0) 2010.09.01