오늘의 주제
1. 프로토콜 지향 프로그래밍
안녕하세요, 야곰입니다.
지난 포스팅에서는 스위프트의 프로토콜과 익스텐션에 대해 알아봤습니다.
2017/01/23 - [Swift] - Swift란 어떤 언어인가?
2017/01/25 - [Swift] - Swift 기초문법 - 변수, 상수, 기초 데이터 타입
2017/02/06 - [Swift] - Swift - 함수, 콜렉션 타입
2017/02/28 - [Swift] - Swift - 구조체 클래스
2017/03/07 - [Swift] - Swift - 프로토콜, 익스텐션
이번에는 스위프트와 함께 대두된 프로토콜 지향 프로그래밍 디자인 패턴에 대해 알아보겠습니다 :)
프로토콜 지향 프로그래밍
프로토콜 초기구현
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)에게 이야기합니다")
}
}
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)") } }
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 yagom = Person(topic: "Swift", name: "yagom") let hana = Person(topic: "Internet", name: "hana") yagom.talk(to: hana) hana.talk(to: yagom)
struct Monkey: Talkable { var topic: String func talk(to: Monkey) { print("\(to)! 우끼기기기끼기기") } } let sunny = Monkey(topic: "바나나") let jack = Monkey(topic: "나무") sunny.talk(to: jack)
protocol Flyable { func fly() } extension Flyable { func fly() { print("푸드득 푸드득") } } protocol Runable { func run() } extension Runable { func run() { print("후다닥 후다닥") } } protocol Swimable { func swim() } extension Swimable { func swim() { print("어푸 어푸") } } protocol Talkable { func talk() } extension Talkable { func talk() { print("재잘재잘 쪼잘쪼잘") } } struct Bird: Flyable, Talkable { } let bird = Bird() bird.fly() bird.talk() struct Person: Runable, Swimable, Talkable { } let person = Person() person.run() person.talk() person.swim()
프로토콜 지향 프로그래밍을 추구하는 이유
- 구조체, 클래스, 열거형 등 구조화된 타입 중에 상속은 클래스 타입에서만 가능합니다.
- 클래스는 참조 타입이므로 참조 추적에 비용이 많이 발생합니다. 비교적 비용이 적은 값 타입을 활용하고 싶어도, 상속을 할 수 없으므로 때마다 기능을 다시 구현해 주어야 했지만, 프로토콜 지향 프로그래밍은 그 한계를 없앴습니다.
- 기능의 모듈화가 더욱 명확해 집니다.
- 클래스가 상속을 할 수 있도록 설계되어 있다고 하더라도 다중상속을 지원하는 언어는 많지 않습니다. 다중상속을 지원하지 않는다는 뜻은 하나의 상속체계에서 다른 상속체계에 속해있는 기능을 끌어다 쓸 수 없다는 뜻입니다. 그런데 프로토콜 지향 프로그래밍은 기능을 프로토콜이라는 단위로 묶어 표현하고 초기 구현을 해 둘 수 있으니 상속이라는 한계점을 탈피할 수 있습니다.
- 본 글의 일부내용은 필자의 저서 [스위프트 프로그래밍](2017, 한빛미디어)(http://www.hanbit.co.kr/store/books/look.php?p_code=B5682208459)에서 요약, 발췌하였음을 알립니다.
- 스위프트의 문법에 대해 더 알아보고 싶다면 애플의 Swift Language Guide[https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html]를 참고해도 많은 도움이 됩니다.
- 한글로 프로토콜 지향 프로그래밍에 대해 소개된 내용은 (https://realm.io/kr/news/protocol-oriented-programming-in-swift/)에서도 확인해 볼 수 있습니다.
by yagom
facebook : http://www.facebook.com/yagomSoft
facebook group : https://www.facebook.com/groups/yagom/
twitter : http://www.twitter.com/yagomSoft ( @yagomsoft )
p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.
RSS Feed 받기
'Swift > 응용, 생각거리' 카테고리의 다른 글
Swift에서 Objective-C의 상수 대체제에 관하여 (0) | 2017.04.10 |
---|---|
Swift에 대한 오해와 진실 (10) | 2015.06.11 |