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를 봤을때의 혼란을 줄어들지 않을까 싶네요.
더 공부해 보고 싶으신 분은 [이곳]을 참고해 보시면 애플에서 잘 정리한 문서를 제공하고 있으니 참고하시면 되겠네요.