델리게이트 패턴이란? - 기능의 위임
델리게이트 패턴은 객체지향 프로그래밍에서 하나의 객체가 모든 일을 처리하는 것이 아니라 처리해야 할 일 중 일부를 다른 객체에 넘기는 것을 말합니다. 대리자(delegate)를 지정하여 이벤트 처리를 위임하고, 실제로 이벤트가 발생하면 위임된 대리자가 콜백 메소드를 호출해줍니다. 이는 효율성 관점에서 중요합니다. 기능을 위임할 수 있는 객체가 있다는 것은 그만큼 직접 구현해야 하는 부분이 적다는 뜻이기 때문에 큰 규모의 프로그램을 빠르게 작성할 수 있습니다.
패턴이란 반복해서 나타나는 사건이나 형태를 의미합니다. 디자인 패턴은 특정한 상황에서 구조적인 문제를 해결하는 방식을 설명해줍니다.
예를 들어, 데스크톱 프로그램에서 마우스 클릭이 특정 프로그램의 이벤트 처리 함수 onClick()으로 연결되어 원하는 내용이 실행되는 과정은 복잡하지만, 우리는 모든 과정을 직접 처리하지 않습니다. 그럼에도 사용자의 클릭 이벤트가 앱에 정상으로 전달되어 의도한 메소드를 실행할 수 있는 것은 클릭 이벤트를 인식하고 프로그램에 전달해주는 위임 객체가 있기 때문입니다.
마우스 클릭이 동작하는 과정
1. 마우스 버튼 클릭
2. 마우스에 연결된 시리얼 케이블이나 블루투스 통신을 통해 신호 전송
3. 전송된 신호를 RS232 통신 프로토콜을 이용해 메인보드를 거쳐 운영체제의 메시지 센터로 전달
4. 신호를 수신한 운영체제가 마우스 포인터의 화면상 좌표를 확인
5. 운영체제가 해당 좌표에서 활성화된 애플리케이션 확인
6. 델리게이트를 이용하여 클릭 신호가 애플리케이션의 이벤트 처리 함수 onClick()에 대응하였음을 애플리케이션에 알림
7. 애플리케이션이 onClick() 함수를 실행
iOS에서 사용되는 델리게이트 패턴도 이와 같은 개념입니다. 기능을 처리할 객체를 델리게이트로 설정하고, 특정 이벤트가 발생할 때 이를 델리게이트에 의해 위임된 본래의 객체로 전달해주는 역할을 합니다. iOS에서는 이러한 델리게이트 패턴을 프로토콜을 통해 구현합니다.
프로토콜이란? - 객체의 설계도
프로토콜은 클래스나 구조체가 어떤 기준을 만족하거나 또는 특수한 목적을 달성하기 위해 구현해야 하는 메소드와 프로퍼티의 목록입니다. 다른 객체지향 언어에서 사용되는 인터페이스와 거의 비슷한 개념입니다. 프로토콜은 구현한 객체의 메소드나 속성을 은닉하고 프로토콜에 선언된 명세의 내용만 제공하는 기능을 합니다.
프로토콜의 역할을 한 마디로 설명하자면 특정 기능이나 속성에 대한 설계도입니다. 프로토톨은 구체적인 내용이 없는 프로퍼티나 메소드의 단순한 선언 형태로 구성되며, 구체적인 내용은 이 프로토콜을 이용하는 객체에서 담당합니다. 어떤 내용을 정의하는지는 프로토콜에서 관심을 갖지 않습니다. 중요한 것은 형식입니다.
프로토콜에 선언된 프로퍼티나 메소드의 형식을 프로토콜의 '명세'라고 부르고, 이 명세에 맞추어 실질적인 내용을 작성하는 것을 프로토콜을 '구현(Implement)' 한다고 합니다. 스위프트에서 프로토콜을 구현할 수 있는 구현체는 구조체, 클래스, 열거형(Enumeration), 익스텐션(Extension)이 있습니다.
프로토콜 사용하기
프로토콜을 정의할 때에는 protocol 키워드를 사용합니다. protocol 키워드에 이어 프로토콜 이름을 정의하고, 중괄호로 된 코드 블록을 작성한 다음 내부에 필요한 속성이나 메소드의 형식을 나열합니다.
protocol ExamProtocol{
var name: String { get set }
var description: String { get }
func method1(value: String)
func method2(value: Int) -> String
}
프로토콜과 델리게이션
프로토콜 타입으로 선언된 값을 사용한다는 것은 여기에 할당된 객체가 구체적으로 어떤 기능을 갖추고 있는지는 상관없다는 뜻이기도 합니다. 그저 단순히 할당된 객체를 사용하여 프로토콜에 정의된 프로퍼티나 메소드를 호출하겠다는 의미가 됩니다. 코코아 터치 프레임워크에서는 이러한 프로토콜 타입의 특성을 이용하여 델리게이션이라는 기능을 구현합니다.
iOS에서 프로토콜을 사용하여 델리게이션을 구현하는 것은 클래스가 단일 상속만을 지원하기 때문입니다. 하나의 부모 클래스를 상속받고 나면 더는 다른 클래스를 상속받을 수 없으므로 기능을 덧붙이기에는 제한적입니다. 이를 극복하기 위해 구현 개수에 제한이 없는 프로토콜을 이용하여 필요한 기능 단위별 객체를 작성합니다.
출처
꼼꼼한 재은씨의 스위프트 기본편
꼼꼼한 재은씨의 스위프트 문법편
'iOS' 카테고리의 다른 글
[iOS] Swift로 UITextView 상단의 기본 공백(margin) 없애기 (0) | 2020.10.24 |
---|---|
[iOS] 코코아팟(CocoaPods)이란? 설치와 사용방법은? (0) | 2020.07.15 |
[iOS] 키보드가 올라오면서 뷰를 가리는 현상 제거 (Swift) (1) | 2020.06.17 |
[iOS] UILabel vs UITextField vs UITextView (0) | 2020.04.23 |
[iOS] iOS 13 SDK 적용으로 인한 문제 해결 (0) | 2020.04.08 |
댓글