본문 바로가기

개발/App Developer

메소드와 메세지

먼저 다음과 같은 메소드가 있다.

  1. - (void)drawImage:(NSImage *)image withFrame:(NSRect)frame inView:(NSView *)view   
  2. {   
  3.     NSSize size = [image size];   
  4.     NSRect rect = NSMakeRect(0, 0, size.width, size.height);   
  5.   
  6.     [view lockFocus];   
  7.     [image drawInRect:frame fromRect:rect operation:NSCompositeCopy fraction:1.0];   
  8.     [view unlockFocus];   
  9. }  

"메소드"란 위의 소스 그 자체라 말할 수 있다. 즉, 메소드 이름, 인자 갯수, 각 인자들의 데이터타입, 리턴값의 데이터타입,

그리고 그 내용으로 구성된다. 위의 소스는 이 모든 것들을 모두 표현하고 있다.

그럼, 이 메소드의 구성 요소들을 용어로 정리해 보자.

 

  설명 예제 값
selector 메소드의 이름 drawImage:withFrame:inView:
method signature (type encoding) 인자들 및 리턴값의 타입정보 v@:{_NSRect={_NSPoint=ff}{_NSSize=ff}}@
implementation 실행코드 함수 포인터

 

 

자, 이제 이 메소드를 다음과 같이 호출해 보자.

  1. [myCell drawImage:myImage withFrame:NSMakeRect(0, 0, 32, 32) inView:myView];  

이렇게 메소드를 호출하는 것을 Objective-C에서는 "메세지를 보낸다(send message)"라고 한다.

메세지는 다음과 같은 네가지로 구성된다.

 

  설명 예제 값
receiver 메세지를 받는 객체 myCell
selector 호출될 메소드의 이름 drawImage:withFrame:inView:
arguments 호출시 넘어가는 인자들 myImage, NSMakeRect(0, 0, 32, 32), myView
return value 호출후 넘어오는 값 void

 

Objective-C 런타임 및 Cocoa 프레임워크에서는 위의 용어들을 다음과 같이 추상화해 놓았다.

 

  Objective-C Runtime Cocoa Framework
selector SEL, @selector() SEL, @selector()
method signature (type encoding) const char * NSMethodSignature
implementation IMP IMP
send message objc_msgSend() NSInvocation,
[NSObject performSelector:withObject:]