Tag Archives: Class

[iPhone] Object-C : Class Method VS Instance Method

Object-C 에서의 메서드 구현에는 정확히 딱 두가지가 있는것 같습니다.

바로 Class Method와 Instance Method인데요. 이 두가지 메서드는 Java로 따져보면 static 메서드와 일반 메서드로 구분될 수 있겠다고 생각합니다.

우선 테스트 코드를 작성하기 위해 Mac OS X이하의 Command Line UtilityFoundation Tool 프로젝트를 생성합니다.

보통 C++하실때 보는 콘솔 어플리케이션쯤으로 생각하시면 되겠네요.

우선 MethodTest라는 Object-C 클래스를 추가합니다.

MethodTest.h
[code]#import <Cocoa/Cocoa.h>

@interface MethodTest : NSObject {

}
+ (void)printWithClassMethod;
– (void)printWithInstanceMethod;

@end[/code]
MethodTest.m
[code]#import “MethodTest.h”

@implementation MethodTest

+ (void)printWithClassMethod {
    NSLog(@”Running with class method”);
}
– (void)printWithInstanceMethod {
    NSLog(@”Running with instance method”);
}

@end[/code]
이제 main 함수에 다음과 같이 기록해 봅시다.
[code]#import <Foundation/Foundation.h>
#import “MethodTest.h”

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here…
    [MethodTest    printWithClassMethod];
    MethodTest *mt = [MethodTest alloc];
    [mt printWithInstanceMethod];
   
    [pool drain];
    return 0;
}[/code]
감이 오시나요? printWithClassMethod는 클래스를 인스턴스화 하지 않고도 호출할 수 있는 메서드입니다.

하지만 printWithInstanceMethod는 꼭 초기화 된 상태에서 호출해야만 하죠.

이를 자바로 한번 풀어보면 다음과 같겠죠.
[code]class MethodTest {
    public static void printWithClassMethod() {
        System.out.println(“Running with class method”);
    }
    public void printWithInstanceMethod() {
        System.out.println(“Running with instance method”);
    }
}[/code]
Class Method와 Instance Method의 차이 이해 되시죠? ^^

[iPhone] Object-C : Class, Object, Message

Object-C는 아이폰 개발에 사용되는 언어입니다.

C와 C++의 중간 개념이라고들 하던데 확실히 C언어에 객체의 개념을 추가하고 적절한 라이브러리가 추가된 모습이더군요.

공부하면서 한번 정리를 해보도록 하겠습니다.

객체를 생성하기 위해 클래스를 선언하는데 일반적으로 C++을 해보셨던 분들이 이해하기 좀 어려운 모습을 가지고 있습니다.

XCode에서 New -> New File 항목에서 Object-C Class를 선택하여 클래스 파일을 추가합니다.

Foo 라는 클래스를 만들어 보면 Foo.h와 Foo.m 파일이 생성됩니다.

Foo클래스에 변수와 메서드들을 추가해 봅시다. 다음과 같은 방법으로 합니다.

Foo.h

Interface라는 이름을 가지고 선언하긴 하지만 엄연히 클래스를 선언하는 구문입니다.

Foo라는 클래스는 NSObject를 상속받았습니다. NSObject는 NextStep에서 만든 최상위 클래스입니다.

모든 NS로 시작하는 클래스들은 모두 최상위로 NSObject를 상속받습니다. 마치 자바의 Object와 같네요.

또한 NSTextField형의 textField라는 이름의 인스턴스변수(맴버변수)를 선언하였습니다.

IBOutlet은 외부의 다른 객체를 가리킬수 있는 변수를 뜻합니다.

추후에 올려보겠지만 UI상의 컴포넌트 객체들과 변수를 연결할 수 있습니다.

또한 -로 시작하는 줄들은 메서드들입니다. seed메서드만 보면 IBAction을 반환하고 id타입의 sender를 첫번째 인자로 입력 받습니다.

위의 클래스를 구현하면 다음과 같이 합니다.

Foo.m

위와 같이 메서드의 몸체를 구현할때 맴버 인스턴스 변수인 textField에 마음껏 접근할 수 있습니다.

객체 자기 자신을 가르킬 경우에는 자바나 C++에서는 this를 사용하지만 여기서는 self를 사용합니다.

인자를 받을 넘길때도 특이한점이 있군요. 두개 이상의 인자를 받을경우에는 굉장히 복잡해 집니다.

위와 같은 메서드는 addNumbers:rightNumber: 라고 부릅니다. 보통의 프로그래밍을 하던 느낌으론 굉장히 의문이 가는 부분입니다.

addNumbers는 int형 값을 반환하는 메서드입니다. 첫번째 인자는 int형 left 변수입니다.

그렇다면 rightNumber는 저게 뭘까요.  보통 인자를 가진 메서드를 셀렉터(Selector)라고 부릅니다.

위의 코드를 이렇게 바꿔 보면 이해가 쉬울것 같네요.

실제로 사용되는 인자의 이름은 left, right이지만 rightNumber와 같은 식의 나누어진 셀렉터를 사용하여 메서드의 인자의 역할을 더욱 분명히 할 수 있는 장점(?)이 있습니다.

이제 함수를 호출하는 방법을 알아보겠습니다.

Object-C에서 메서드 호출을 메세지를 보낸다고 표현합니다. 위의 경우에는 다음과 같이 생각하시면 될 것 같네요.

위와 같이 동적으로 메모리를 잡고 array변수로 가리키게 합니다. 이제 초기화 하는 init 메세지를 보내보겠습니다.

array는 리시버(receiver)라고 합니다. 이 리시버에 init메세지를 입력합니다.

다음과 같이 위의 두줄을 한줄로 사용할 수도 있습니다.

인자를 입력할 경우에는 다음과 같이 사용합니다.

다수의 인자를 입력할때는 다음과 같은 방법으로 합니다.

위에서 언급했듯이 insertObject는 메서드명이기도 하면서 변수를 가리키는 셀렉터이기도 합니다.

다음에는 아이폰으로 간단한 예제를 만들어 올리도록 하겠습니다.