본문 바로가기

Dev.iOS/Objective-C

[Objective-C] 3. 카테고리와 프로토콜

Chapter 3. 카테고리와 프로토콜

카테고리를 사용하여 모듈 방식으로 클래스에 메서드를 추가하자.
프로토콜을 사용하여 다른 사람들이 구현할 메서드의 표준화된 목록을 만들자.

카테고리란 무엇인가( What )
카테고리는 클래스 정의를 그룹짓거나 연관된 메서드를 묶어 쉽게 모듈화할 수 있게 해준다.
또 원본 소스코드에 접근하거나 서브 클래스를 생성하지 않고도 현존하는 클래스의 정의를 쉽게 확장할 수 있다.

어떻게 사용하는가 ( How )
@interface Fraction (MathOps)
MathOps라는 카테고리를 만들었다. 인터페이스 지시어를 써주고 클래스 명 다음에 카테고리명을 적어주는 방식이다.
이를 구현할 때도 마찬가지로,
@implementation Fraction (MathOps)
라고 해준 다음에, 카테고리에서 선언한 메소드들을 구현해주면 된다. 물론 하나의 구현파일에 모든 메소드들을 구현할 수 있다.

카테고리에는 확장하고자 하는 클래스의 부모 클래스 명, 그리고 그 클래스에 속해있는 변수들을 명시하지 않는다. 명시하려고 하면 syntax error가 발생한다. 컴파일러는 이미 확장하고자 하는 클래스의 존재를 알고 있고, 이 카테고리가 해당 클래스를 확장한다는 것을 알기 때문이다.

이름없는 카테고리도 생성할 수 있다.
이는 이름있는 카테고리에서는 불가능한 인스턴스 변수를 확장하는데 사용된다.
물론, 메서드도 선언할 수 있으며 선언된 메서드는 분리된 구현 부분이 아니라 클래스의 메인 구현 부분에서 빠짐없이 구현되야 한다.

카테고리는 클래스에 있는 메서드를 재정의할 수는 있지만 이것은 나쁜 프로그래밍으로 간주된다. 카테고리에서 메서드를 재정의하게 되면 원래 메서드에 접근할 방법이 사라지기 때문이다. 따라서 카테고리에서 재정의를 할 경우 원래 메서드의 기능을 모두 구현해줘야 한다. 이럴바에는 서브클래스를 생성하는 것이 올바른 방법일 것이다. 서브클래스의 super를 사용하면 되니까 말이다. 클래스에 카테고리로 새 메서드를 추가하면 해당 클래스 뿐만 아니라 서브클래스에도 영향을 미치게 된다. 또한 특정 객체에 대한 카테고리의 이름은 유일무이해야 한다.


프로토콜이란 무엇인가 ( What )
프로토콜은 클래스 사이에서 공유되는 메서드 목록이다. 프로토콜에 나열된 메서드들은 해당하는 구현 부분이 없다. 다른 사람이 구현하도록 되어있다. 즉, 포로토콜은 특정 이름과 관련된 메서드 모음을 정의하는 방법을 제공하는 것이다. 프로토콜에 작성된 메서드들은 보통 문서화되어 어떤 식으로 동작하는지 명시되어 있다. 선택적으로 구현할 수 있거나, 반드시 구현해야 하는 메서드의 집합이다.


어떻게 사용하는가 ( How )
프로토콜 이름 앞에 @protocol 지시어를 붙이면 된다.
그리고 인터페이스 부분에서 한 것과 동일하게 메서드를 선언하면 된다.
마침도 똑같이 @end를 통해서 한다.

클래스에서 프로토콜을 받아들이려면 컴파일러에게 프로토콜을 받아들인다고 알려줘야 한다.
@interface 줄에 프로토콜 이름을 꺾쇠로 감싸주는 것을 약속으로 한다.
ex) @interface Animal: NSObject <Human>
프로토콜에서 선언된 메서드들을 다시 클래스 헤더 파일에서 선언할 필요가 없다.
물론, 프로토콜을 받아들이기 위해서는 구현 부분에서 구현해야 한다.

프로토콜을 정의할 때, 이미 존재하는 프로토콜을 확장해도 된다.
프로토콜을 두 클래스 간의 인터페이스라고 생각해도 되겠다.


델리게이션
특정 이벤트의 응답으로 취하는 특별한 동작이나 특정 속성을 정의하는 등의 일을 델리케이트 클래스가 처리하면, 클래스를 더 일반적으로 정의할 수 있다. Xcode에서 iOS Application 프로젝트를 생성하게 되면 Xcode가 AppDelegate.h 파일과 AppDelegate.m 두 개의 파일을 생성해주는데 이 클래스가 delegation이 적용된 대표적인 예이다.


chapter 3. end