Swift & iOS

[Swift] 프로토콜 (Protocol)

hammii 2022. 6. 16. 15:15
728x90
반응형

프로토콜이란?

  • 특정 역할을 하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진
  • 구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 실행하기위한 프로토콜의 요구사항을 실제로 구현할 수 있다.
  • 만약 프로토콜이 요구하는 상황을 모두 충족하면 해당 타입이 채택한 프로토콜을 준수한다고 말할 수 있다.
  • 여러개의 프로토콜을 채택할 수 있다.
  • 클래스도 프로토콜 채택 가능, 상속받은 클래스가 있다면 슈퍼클래스 제일 먼저 쓰고 그 다음 프로토콜을 쓴다.
/*
 protocol 이름 {
 }
 */

protocol SomeProtocol {
}
protocol SomeProtocol2 {  
}
struct SomeStructure: SomeProtocol, SomeProtocol2 {
}

 

프로퍼티 요구사항

  • 자신을 채택한 타입이 어떠한 프로퍼티를 구현해야하는지 요구할 수 있다.
  • 저장, 계산 프로퍼티 지정안하고 프로퍼티 이름과 타입만 지정, 읽기만 가능한 프로퍼티인지, 읽고 쓰기 가능한 프로퍼티 인지 get, set 이용하여 지정해줘야한다.
  • 항상 변수로 요구
  • 읽기쓰기 가능하면 { get set } / 읽기만 가능하면 {get}
  • 타입프로퍼티 요구시 항상 static 키워드를 써줘야한다.
protocol FirstProtocol {
    var name: Int { get set }
    var age: Int { get }
}

protocol AnotherProtocol {
    static var someTypeProtocol: Int { get set }
}

 

메소드 요구사항

  • 인스턴스 메소드, 타입 메소드 모두 가능
  • 프로토콜에서 메소드를 정의할 때 중괄호나 메소드의 본문은 필요없다.
  • 하지만, 메소드의 매개변수 값은 정해줘야한다.
  • 매개변수의 디폴트 값은 지정할 수 없다.
protocol FullyNames {
    var fullName: String { get set }
    func printFullName()
}

struct Person: FullyNames {
    var fullName: String
    
    func printFullName() {
        print(fullName)
    }
}

 

이니셜라이저 요구사항

  • 프로토콜은 생성자 요구 가능
  • 생성자의 몸통은 작성하지 않아도 되고 생성자 키워드와 매개변수만 정해주면 된다.
  • 클래스가 프로토콜이 요구하는 생성자를 채택하려면 required 식별자를 사용해야한다.
  • 구조체에서는 required 식별자 필요없다.
  • 클래스 자체가 상속받을 수 없는 파이널 클래스라면 required 식별자 필요없다.
protocol SomeProtocol5 {
    init()
}

class SomeClass: SomeProtocol5 {
    required init() {
        
    }
}

 

 

출처: [패스트캠퍼스] 30개 프로젝트로 배우는 iOS 앱 개발 with Swift 초격차 패키지 Online.

 

728x90
반응형