Java/C++과 Object-C 비교하기

Object-C의 특별한 문법 때문에 처음 접근이 어려우신 분들을 위해 간단하게 문법을 비교하여 보았습니다.

Messages ———————————————————————————————————-
일반적으로 객체의 메서드를 호출하는 것을 Object-C에서는 메세지라고 표현합니다.

특정 객체의 메서드를 호출하는데 Java나 C++에서는 다음과 같이 표현합니다.

// Java
obj.method(parameter);

// C++
obj->method(parameter);

하지만 Object-C에서는 다음과 같이 표현합니다.

// Object-C
[obj method:parameter];

처음 볼때는 정말 어색했는데 자꾸 보다 보니깐 이제 좀 괜찮은거 같습니다. 오히려 소스코드를 볼때 메서드라고 확 튀어 보이니 더 좋은것 같기도 하네요.

Interface ————————————————————————————————————
Object-C에서 말하는 Interface 지시자는 Java나 C++에서 말하는 Class를 뜻합니다. 정확히는 선언부분만이라고 말해야겠군요.

좀더 정확히 말해보자면 메서드의 시그네이쳐를 선언해 둔다는 관점에서 Java에서 말하는 Interface와 비슷할 수도 있겠네요.

C++에서는 헤더파일안에 클래스의 선언부분과 같을 수 있겠고요. 구현부분은 .m 파일에서 합니다.

그렇다면 마찬가지로 Java와 C++의 예제 소스 코드를 보도록 할까요?

// Java
class classname extends superclassname {
    // instance variables
    int memberValue;

    // member methods
    return_type method1(param1_type param1, param2_type param2) { ... }
    return_type method1(param1_type param1, param2_type param2) { ... }
}

// C++
class classname : superclassname {
    // instance variables
    int memberValue;

    // member methods
    return_type method1(param1_type param1, param2_type param2);
    return_type method1(param1_type param1, param2_type param2);
}

Java의 예는 클래스의 구현부분이 클래스에 포함됩니다. Java의 Interface와 비교를 해볼려니 억지같고 추상클래스를 만들자니 또 억지 같아서 그냥 저렇게 써두었습니다.

그럼 Object-C의 구현 부분을 한번 볼까요?

// Object-C
@interface classname : superclassname {
    // instance variables
    int memberValue;
}

// member methods
- (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2;
- (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2;
@end

어떤가요? 이해가 되시나요? 그렇다면 이제 클래스의 구현부를 보도록 하겠습니다.

Implementation —————————————————————————————————-
Java의 경우에는 클래스 내부에서 그냥 메서드가 구현되었다고 치고 C++의 예를 한번 살펴 보겠습니다.

// C++
return_type classname::method1(param1_type param1, param2_type param2) {
    ...
}

return_type classname::method1(param1_type param1, param2_type param2) {
    ...
}

Object-C의 문법도 한번 볼 차례군요.

// Object-C
@implementation classname
- (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2 {
    ...
}
- (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2 {
    ...
}
@end

Instantiation ——————————————————————————————————–
Object-C 에서는 객체를 생성하는 방법또한 독특한 느낌을 가지고 있습니다. 마찬가지로 비교를 한번 해볼까요?

// Java
MyObject obj = new MyObject();
obj.init();

// C++
MyObject *obj = new MyObject();
obj->init();

자 그렇다면 Object-C에서는 어떻게 하는지 알아볼까요?

// Object-C
MyObject *obj = [MyObject alloc];
[obj init];

혹은 다음과 같이 한줄로 사용할 수도 있습니다.

// Object-C
MyObject *obj = [[MyObject alloc] init];

어떤가요? 굉장히 색다른 느낌인가요?

지금까지 제 생각에 일반 프로그래밍 언어와 가장많이 다른 부분을 정리해 보았습니다. 이정도면 처음 Object-C를 봤을때의 혼란을 줄어들지 않을까 싶네요.

더 공부해 보고 싶으신 분은 [이곳]을 참고해 보시면 애플에서 잘 정리한 문서를 제공하고 있으니 참고하시면 되겠네요.