Objecive-C를 좀 보고, Xcode 좀 봐보고 Interface Builder 좀 보고 Hello, World 같은 거 한 번 만들어보고...
슬슬 깊이 들여다보려고 하면 많이 눈에 띄는 것들이 있다.
어쩌구View, 어쩌구Controller 그리고 어쩌구Delegate 이런것들이다.
그 중에 오늘은 delegate에 대해서 한 번 알아보자. 이건 맥/아이폰/팟용 어플을 개발하는데 꼭 알고 넘어가야 할 부분이다.

뭔가 낯설은 단어 delegate. 그치만 단어 그 자체로 받아들이면 된다. 대리인.
delegate을 처음 접한다면 아직 뭔소린지 잘 감이 오질 않을것이다. 그치만 이 글을 다 읽고 나면, 아! delegate 대리인!이 머리속에 자리잡힐 것이다.

우선 기존 개발을 하시던 분이라면,
서브클래싱, 혹은 클래스를 상속받아서 새로운 클래스를 만들어서 사용하는 것
또는 델파이/C++Builder 쪽에서 보면 Event 같은 것이라고 볼 수 있다.

자 그럼 본격적으로.....
UITextField 클래스를 예로 들어보자. UITextField는 사용자에게 텍스트를 입력받는 기능을 하는 클래스이다.
이 클래스의 인스턴스를 하나 만들고 사용을 하면, text 속성을 통해서 입력받은 텍스트를 알아낼 수 있고 textColor 속성으로 글자의 색을 변경할 수 있는 등의 작업을 할 수 있다.

그런데, 만일 이 TextField에서 사용자가 키보드 입력을 시작했을 때 특정한 일을 하게 하고 싶으면 어떻게 할까?
(델파이/C++Builder 사용하는 개발자라면, Edit1->OnChange=Edit1Change; 로 이벤트 연결을 시켜주면 될 것이다.)
Cocoa에서는 TextField에 delegate(대리인)을 지정해주고 그 delegate(대리인)이 지정된 함수를 만들고 그 안에서 하고자 하는 일을 하면 된다.

// <UITextFieldDelegate>라고 입력해서 MyController가 UITextField의 delegate 역할을 할것임을 알려준다.
@interface MyController: NSObject <UITextFieldDelegate> {
UITextField *textField;
}
@end

@implement MyController
-(id)init {
if(self = [super init]) {
textField = [[UITextField alloc] init];
textField.delegate = self; // MyController를 textField의 delegate(대리인)으로 지정한다.
// MyController가 textField에서 지정된 역할을 처리할 수 있게 되었다는 의미이다. 
}
return self;
}
// UITextFieldDelegate의 Method 구현
// UITextFieldDelegate를 도움말에서 찾으면 어떤 Method들이 있는지 확인해볼 수 있고,
// 거기서 필요한 것들을 구현해주면 된다.
- (void)textFieldDidBeginEditing:(UITextField *)textField {
// 이곳에 textField에서 사용자가 무언가 입력을 시작할 때 
// 처리하고 싶은 일을 처리하면 된다.
}
@end

UITextField의 Instance인 textField는 사용자가 텍스트 입력을 시작하면, delegate가 지정되어 있다면 delegate에게 "야! 사용자가 입력시작했다. 뭐 처리할 것 있으면 해!"라고 알려준다. 그럼 delegate(대리인, 위 예에서는 MyController)는 지정된 함수를 구현하고 있으면 되는 것이다.

필수로 구현해야하는 것들도 있고, 옵션으로 필요한 경우에만 구현해도 되는 것들이 있으니 도움말을 참고해서 필요한 것들을 구현해주면 된다.


자, 그럼 이번에는 내가 만드는 클래스에서도 delegate를 한 번 만들어 사용해보자.
//-------------------------------------- MyTestDelegate interface
@interface NSObject (MyTestDelegate)
-(void) testDidBeginSomething:(UIMyClass*)myClass;
-(void) testDidEndSomething;(UIMyClass*)myClass withArgument:(int)arg;
@end
//-------------------------------------- MyTestClass interface
@interface MyTestClass{
id delegate;
...
}
@property (nonatomic, assign) id delegate;
-(void) myMethod1;
-(void) myMethod2;
...
@end;
//-------------------------------------- MyTestClass implementation
@implement MyTestClass
@synthesize delegate;
-(void) myMethod1 {
...
if(delegate && [delegate respondsToSelector:@selector(testDidBeginSomething:)])
[delegate testDidBeginSomething:self];
...
}
-(void) myMethod2 {
...
if(delegate && [delegate respondsToSelector:@selector(testDidEndSomething:withArgument:)])
[delegate testDidEndSomething:self withArgument:100];
...
}
@end
//-------------------------------------- MyTestController interface
@interface MyTestController {
MyTestClass *test;
...
}
...
@end
//-------------------------------------- MyTestController implementation
@implementation MyTestController
-(id)init {
if(self = [super init]) {
test = [[MyTestClass alloc] init];
test.delegate = self; // MyTestController를 test의 delegate로 지정
}
return self;
}
// MyTestClass의 delegate로써 처리할 method들 구현
-(void)testDidBeginSomething:(MyTestClass*)testClass {
// 이곳에 처리할 일들을 처리하면 됨.
// 처리해야할 것이 없으면 이 Method 자체를 구현 안해도 됨.
}
-(void)testDidEndSomething:(MyTestClass*)testClass withArgument:arg1 {
// 이곳에서도 처리할 일들을 처리하면 됨.
// 처리해야할 것이 없으면 이 Method 자체를 구현 안해도 됨.
}
@end

delegate interface를 선언하는 방법은 위처럼 NSObject (Delegate이름) 을 이용해서 선언할 수도 있고, protocol 을 사용할 수도 있는데, protocol을 사용하는 방법은 다음번에 기회가 되면 설명하도록 하겠다.
혹 지금 당장 궁금하다면, 구글링을 하러 고고! (대략 delegate가 어떤 것인지 감이 잡혔다면 금방 이해가 될 것이다.)

아이폰/팟 어플리케이션에서는 UITableView를 이용하는 경우가 많은데, delegate에 대해 감을 잡고 있으면 쉽게 사용할 수 있다. 도움말에서 UITableView와 UITableViewDelegate를 한 번 찾아서 살펴보면 음..이렇게 구성되어 있구나..라고 생각하면 된다.


갑자기 엉뚱한 소리지만, Cocoa를 공부하면서 다시 한 번 C++Builder(델파이) 사용자로서....C++Builder/델파이가 참 초직관적으로 잘 만들어져있다는 생각이 든다......Visual Studio에서 MFC사용하는 것에 비해서는 두말할 나위도 없이...
다 나름대로의 장단점들이 있겠지만, 직관성에 있어서는 C++Builder/델파이가 압승!


Posted by xiles

댓글을 달아 주세요

  1. 조규남 2009/09/02 16:41  댓글주소  수정/삭제  댓글쓰기

    delegate C#을 본사람이라면 알테고, 자바를 한 사람이라면 더 쉽게 이해할테고
    결국 C라는 낡은 관습에 억매였던 사람들을 위한 설명이군요! 하하

  2. ㅋㅋㅋㅋ 2009/09/14 18:53  댓글주소  수정/삭제  댓글쓰기

    제꺼도해주삼

  3. indian31 2010/07/07 10:42  댓글주소  수정/삭제  댓글쓰기

    요즘 아이폰 개발 공부를 하면서 긴가민가 했던부분인데
    많은 도움이 됐습니다^^ 감사합니다.

Apple 개발자 사이트

우선 가장 많이 들어가게 될 것이고 깔끔한 자료가 많은 곳은  애플 개발자 지원 사이트이다.
아이폰 관련 문서들은 아래 들어가서 보면 된다. 주제별 필요한 문서들 및 Class들의 설명을 찾아볼 수 있다.

iPhone Reference Library

아래 들어가서  Getting StartedRequired Reading 에 있는 것들은 꼭 읽어보기 바란다.


Required Reading
아래 링크는 위 페이지에서 Required Reading 부분에 있는 세 가지인데, 초기에는 자주 볼만한 내용이니 따로 링크해둔다.
iPhone Human Interface Guidelines

Objective-C

지난번에 Objective-C에 대해서 간단히 살펴봤는데(C/C++ 개발자를 위한 Objective-C 살짝 들여다보기1), 
자세히 공부하려면 아래 링크로 가면 된다.

깔끔하게 요약 설명되어 있는 곳

동영상


커뮤니티/사이트

맥부기 아이폰 개발자모임: http://cafe.naver.com/mcbugi  - 나름 활발한 네이버 카페
iPhone Developer Centeral: http://iphonedevcentral.org/  - 동영상 강좌와 활발한 포럼이 있음
http://www.xkompany.com/developer/ - App 등록과정 설명 및 기타 그래픽 관련 예제 사이트 연결되어 있음

간단하게 따라해보기




예제코드


기본적으로 살펴봐야 할 Class들 
처음 iPhone 개발을 접한다면 Cocoa Touch Framework에서 기본적으로 어떤 것들을 먼저 살펴봐야하나 싶을텐데, 기본적으로 아래 것들을 우선 대략 살펴보고 들어가면 편하다. reference에서 아래 Class들에 어떤 속성과 메소드들이 있는지 대략 살펴보면 도움이 될 것이다.

NSObject: 모든 Class의 부모
NSString, NSMutableString: 문자열은 이것으로. MFC에서 CString과 같은 존재랄까..
NSArray, NSMutableArray: 배열은 요걸로 
CGRect
CGPoint
CGSize
CGColor

UIScreen
UIApplication
UIWindow
UIView
UIViewController
UIImageView

Posted by xiles

댓글을 달아 주세요

요즘 아이폰/아이팟용 어플리케이션에 관련한 뉴스도 많고 화제가 많이 되고 있다.
그렇지만 우리나라에서 그다지 많이 사용되지 않는 맥을 기반으로 한 것이기 때문에,
개발 자료라던가 책이 그다지 많지 않다. 본인도 공부를 시작하는 단계이지만, 공부하는 내용들을 하나씩 기록해둘까 한다.

처음에 개발을 하려면, 맥을 사용해본적도 없고 그다지 큰 관심이 없었다면 잠시 멍 할것이다.
개발자들 중에는 윈도우에서는 비쥬얼스튜디오를 많이 사용한다는 것을 모르는 사람이 없겠지만, 맥에서 개발을 하려면 무엇으로 해야 하는가 언어는 어떤 것을 사용할까... 모르는 개발자들도 많을 것이다.
그럼 기본적으로 무엇이 갖추어져야 하는지 알아보자.

1. 맥OS가 설치된 컴퓨터 (Mac Pro, MacBook 또는 iMac 이 필요하다.)

- Mac Pro 는 애플에서 만든 데스크탑 컴퓨터이다.
전문가를 타겟으로 한 컴퓨터이다. 가격대가 350~500만원 정도로 상당하다.
- MacBook 은 노트북
- iMac은 일반 사용자를 타겟으로 하는 데스크탑 컴퓨터이다.
* 해킨토시라고 일반PC에 맥OS를 설치해서 사용할 수도 있지만, 그다지 쉬운 길은 아니니 추천하지는 않는다.
맥 컴퓨터를 살 돈은 죽어도 없고, 시간이 있다면 한 번 도전해보길 바란다.
정보는 http://x86osx.com 에 가면 찾을 수 있다.

2. 개발툴은 무엇을 사용하는가?

Xcode
라는 IDE 툴을 무료로 받아서 설치해 사용할 수 있다.
http://developer.apple.com 에 가서 iPhone Dev Center에 가서 SDK를 받으면 Xcode가 포함되어 있다.
기본적으로 Xcode에서  코딩, 컴파일, 디버깅, 프로젝트 관리를 할 수 있고, 
InterfaceBuilder 라는 것도 같이 설치되는데 이것으로 UI를 구성한다.

3. 언어는 무엇을 사용하는가?

맥 개발은 기본적으로 Objective-C 를 사용한다.
C/C++과 비슷하지만 애플에서 자체적으로 개량한 언어라고 보면 된다.

4. 프레임워크

윈도우에서 비쥬얼스튜디오를 사용하면 MFC를 많이 사용해왔고, 요즘에는 닷넷이라는 프레임워크를 사용한다.
맥에서는 코코아(Cocoa)라는 프레임워크를 사용한다. 예전에는 카본(Carbon)이라는 것을 사용했는데 요즘에는
코코아를 사용한다. 아이폰/아이팟용을 개발할 때는 코코아 터치(Cocoa Touch)라는 프레임워크를 사용한다.
닷넷 컴팩트 프레임워크랑 비슷한 것이라 생각하면 된다.

5. Device

기본적으로 iPhone SDK를 받아서 설치하면 아이폰 에뮬레이션이 설치되므로 기본적으로 개발하면 에뮬레이션을 통해 테스트 할 수 있다. 하지만 모바일 기기는 실제로 해당 사양에서 돌려보는 것이 좋기 때문에 iPod을 가지고 있어야 할 것이다. 한국에서는 아직(2009.6.15) 아이폰이 출시되지 않았기 때문에...

 


6.
개발자 등록


아이폰/아이팟용 프로그램을 개발하고 직접 기기에서 테스트해보려면 애플 개발자로 등록을 해야 한다. 그냥 맥용 어플리케이션을 개발하는 것은 상관없다. 개발자 등록을 하면 아이팟/아이폰용 프로그램을 만들어서 기기에 올려서 테스트 해볼 수 있고, 앱스토어(AppStore)에 올려서 판매를 할 수 있는 권한이 주어진다.

 

* 공짜가 아니라 1년에 10만원 정도의 등록 비용을 받는다.


http://developer.apple.com 에 가면 애플에서 제공하는 많은 자료 및 정보들이 있으니 참고하면 된다. 사이트에서 받을 수 있는 동영상 강좌도 꽤나 괜찮으니 처음 접하는 개발자라면 한 번쯤 보면 좋을 것이다.


Posted by xiles

댓글을 달아 주세요

  1. 2009/10/21 11:35  댓글주소  수정/삭제  댓글쓰기

    비밀댓글 입니다

  2. 2009/12/17 17:02  댓글주소  수정/삭제  댓글쓰기

    비밀댓글 입니다