[IOS 로드맵] Protocol-Oriented Programming

willis18·2021년 9월 28일
0

IOS 로드맵

목록 보기
21/109

Protocol-Oriented Programming

프로토콜 지향 프로그래밍(POP)이다
객체 지향 프로그래밍에서는 공통된 기능을 Class의 상속을 통해 구현한다. Swift도 많은 부분이 Class로 이루어져 있다.
참조 타입의 경우 다중 스레드 환경에서 잘못된 참조로 인해 원본 데이터에 접근해 잘못된 값으로 변경될 수 있는데 그 것을 방지하기 위해 값타입을 권장하는데
구조체 및 열거형은 상속이 불가능 한 점이 있습니다.
하지만 POP개념을 이용하면 프로토콜 + 익스텐션을 통해 껍데기 안에서 구현까지 해놈으로써 심플하게 해결이 가능한데 이러한 조합을 프로토콜 초기 구현이라한다.

  • 프로토콜 : 특정 역할을 수행하기 위해 메소드, 프로퍼티등 사항을 한데 모아논 청사진
  • 익스텐션 : 기존 타입의 기능을 확장할 수 있도록 도와주는 기능

프로토콜 초기 구현

프로토콜 + 익스텐션의 조합으로 만든 소스

protocol Person {
    var name: String { get }
    var age: Int { get }
    
    func getAge() -> Int
}

// 프로토콜 초기구현
extension Person {
    func getAge() -> Int {
        return self.age
    }
}

struct FireFighter: Person {
    var name: String
    var age: Int
    
    func extinguish() {
    }
}

struct PolieMan: Person {
    var name: String
    var age: Int
    var jail: [Criminal] = []
    
    mutating func arrest(criminal: Criminal) {
        jail.append(criminal)
    }
}

제네릭 사용

protocol Box {
    // 연관값으로 선언
    associatedtype Item
    
    var items: [Item] { get set }
    mutating func addItem(item: Item)
}

extension Box {
    mutating func addItem(item: Item) {
        items.append(item)
    }
}

// 제네릭으로 선언
struct StructBox<Element>: Box {
    typealias Item = Element
    
    var items: [Element]
}

let intBox: StructBox<Int> = StructBox(items: [0, 1])
let stringBox: StructBox<String> = StructBox(items: ["Alpaca", "Cattle"])

제네릭 부분은 차후 pop연계되는 제네릭 게시글에서 별도로 다루고 이해해 보는걸루ㅠㅠ

최종 장점!

  • 가볍고 안전하다.
  • 값 타입의 상속 효과
  • 수평적인 기능 확장
  • 제네릭의 활용

참고링크 : https://duwjdtn11.tistory.com/618
https://medium.com/@Alpaca_iOSStudy/protocol-oriented-programming-pop-2db7d4d02747

0개의 댓글