본문 바로가기
iOS/Swift

[iOS/Swift] 약속을 위한 청사진(Blueprint), 프로토콜(Protocol)

by iosdevlime 2023. 3. 5.

사실 요 프로토콜(Protocol)은 클래스 파트에서 함께 다뤘어야 하는데,

비슷하게 생긴 클래스와 구조체를 먼저 비교하고 넘어가야 이해가 쉬울것 같아..

 

이제서야 뒤늦게 부랴부랴 포스팅을 시작해봅니다😅

 

이번 시간엔 아~주 간단하게,

프로토콜(Protocol)의 개념과 선언방식만 알아보겠습니다.

 

 

 


 

 

 

 

프로토콜(Protocol)이란 무엇인가요?

최소한의 요구사항과 규칙을 준수하기 위한 청사진(BluePrint)

 

청사진(BluePrint)이라고 하니, 

지난번에 다룬 클래스의 추상화, 상속성 어쩌구 내용이 떠오르지 않으신가요?

 

프로토콜은,

클래스나 구조체, 열거형 등 일종의 '틀' 이라 불리는 이들에게

더 높은 위치에서 '요구사항'과 '규칙'을 설정합니다. 

 

 

 

왜 필요하나요?

  • 클래스 혹은 구조체 등 특정 '틀'이 구조적으로 올바르게 되기 위한 규칙이 필요합니다.
    • 특정 클래스, 구조체를 생성하고 작업할 시점에 아무런 조건이 없다면 구성요소가 제각각이겠지요?
    • 예를 들면, iOS SDK 내 프레임워크를 활용하여 클래스, 구조체를 만들 때는 더욱 필요합니다.
      (➟ SDK, 프레임워크, 라이브러리 등 자주 등장하는 용어는 추후 별도로 포스팅 하도록 하겠습니다)
  • 그래서, 프로토콜은 최소한의 요구사항이자 규칙이며, 일종의 약속입니다.
    • 클래스, 구조체가 반드시 포함해야 하는 기능과 구성요소(메서드 및 프로퍼티)를 정의합니다.
    • 특정 기능을 구현하기 위해, '이 규칙에 부합해야만 작동할 수 있어!' 란 조건을 던지게 되는 것이죠.

 

 

예시를 통해 프로토콜 이해하기

  • 개발자가 재택근무를 진행하는 작업공간(Workspace) 내부를 예시로 살펴보겠습니다.
    • 효율적인 작업과 휴식을 위해, 아래와 같은 가구와 용품이 있습니다.
    • 테이블 / 컴퓨터 / 의자 / 쇼파

개발자가 있는 방(ROOM)에는 4개의 필수 가구와 용품이 있다
작업공간에는 4개의 필수 가구와 용품이 있다

 

 

  • 개발자는 해당 가구, 용품을 활용하여 재택근무라는 목표를 수행해야 합니다.
    • 작업공간(Workspace)에선 가구나 용품 이외, '업무''휴식'등의 행동을 취합니다.
    • 결과적으로, '작업공간'을 구성하기 위해 아래와 같은 약속, 규칙을 설정합니다.

Workspace는 4개의 가구/용품이 포함되어 있으며, 일 혹은 휴식을 취하는 행위를 통해 '목표'를 이룬다!
Workspace는 4개의 가구/용품이 포함되어 있으며, 일 혹은 휴식을 취하는 행위를 통해 '목표'를 이룬다!

 

  • 프로토콜(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분만 눈 감고 있을게..")
    }
}

 

 


 

간략하게 프로토콜의 정의와 선언 및 채택과정에 대해 알아보았습니다.

 

추후 지속적으로 만나게 되는

불투명 반환타입 이라던지, 프로토콜 지향 프로그래밍 이라던지..

 

관련된 내용을 이해하고 활용하기 위해선 반드시 짚고 넘어가야 할 산입니다.

다음 포스팅에선 보다 심화된 프로토콜에 대한 내용으로 돌아오겠습니다.

 

댓글