새소식

iOS/Swift

[Swift] 프로토콜

  • -

 

참조 :  Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어)
인프런 강의 (iOS 최신 앱 개발 강의 - 기초부터 핵심 요소, 간단한 포폴까지 제작)

 

프로토콜(Protocol)이란?


- Swift에서 프로토콜 지향 프로그래밍(Protocol Oriented Programming)이 큰 화두로 오름

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

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

- 어떤 프로토콜의 요구사항을 모두 따르는 타입 = 해당 프로토콜을 준수(Confirm)한다라고 표현

- 프로토콜은 정의를 하고 제시를 할 뿐이지 스스로 기능을 구현하지 않음

- protocol 키워드를 사용하여 정의

 

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

 

 

프로토콜의 요구사항


  • 프로퍼티 요구

- 자신을 채택한 타입이 어떤 프로퍼티를 구현해야 하는지를 요구할 수 있음

- 만약 프로토콜이 읽고 쓰기가 가능한 프로퍼티를 요구한다면
읽기만 가능한 상수 저장프로퍼티 또는 읽기 전용 연산 프로퍼티를 구현할 수 없음

- 프로토콜의 프로퍼티 요구사항은 var 키워드를 사용하여 정의

 

  1. 읽기와 쓰기가 모두 가능한 프로퍼티는 프로퍼티의 정의 뒤에 { get set }이라고 명시
  2. 일기 전용 프로퍼티는 프로퍼티의 정의 뒤에 { get }이라고 명시

 

protocol Sendable{
    var from: String {get}
    var to: String {get}
}

class Message: Sendable{
    var sender: String
    var from: String{
        return self.sender
    }
    
    var to: String
    
    init(sender: String, receiver: String){
        self.sender = sender
        self.to = receiver
    }
}

 

  • 메서드 요구

- 타입 프로퍼티를 요구하려면 static 키워드 사용

- 클래스의 타입 프로퍼티에는 상속 가능한 타입 프로퍼티 class 타입 프로퍼티와 상속 불가능한 static 타입 프로퍼티가 있음

- 두 타입 프로퍼티를 따로 구분하지 않고 모두 static 키워드 사용

- 특정 인스턴스 메서드나 타입 메스드를 요구할 수 있음

- 프로토콜이 요구할 메스드는 프로토콜 정의에서 작성

- 다만 메서드의 실제 구현부인 중괄호({}) 부분은 제외하고 메서드의 이름, 매개변수, 반환 타입 등만 작성하며

가변 매개변수도 허용

- 메서드 요구에서는 매개변수 기본값을 지정할 수 없음

- 타입 메서드를 요구 할 때는 타입 프로퍼티 요구와 마찬가지로 앞에 static 키워드 명시

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

 

 

  • 가변 메서드 요구

- 메서드가 인스턴스 내부의 값을 변경할 필요가 있을 때 값 타입(구조체와 열거형)의 인스턴스 메서드에서 자신의 값을 변경할 때는
메서드의 func 키워드 앞에 mutating 키워드를 적어 메서드에서 인스턴스 내부의 값을 변경한다는 것을 확실히 함

- 참조 타입인 클래스의 메서드 앞에는 mutating 키워드를 명시하지 않아도 인스턴스 내부 값을 바꾸는 데 문제가 없음

- 값 타입인 구조체와 열거형의 메서드 앞에 mutating 키워드를 붙인 가변 메서드 요구(Mutating Method Requirements)가 필요

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

 

  • 이니셜라이저 요구

- 프로토콜은 특정한 이니셜라이저를 요구할 수 있음

- 이니셜라이저의 매개변수를 지정하기만 할 뿐, 중괄호를 포함한 이니셜라이저는 구현하지 않음

- 구조체 타입에서는 신경쓰지 않아도 됨

- 클래스 타입에서 이니셜라이저 요구에 부합하는 이니셜라이저를 구현할 때는 required 식별자를 붙인 요구 이니셜라이저로 구현해야 함

- 만약 특정 클래스에 프로토콜이 요구하는 이니셜라이저가 이미 구현되어 있는 상황에서 그 클래스를 상속받은 클래스가 있다면,

required와 override 식별자를 모두 명시하여 프로토콜이 요구하는 이니셜라이저를 구현

- 일반 이니셜라이저 외에도 실패 가능한 이니셜라이저를 요구할 수 있음

 

 

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


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

20-12 프로토콜의 상속

- 3개의 프로토콜의 채택한 SomeClass는 세 프로토콜이 요구하는 read(), write(), speak() 메서드를 모두 구현해야 함

- 클래스 전용 프로토콜로 제한 주기 위해서는 프로토콜의 상속 리스트의 맨 처음에 class 키워드가 위치해야 함

 

 

프로토콜 조합과 프로토콜 준수 확인


- 하나의 매개변수가 여러 프로토콜을 모두 준수하는 타입이어야 하면, 하나의 매개변수에 여러 프로토콜을 한번에 조합하여 요구할 수 있음

- 이때 앰퍼샌드(&)를 여러 프로토콜 이름 사이에 사용하면 됨

- 클래스의 인스턴스 역할을 할 수 있는지 확인 가능

- is와 as 연산자를 통해 대상이 프로토콜을 준수하는지 확인할 수 있음

  • is 연산자 : 해당 인스턴스가 특정 프로토콜을 준수하는지 확인
  • as? : 다른 프로토콜로 다운캐스팅을 시도할 수 있음
  • as! : 다른 프로토콜로 강제 다운캐스팅을 할 수 있음

 

 

위임을 위한 프로토콜(Delegation)


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

- 위임 패턴은 애플의 프레임워크에서 사용하는 주요 패턴 중 하나

- 애플 플랫폼의 애플리케이션을 만들 때 도움이 됨

- 애플의 프레임워크에 사용하는 위임 패턴을 위해 다양한 프로토콜이 'OOOODelegate'라는 식의 이름으로 정의되어 있음

ex) UITableView→ UITableViewDelegate

728x90

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

[Swift] 조건문, 반복문  (0) 2022.09.04
[iOS] PHAsset을 UIImage로 변환하기  (0) 2022.08.24
[Swift] 타입캐스팅  (0) 2022.07.03
[Swift] 옵셔널 체이닝  (0) 2022.07.01
[Swift] Enum(열거형)  (0) 2022.05.14
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.