Delegation

Delegate의 표기방식

객체를 변수처럼 사용하여 이벤트를 처리한다.
이와 유사하게 클로저(함수형 프로그래밍의 개념)는 함수를 변수처럼 사용한다.

Objective-C 로 작성하는 Cocoa Framework 는 델리게이트로 이벤트 처리를 한다. Legacy 코드가 아직 수요가 있어 몇가지는 소개할 것이다. 아직 산업현장에서는 여전히 예전의 설비가 고장이 나지 않는 이상 계속 작동하며 그런 기기들에게는 오래전에 작성된 코드가 입력되어 운영되고 있다.

Learning Cocoa 한국어판 141p. 의 코드는 델리게이트의 실제 구현이다. 해당 책은 apple에서 한때 직접 번역하여 배포했던 책이며 그 내용은 설명이 자세하지 않아 상당히 난해하다. 객체지향 프로그래밍을 알더라도 그 이상의 이해도를 요구한다. 그러나 이때의 Cocoa 프레임워크도 이제는 여러 기능이 더 추가되어 이 책의 코드는 이미 레거시 코드가 되어 있지만 기초적인 내용은 변함이 없다.

선언
Mydelegate.h

- (BOOL) windowShouldClose: (NSWindow *) sender;

구현

MyDelegate.m

- (BOOL) windowShouldClose: (NSWindow *) sender
{
  int asnwer;

 // Delegate 선언
  answer = NSRunAlertPanel(@"Close", @"Are you certain?", @"Close", @"Cancel", Nil );

 // Delegate 사용
  switch (answer) {
      case NSAlertDefaultReturn:
         return YES;
      default:
        return NO;
  }


객체를 변수처럼 사용하여 그 결과를 받아 switch 흐름으로 넘기는 것을 확인할 수 있다.

objc에서 메소드 앞에 – 는 인스턴스 메소드를 의미하고 + 는 클래스 메소드이다.
클래스 메소드는 상속해서 사용할수 있으며 인스턴스 메소드는 인스턴스를 선언하고 해당 인스턴스에서 사용할 수 있다. 프로토콜은 Typescript에서 인터페이스와 같은것인데 인터페이스라는 용어도 objc에서는 헤더파일을 지칭하기 때문에 사용하는 용어에 주의해야 한다.

추가로 objc에서는 메모리 관리를 기본적인 포인터도 사용하지만 비정형 객체를 할당하여 관리하는데 참조 카운팅 개념을 사용한다. 상게서 92p. 에는 참조카운팅에 대해 설명하고 있는데 마찬가지로 설명은 전혀 친절하지 않으며 소개만 해놓은 정도이다. 객체를 복사하지 않고 한곳에서 공유하려면 retain 하여 참조카운트를 증가시켜야 한다. alloc, init, retain, release, autorelease 에 대한 더 자세한 설명은 objc 관련 자료를 참고하라.

이 외에 objc에서 중요개념은 통지객체를 활용하는 점인데 이건 이제는 흔한 개념이다. 상술한 프로토콜에 근거하여 (개발문서를 보고) 선언해야 한다. 이벤트명은 정해져있고 그 작명에 일정한 규칙은 있다.

이미 오래된 책이므로 컴퓨터 고고학이나 박물학을 전공할 사람에게 양보할것.

Comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다