-
Swift #14 - 프로토콜, extensionSwift의 온도 2021. 1. 22. 01:48
1. 프로토콜
- 인터페이스와 구현
#인터페이스(interface)
#구현(implementation)
#클래스 : 인터페이스 + 구현
#프로토콜 : 인터페이스 Only
*구현이 없어서 단독 사용 불가
*클래스, 구조체와 함께 사용
*메소드, 프로퍼티 구현 약속
- 프로토콜 정의와 채택
*프로토콜 정의protocol PROTOCOL_NAME {}*채택class CLASS_NAME : PROTOCOL_NAME {}cs #클래스와 프로토콜
*상속과 프로토콜 : 부모 클래스를 첫 번째, 프로토콜은 두 번째부터
- 프로토콜 사용 예제
*프로토콜 정의protocol Singing {func sing()}*클래스 채택class Bird : Singing {func sing() {print("짹짹짹")}}*객체 생성과 사용var sparrow = Bird()sparrow.sing()cs #같은 인터페이스, 다양한 구현
*클래스, 구조체, enum에 채택class Bird : Singing {func sing() {print("짹짹짹~")}}struct Cat : Singing {func sing() {print("갸르릉 갸르릉")}}cs - 다중 프로토콜 채택
protocol Dancing {func dance()}class Human : Dancing, Singing {func sing() {print("랄랄라~")}func dance() {print("춤추기")}}*프로토콜 내 타입 메소드 선언product Species {static func species() -> String}cs - 프로토콜 상속
*프로토콜 상속과 구현protocol Singing {func sing() {}}protocol Dancing {func dance() {}}protocol Entertaining : Singing, Dancing {}*프로토콜 상속 관계까지 고려해서 구현struct Human : Entertainingfunc sing() {}func dance() {}}cs - 프로토콜 내 프로퍼티
#프로토콜 내 프로퍼티 선언
*get/set 행위만 선언*get 전용, get/set 모두*set 전용은 없음protocol HoldingBreath {var duration : Int { get set }}*타입 프로퍼티 선언 가능cs #프로토콜의 프로퍼티 구현
*저장 프로퍼티로 구현struct MyStruct : HoldingBreath {var duration : Int}*계산 프로퍼티 구현class MyClass : HoldingBreath {var duration : Int {get {return 0}set {}}}cs - 프로토콜 내 Initializer
#프로토콜 내 Initializer 선언
protocol Named {init(name : String)}cs #구현하기
*클래스 구현 시 required 추가class Monster : Named {required init(name: String) {self.name = name}}*convenience initializer에도 required 추가*struct에는 required 사용 안 함struct Boss : Named {init(name : String) {}}cs - 프로토콜 내 Failable Initializer
*프로토콜 선언protocol Named {init?(name : String)}*Non-failable Initializer로 구현하기class Monster : Named {required init(name : String) {}}*Failable Initializer로 구현하기struct Boss : Named {init?(name : String) {}}cs - 프로토콜 타입
#프로토콜을 타입으로 사용
*프로토콜을 타입으로 선언*프로토콜 내 메소드, 프로퍼티만 사용 가능var singingAnimal : Singing = Human()singingAnimal.sing()*다수의 프로토콜 타입func entertain(who : Singing & Dancing) {}cs - 클래스 전용 프로토콜
#클래스에서만 채택 가능
*class 키워드 사용protocol MyProtocol : class {}*구조체, enum에서는 에러*클래스에서만 채택, 구현 가능*프로토콜 타입을 weak와 사용할 때class MyClass : MyProtocol {weak var property : MyProtocol!}cs 2. extension
- extension
*타입을 나눠서 작성*하나의 타입으로 동작*기존에 작성된 타입(혹은 남이 작성한) 확장*서로 다른 파일에 작성 가능class Dog {func eat() { print("밥 먹기") }}extension Dog {func bike() { print("멍멍멍") }}var myDog = Dog()myDog.eat()myDog.bike()cs #extension으로 가능한 것
*계산 프로퍼티
*메소드
*프로토콜
*서브스크립트
*nested type
#extension으로 불가능한 것
*designated initializer
*저장 프로퍼티
- 프로퍼티
#extension과 프로퍼티
extension Dog {//저장 프로퍼티 에러//계산 프로퍼티var everageLife : Int! {return 15}cs - Initializer
#Initializer 추가
*Designated Initializer 추가 불가*Convenience Initializer 추가class Dog {// Designated Initializerinit() {}}extension Dog {convenience init(name : String) {self.init()}}cs - 프로토콜
#프로토콜 채택 및 구현
*extension내 프로토콜 채택 구현*프로토콜에는 Initializer가 없을 것protocol Running {func run()}extension Dog : Runnig {func run() {print("뛰기")}}cs 3. 프로토콜 extension
- 프로토콜
#프로토콜 extension
*프로토콜 extension에 구현 코드 작성 가능
*프로토콜 채택으로 프로토콜 extension의 구현 코드 사용
*다중 상속과 비슷한 효과
*구조체/Enum 사용 시 중복 코드 문제 해결
#POP
*POP(Protocol Oriented Programming)
*구조체와 Protocol, extension 활용한 프로그래밍 기법
- 프로토콜 extension
#프로토콜과 프로토콜 확장
*프로토콜과 프로토콜 확장protocol Movable { }extension Movable {func move() {print("Go! go! go!")}}*프로토콜 채택, 객체를 이용한 호출struct Human : Movable {}var man = Human()man.movel()cs #다중 프로토콜 채택
*다중 상속 효과*기본 구현 재정의class Superman : Movable, Flyable {func move() {print("Move Fast")}}var superaman = Superman()superman.move()superman.fly()cs - 구조체와 프로토콜 Extension
#상속이 없는 구조체
*코드 중복이 발생하는 상황struct Bird {func move() {print("이동하다")}func fly() {print("날다")}}struct Airplane {func move() {print("이동하다")}func fly() {print("날다")}}cs #프로토콜 extension으로 코드 중복 제거
protocol Movable {}extension Movable {func move() {print("이동하다")}}protocol Flyable {}extension Flyable {func fly() {print("날다")}}struct Bird : Movable, Flyable {}struct Airplane: Movable, Flyable {}cs 'Swift의 온도' 카테고리의 다른 글
Swift #16 - Any와 타입 체크, 제네릭스 (0) 2021.01.27 Swift #15 - 에러처리 (0) 2021.01.26 Swift #13 - 클로저 (0) 2021.01.21 Swift #12 - 구조체와 Enum (0) 2021.01.20 Swift #11 - 메모리 관리 (0) 2021.01.19