본문 바로가기

IOS Swift

[Swift] Protocol - 프로토콜이란?

프로토콜!! 

참.. 알면 알수록 어렵다!

객체 지향 프로그래밍의 다형성, SOLID 법칙

WWDC 2015 - 프로토콜 지향 프로그래밍

Swift 5.7 Opaque Type(some, any)

Generic

적용할 수 있는 것들도 많고 생각해야 할 것도 참 많네요. 😋

근데 일단 활용할 수 있는 것들은 잠시 놔두고

기초인 프로토콜이 무엇인지 뭘 할 수 있는지 알아보려고 합니다!!

ㄱㄱ


목차

  1. 프로토콜 정의
  2. 언제 프로토콜 사용하는지
  3. 프로토콜에서 요구사항의 청사진이 될 수 있는 것들

1.  프로토콜 정의

프로토콜은 특정 작업이나 기능에 적합한 메서드, 속성 및 기타 요구 사항의 청사진을 정의합니다. 그런 다음 해당 요구 사항의 실제 구현을 제공하기 위해 클래스, 구조 또는 열거형에서 프로토콜을 채택 할 수 있습니다. 프로토콜의 요구 사항을 충족하는 모든 유형은 해당 프로토콜을 준수 한다고 합니다. 

- Apple 문서 번역

청사진?? 뭔말인가 했는데 진짜 그냥 청색사진(blueprint)이었네요. ㅋㅋ

더보기

청사진이란?

19세기에 복잡한 설계도면 사본을 만들려고 하면 그 당시 복사기는 없었기 때문에 힘들었습니다. 그래서 19세기 영국의 J. F. W. 허셜이라는 사람이 청사진이라는 방법을 고안해냅니다. (반투명한 용지에 도면을 그리고 수산화철(Ⅲ)시트르산 수용액으로 처리된 인화지에 겹쳐 놓은 뒤 일정시간 빛에 노출시켜 적혈염 수용액으로 씻으면 인화지에 원래 그렸던 도면이 복사되는 방법)
그러한 방법으로 나온 결과물인 복사된 설계도가 청사진(blueprint)입니다.
'무언가의 설계나 뼈대 = 청사진'

 

결론 : 프토토콜은 메서드, 속성 및 기타 요구 사항의 뼈대이다.

 

2.  언제 프로토콜을 사용하는지?

프로토콜은 언제 어떻게 사용하는지 알아보기 위해 예시를 하나 준비했습니다.

class Hummans {
    func run()
}

class Maraton {
    func start(with participants: Hummans) {
        participants.run()
    }
}

 

마라톤이라는 클래스에서 사람들이 참여자로 시작할 수 있습니다.

그런데 마라톤 참여자는 사람뿐 아니라 달릴 수 있는 모든 것들이 참여가 가능하다고 하네요!?

이럴 때 프로토콜을 사용하면 좋습니다!

 

protocol Runnable {
    func run()
}

class Hummans: Runnable {
    func run() {
        // 구체적인 구현
    }
}

class Dogs: Runnable {
    func run() {
        // 구체적인 구현
    }
}

class Cats: Runnable {
    func run() { 
        // 구체적인 구현
    }
}

class Maraton {
    func start(with participants: Runnable) {
        participants.run()
    }
}​

위에서 강아지랑 고양이를 추가했는데 사실 달릴 수 있는 모든 것은 종류가 더 많잖아요. 이렇게 확장 가능성이 높을 때

프로토콜을 쓰면 어떤 클래스를 만들던 확장성이 있는 구조가 됩니다.

물론 구조가 복잡해지기 때문에 확장 가능성이 있는지 없는지 고민해보셔야 합니다.

확장 가능성이 있을 때 확장성 있는 구조로 만드는 것이 좋은거지 가능성도 없는데 그렇게 만들면 괜히 코드만 복잡해지는 거니까요.

 

3. 프로토콜에서 요구사항의 청사진이 될 수 있는 것들

  • 메서드, 타입 메서드
  • 프로퍼티, 타입 프로퍼티
  • 이니셜라이저
  • 서브스크립트
  • Associated Types
protocol SomeProtocol {
    // 프로퍼티, 타입 프로퍼티
    var dice: Dice { get }
    
    // 메서드, 타입 메서드
    static func someTypeMethod()
    func random() -> Double
    mutating func toggle()
    
    // 이니셜라이저
    init(someParameter: Int)
    
    // 서브스크립트
    subscript(index: Int) -> String { get set }
    
    // Associated Type
    associatedtype ItemType
}

 

또한 프로토콜은 상속과 조합 옵셔널 요구사항, 연관 타입 제약 조건 등 다양하게 사용할 수 있는데 이것들은 너무 길어질 것 같아서 다음 글에서 작성하겠습니다!

반응형