itisjustK
코딩과 사람 사는 이야기
itisjustK
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • 일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠.. (0)
    • Web (43)
      • html & css (9)
      • django & python (15)
      • java script (9)
    • iOS (51)
      • Swift (42)
      • SwiftUI (5)
    • CS (25)
      • 자료구조 (6)
      • 운영체제 (3)
      • 데이터베이스 (9)
      • 네트워크 (7)
    • PS (34)
      • 알고리즘 & 자료구조 (0)
    • Life (36)
    • Retrospective (15)
    • Book (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • AppleDevloperAcademy
  • CoreData
  • 연결리스트
  • POSTECH
  • CS
  • SWIFT
  • 개발자
  • 생활코딩 #이고잉 #HTML #코딩 #개발자
  • 생활코딩
  • ios
  • mongodb
  • 독립서점
  • crud
  • 세그멘테이션
  • 점주
  • SwiftUI
  • nosql
  • 킨디
  • 어플
  • binding

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
itisjustK

코딩과 사람 사는 이야기

iOS/Swift

[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 26. 프로토콜

2021. 7. 29. 17:57

프로토콜

- 프로토콜은 특정 역할을 수행하기 위한 메소드, 프로퍼티, 기타 요구사항 등의 청사진을 정의

- 구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 수행하기 위한 프로토콜의 요구사항을실제로 구현 가능

- 어떤 프로토콜의 요구사항을 모두 따르는 타입은 '그 프로토콜을 준수한다'고 표현

- 타입에서 프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 청사진의 기능을 모두 구현해야 함. 즉, 프로토콜은 기능을 정의하고 제시할 뿐이지 스스로 기능을 구현하진 않음

 

 

정의

protocol 프로토콜 이름 {
	정의부
}

 

 

구현

<<프로퍼티 요구>>

- 프로퍼티 요구는 항상 var 키워드 사용

- get은 읽기 전용, set은 쓰기 전용

protocol Talkable {
    //프로퍼티 요구
    var topic: String { get set }
    var language: String { get }
    
    //메소드 요구
    func talk()
    //프로토콜에서는 구현하지 않는다
    
    //이니셜라이저 요구
    init(topic: String, language: String)
}

 

 

프로토콜 채택 및 준수

<<프로토콜 채택>>

- 타입명 : 프로토콜 이름

//Person 구조체는 Talkable 프로토콜을 채택
struct Person: Talkable {
    //프로퍼티 요구를 다 준수해야한다
    var topic: String //var : 읽기 쓰기 전용
    let language: String //let : 읽기 전용
    
    //읽기전용 프로퍼티 요구는 연산 프로퍼티로도 작성 가능
    var language: String { return "한국어" }
    //읽기 쓰기 프로퍼티도 연산 프로퍼티로 대체 가능
    var subject: String = ""
    var topic: String {
        set {
            self.subject = newValue
        }
        get {
            return self.subject
        }
    }
    
    func talk() {
        print("\(topic)에 대해 \(language)로 말합니다")
    }
    
    init(topic: String, language: String) {
        self.topic = topic
        self.language = language
    }
}

 

프로퍼티 요구는 다양한 방법으로 해석, 구현할 수 있음

struct Person: Talkable {
    var subject: String = ""
    
    //프로퍼티 요구는 연산 프로퍼티로 대체 가능
    var topic: String {
        set {
            self.subject = newValue
        }
        get {
            return self.subject
        }
    }
    
    var language: String { return "한국어" }
    
    func talk() {
        print("\(topic)에 대해 \(language)로 말합니다")
    }
    
    init(topic: String, language: String) {
        self.topic = topic
    }
}

 

 

프로토콜 상속

- 프로토콜은 하나 이상의 프로토콜을 상속받아 기존의 요구사항보다 더 많은 요구사항 추가 가능

- 프로토콜 상속 문법은 클래스의 상속과 유사하지만, 클래스와 다르게 다중상속이 가능

protocol 프로토콜 이름: 부모 프로토콜 이름 목록 {
	정의부
}
protocol Readable {
    func read()
}
protocol Writeable {
    func write()
}
protocol ReadSpeakable: Readable {  //Readalb을 상속받을 것이다
    func speak()    //speak 함수만 써줬지만, Readable을 상속받았기 때문에 read 함수도 있는 거임
}
protocol ReadWriteSpeakable: Readable, Writeable {  //Readable과 writealbe을 상속받을 것이다
    func speak()    //speak + read + write 함수
}

struct SomeType: ReadWriteSpeakable {
    func read() {
        print("Read")
    }
    func write() {
        print("Write")
    }
    func speak() {
        print("Speak")
    }
}

 

<<클래스 상속과 프로토콜>>

- 클래스에서 상속과 프로토콜 채택을 동시에 하는 경우 -> 클래스 먼저 & 그 뒤에 채택할 프로토콜 목록 작성

class SubClass: SuperClass, Writeable, ReadSpeakable {
                //상속받을 클래스 SuperClass 먼저 명시, 뒤에 상속받을 프로토콜 목록 작성!
    func write() { }
    func speak() { }
}

 

 

프로토콜 준수 확인

- is, as 연산자 사용해서 인스턴스가 특정 프로토콜을 준수하는지 확인 가능

let sup: SuperClass = SuperClass()  //SuperClass : read
let sub: SubClass = SubClass()      //SubClass : read, write, speak

var someAny: Any = sup
someAny is Readable // true
someAny is ReadSpeakable // false

someAny = sub
someAny is Readable // true
someAny is ReadSpeakable // true

someAny = sup

if let someReadable: Readable = someAny as? Readable {
    someReadable.read()
} // read

if let someReadSpeakable: ReadSpeakable = someAny as? ReadSpeakable {
    someReadSpeakable.speak()
} // 동작하지 않음

someAny = sub

if let someReadable: Readable = someAny as? Readable {
    someReadable.read()
} // read

'iOS > Swift' 카테고리의 다른 글

[iOS 프로그래밍을 위한 스위프트 기초] Ch3. 오류처리 및 고차함수 - 28. 오류 처리  (0) 2021.07.30
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 27. 익스텐션  (0) 2021.07.30
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 25. assert / guard  (0) 2021.07.29
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 24. 타입 캐스팅  (0) 2021.07.27
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 23. 옵셔널 체이닝과 nil 병합  (0) 2021.07.25
    'iOS/Swift' 카테고리의 다른 글
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch3. 오류처리 및 고차함수 - 28. 오류 처리
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 27. 익스텐션
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 25. assert / guard
    • [iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 24. 타입 캐스팅
    itisjustK
    itisjustK

    티스토리툴바