본문 바로가기
Languages/Swift

사당 iOS 스터디 4주차 - 프로토콜

by 탄이. 2018. 8. 17.

CHAPTER 20 프로토콜

__20.1 프로토콜이란

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

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

프로토콜은 정의를 하고 제시를 할 뿐이지 스스로 기능을 구현하지는 않습니다.

__20.2 프로토콜 정의

__20.3 프로토콜 요구사항

프로토콜은 타입이 특정 기능을 실행하기 위해 필요한 기능을 요구합니다. 프로토콜이 자신을 채택한 타입에 요구하는 사항은 프로퍼티나 메서드와 같은 기능들

20.3.1 프로퍼티 요구

  • 프로토콜을 채택한 타입은 프로토콜이 요구하는 프로퍼티의 이름과 타입만 맞도록 구현해주면 됩니다.

  • 프로퍼티를 읽기 전용으로 할지 혹은 읽고 쓰기가 모두 가능하게 할지는 프로토콜이 정해야 합니다.

  • 읽고 쓰기가 가능한 프로퍼티를 요구한다면 읽기만 가능한 상수 저장 프로퍼티 또는 읽기 전용 연산 프로퍼티를 구현할 수 없습니다.

  • 읽기 가능한 프로퍼티를 요구한다면 구현해주는 프로퍼티는 무엇이 되어도 상관없습니다.

  • 프로토콜의 프로퍼티 요구사항은 항상 var 키워드를 사용한 변수 프로퍼티로 정의

    • { get set }

    • { get }

  • 두 타입 프로퍼티를 따로 구분하지 않고 모두 static 키워드를 사용하여 타입 프로퍼티를 요구하면 됩니다.

20.3.2 메서드 요구

  • 프로토콜의 메서드 요구에서는 매개변수 기본값을 지정할 수 없습니다.

  • static 키워드를 사용하여 요구한 타입 메서드를 클래스에서 실제 구현할 때는 static 키워드나 class 키워드 어느 쪽을 사용해도 무방

  • 타입으로서의 프로토콜

    • 프로토콜은 코드에서 완전한 하나의 타입으로 사용되기에 여러 위치에서 프로토콜을 타입으로 사용할 수 있습니다.

20.3.3 가변 메서드 요구

  • 값 타입(구조체와 열거형)의 인스턴스 메서드에서 자신 내부의 값을 변경하고자 할 때는 메서드의 func 키워드 앞에 mutating 키워드

  • 만약 Resettable 프로토콜에서 가변 메서드를 요구하지 않는다면, 값 타입의 인스턴스 내부 값을 변경하는 mutating 메서드는 구현이 불가능

20.3.4 이니셜라이저 요구

  • 이니셜라이저 요구에 부합하는 이니셜라이저를 구현할 때는 required 식별자를 붙인 요구 이니셜라이저로 구현해야 합니다.

  • 특정 클래스에 프로토콜이 요구하는 이니셜라이저가 이미 구현되어 있는 상황에서 그 클래스를 상속받은 클래스가 있다면, required와 override 식별자를 모두 명시하여 프로토콜에서 요구하는 이니셜라이저를 구현해주어야 합니다.

__20.4 프로토콜의 상속과 클래스 전용 프로토콜

프로토콜의 상속 리스트에 class 키워드를 추가해 프로토콜이 클래스 타입에만 채택될 수 있도록 제한할 수도 있습니다.

맨 처음에 class 키워드

__20.5 프로토콜 조합과 프로토콜 준수 확인

프로토콜을 조합하여 요구할 때는 SomeProtocol & AnotherProtocol과 같이 표현

구조체나 열거형 타입은 조합할 수 없습니다.

그리고 조합 중 클래스 타입은 한 타입만 조합할 수 있습니다.

프로토콜 캐스팅

  • is 연산자를 통해 해당 인스턴스가 특정 프로토콜을 준수하는지 확인할 수 있습니다.

  • as? 다운캐스팅 연산자를 통해 다른 프로토콜로 다운캐스팅을 시도해볼 수 있습니다.

  • as! 다운캐스팅 연산자를 통해 다른 프로토콜로 강제 다운캐스팅을 할 수 있습니다.

__20.6 프로토콜의 선택적 요구

프로토콜의 요구사항 중 일부를 선택적 요구사항으로 지정할 수 있습니다.

@objc 속성이 부여된 프로토콜이어야 합니다.

@objc 속성이 부여되는 프로토콜은 Objective-C 클래스를 상속받은 클래스에서만 채택할 수 있다는 것

@objc 속성을 사용하려면 애플의 Foundation 프레임워크 모듈을 임포트해야 합니다.

선택적 요구사항은 optional 식별자를 요구사항의 정의 앞에 붙여주면 됩니다.

(Int) -> String 타입의 메서드는 ((Int) -> String)? 타입

메서드의 매개변수나 반환 타입이 옵셔널이 된 것이 아니라 메서드(함수) 자체의 타입이 옵셔널이 된 것

__20.7 프로토콜 변수와 상수

프로토콜 이름을 타입으로 갖는 변수 또는 상수에는 그 프로토콜을 준수하는 타입의 어떤 인스턴스라도 할당할 수 있습니다.

Named 프로토콜을 타입으로 갖는 변수 someNamed에 Pet, Person, School 타입의 인스턴스가 할당될 수 있습니다

__20.8 위임을 위한 프로토콜

위임(Delegation)은 클래스나 구조체가 자신의 책임이나 임무를 다른 타입의 인스턴스에게 위임하는 디자인 패턴

책무를 위임하기 위해 정의한 프로토콜을 준수하는 타입은 자신에게 위임될 일정 책무를 할 수 있다는 것을 보장

위임은 사용자의 특정 행동에 반응하기 위해 사용되기도 하며, 비동기 처리에도 많이 사용

위임 패턴

  • UITableView타입의 인스턴스가 해야 하는 일을 위임받아 처리하는 인스턴스는 UITableViewDelegate프로토콜을 준수하면 됩니다

  • 위임받은 인스턴스, 즉 UITableViewDelegate 프로토콜을 준수하는 인스턴스는 UITableView의 인스턴스가 해야 하는 일을 대신 처리






    참고


    야곰의 스위프트 프로그래밍 https://book.naver.com/bookdb/book_detail.nhn?bid=12571019


댓글