사실 요 프로토콜(Protocol)은 클래스 파트에서 함께 다뤘어야 하는데,
비슷하게 생긴 클래스와 구조체를 먼저 비교하고 넘어가야 이해가 쉬울것 같아..
이제서야 뒤늦게 부랴부랴 포스팅을 시작해봅니다😅
이번 시간엔 아~주 간단하게,
프로토콜(Protocol)의 개념과 선언방식만 알아보겠습니다.
프로토콜(Protocol)이란 무엇인가요?
최소한의 요구사항과 규칙을 준수하기 위한 청사진(BluePrint)
청사진(BluePrint)이라고 하니,
지난번에 다룬 클래스의 추상화, 상속성 어쩌구 내용이 떠오르지 않으신가요?
프로토콜은,
클래스나 구조체, 열거형 등 일종의 '틀' 이라 불리는 이들에게
더 높은 위치에서 '요구사항'과 '규칙'을 설정합니다.
왜 필요하나요?
- 클래스 혹은 구조체 등 특정 '틀'이 구조적으로 올바르게 되기 위한 규칙이 필요합니다.
- 특정 클래스, 구조체를 생성하고 작업할 시점에 아무런 조건이 없다면 구성요소가 제각각이겠지요?
- 예를 들면, iOS SDK 내 프레임워크를 활용하여 클래스, 구조체를 만들 때는 더욱 필요합니다.
(➟ SDK, 프레임워크, 라이브러리 등 자주 등장하는 용어는 추후 별도로 포스팅 하도록 하겠습니다)
- 그래서, 프로토콜은 최소한의 요구사항이자 규칙이며, 일종의 약속입니다.
- 클래스, 구조체가 반드시 포함해야 하는 기능과 구성요소(메서드 및 프로퍼티)를 정의합니다.
- 특정 기능을 구현하기 위해, '이 규칙에 부합해야만 작동할 수 있어!' 란 조건을 던지게 되는 것이죠.
예시를 통해 프로토콜 이해하기
- 개발자가 재택근무를 진행하는 작업공간(Workspace) 내부를 예시로 살펴보겠습니다.
- 효율적인 작업과 휴식을 위해, 아래와 같은 가구와 용품이 있습니다.
- 테이블 / 컴퓨터 / 의자 / 쇼파
- 개발자는 해당 가구, 용품을 활용하여 재택근무라는 목표를 수행해야 합니다.
- 작업공간(Workspace)에선 가구나 용품 이외, '업무'나 '휴식'등의 행동을 취합니다.
- 결과적으로, '작업공간'을 구성하기 위해 아래와 같은 약속, 규칙을 설정합니다.
- 프로토콜(Protocol)이란, 예시로 살펴본 '작업공간' 내 필요한 요소나 요구사항을 미리 설정하는 '가이드'입니다.
- 작업공간을 구성할 때 필요한 가구, 용품 ➟ 프로퍼티(Property)
- 작업공간에서 반드시 해야 할 행위 ➟ 메서드(Method)
프로토콜(Protocol)의 선언과 채택
값을 직접 선언하지 않으며, 필요한 '요구사항'만을 제시한다
앞선 예시가 잘 이해가 되셨다면,
프로토콜은 특정 값을 지닌 객체가 아니라,
"이게 있어야 하고, 이러한 행동을 해야해! " 와 같은
일종의 '가이드'만 제시하는 역할을 담당한다는 것을 파악할 수 있습니다.
그렇다면,
실제 코드상으로 어떻게 선언하고 채택할 수 있을까요?
(기존에 활용한 Workspace 예시를 바탕으로 살펴보도록 하겠습니다)
프로토콜의 선언(정의)
- Protocol 키워드와 이름, 내부에 요구사항을 선언합니다.
- 특정 프로퍼티나 메서드에 직접 값을 할당하거나, 기능을 구현하지 않습니다!
- 내부에 선언(정의)된 프로퍼티나 메서드 모두, 지극히 단순한 형태로 존재합니다.
protocol Workspace {
// 4개의 가구 및 용품(프로퍼티)
var table: String { get set }
var computer: String { get set }
var chair: String { get set }
var sofa: String { get set }
// 행위(메서드)
func work()
func rest()
}
프로토콜의 채택
- 클래스 상속(inheritance)과 같이, 클래스나 구조체 등 이름 옆에 선언합니다.
- 반드시 프로토콜 내부에 선언된 요소들을 모두 선언, 구현해야 합니다!
- 프로토콜은 클래스, 구조체, 열거형에 의해 채택됩니다.
struct myWorkSpace: Workspace {
var table: String = "이케아"
var computer: String = "맥 미니"
var chair: String = "시디즈"
var sofa: String = "자코모"
func work() {
print("2시간 초과 근무중..")
}
func rest() {
print("10분만 눈 감고 있을게..")
}
}
간략하게 프로토콜의 정의와 선언 및 채택과정에 대해 알아보았습니다.
추후 지속적으로 만나게 되는
불투명 반환타입 이라던지, 프로토콜 지향 프로그래밍 이라던지..
관련된 내용을 이해하고 활용하기 위해선 반드시 짚고 넘어가야 할 산입니다.
다음 포스팅에선 보다 심화된 프로토콜에 대한 내용으로 돌아오겠습니다.
'iOS > Swift' 카테고리의 다른 글
[iOS/Swift] 타입에 의존하지 않는 범용코드, 제네릭(Generic) (0) | 2023.03.12 |
---|---|
[iOS/Swift] immutable한 구조체, mutating을 적용한다면? (0) | 2023.03.07 |
[iOS/Swift] Swift에서의 구조체(Struct), 값 타입과 참조 타입의 비교 (0) | 2023.02.22 |
[iOS/Swift] 상속(Inheritance)을 통한 재 정의, 오버라이딩(Overriding) (0) | 2023.02.19 |
[iOS/Swift] 클래스의 계층구조, 상속(Inheritance)의 개념과 활용 (0) | 2023.02.13 |
댓글