'Delegate'에 해당되는 글 2건

  1. 2011.04.09 [펌] Delegate
  2. 2010.06.21 [펌] Delegate

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/델파이가 압승!


출처 : http://blog.naver.com/PostView.nhn?blogId=seogi1004&logNo=110087691887
Posted by 오늘마감

댓글을 달아 주세요

오브젝트C2010. 6. 21. 09:31
[펌] Delegate

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(대리인)이 지정된 함수를 만들고 그 안에서 하고자 하는 일을 하면 된다.

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/델파이가 압승!


출처 : http://blog.naver.com/PostView.nhn?blogId=seogi1004&logNo=110087691887

'오브젝트C' 카테고리의 다른 글

Objective-C에만 있는 상수 및 문법  (0) 2010.06.21
OSX를 VMware 설치후 해상도 변경  (0) 2010.06.21
[펌] Delegate  (0) 2010.06.21
[펌] Key-Value Coding  (0) 2010.06.21
[Objective-C] 동적으로 메소드 호출하기  (0) 2010.06.21
[펌] 메소드의 포인터, IMP란?  (0) 2010.06.21
Posted by 오늘마감

댓글을 달아 주세요

«이전  1  다음»