Swift 심화(7)

EN·2022년 10월 6일

요번에 배울 것은 POP(Protocol Oriented Programming)

프로토콜 지향 프로그래밍

import Foundation 

protocol Talkable{
  var topic: String{ get set}
  func talk(to: Self)
}

struct Person: Talkable{
  var topic: String
  var name: String
  func talk(to: Person){
    print("\(topic)에 대해 \(to.name)에게 이야기합니다")
  }
}

struct Monkey: Talkable{
  var topic: String
  func talk(to: Monkey){
    print("우끼끼 꺄꺄 \(topic)")
  }
}
  • 만약 이걸 객체지향으로 구현했다면, Animal이란거를 Person과 Monkey가 상속받아야 했을 것이다.
  • 하지만 프로토콜을 했기 때문에, 이런 식의 구조를 할 수 있따. 속성을 덫붙이는 느낌
  • 객체지향프로그래밍은 내가 누구의 속성을 물려받았는지가 나의 정의임
  • 프로토콜지향프로그래밍은 내가 무엇을 하는 존재인가가 나의 정의임.
import Foundation 

protocol Talkable{
  var topic: String{ get set}
  func talk(to: Self)
}

//익스텐션을 사용한 프로토콜 초기 구현
extension Talkable{
  func talk(to: Self){
    print("\(to)! \(topic)")
  }
}

struct Person: Talkable{
  var topic: String
  var name: String
}

struct Monkey: Talkable{
  var topic: String
}

let ned = Person(topic: "Swift", name: "ned")
let hana = Person(topic: "Internet", name: "hana")

ned.talk(to: hana)
hana.talk(to: ned)
  • 프로토콜이 요구하는 사항을 미리 모두 한꺼번에 구현해 둘 수 있따면 중복된 코드를 피할 수 있다.

  • 이 코드에서는 Person과 Monkey에 Talkable의 요구사항인 talk(to:)메서드를 구현하지 않았음에도 전혀 오류가 발생하지 않는다.

  • 이렇게 하나의 프로토콜을 만들어 두고, 초기 구현을 해둔다면 여러 타입에서 해당 기능을 사용하고 싶을 때 프로토콜을 채택하기만 하면 된다.

  • 만약에 프로토콜 초기 구현과 다른 동작을 행한다면, 그저 그 타입에 프로토콜의 요구사항을 재정의해주면 된다.

  • Monkey에다가 talk함수를 재구현하면 됨. 여기서는 오버라이드 개념을 쓰지 않음!!

  • 프로토콜 초기 구현을 잘 해둔다면 여러 프로토콜을 그저 채택하기만 하면 그 타입에 기능이 추가된다.

  • 대문자 Self는 타입 자체를 정의할 때 사용하고, 소문자 self는 타입의 객체를 의미한다

  • 프로토콜에서의 Self는 자기 자신을 채택하는 “타입 자체”를 의미한다.

  • 정리하면,

    • struct와 enum을 사용하고
    • protocol로 동일 속성 부여
    • extension으로 동일 메서드 구현
    • 하나의 객체에 여러 protocol 부여 가능(객체지향은 하나의 객체는 단일 상속만 가능. 단 C++예외)
    • 값 타입
    • 매번 복제로 많은 메모리 사용(지연 복제로 극복)
    • 멀티 스레드/프로세스에 강점!
  • 주의할 점

    • 스윞은 Duck타입 언어가 아닌 강한 타입 언어다.
    • 객체지향, 프로토콜 지향 어느 것도 만능은 아니다
    • 프로토콜 지향의 값 타입 기반은 유사성이 있지만 함수언어의 개념은 별개다.
    • 클로저에서 함수언어의 특성이 나타난다.
    • 우리가 활용할 객체가 Class기반인지, Struct기반인지 반드시 참고하고 사용할 필요가 있다.
profile
iOS/JUJITSU

0개의 댓글