본문 바로가기
⌨️ Language/swift

[Swift] 프로토콜 (Protocol)

by hyebin (Helia) 2023. 2. 6.

프로토콜 (Protocol)

  • 특정 작업이나 기능에 적합한 메서드, 프로퍼티 및 기타 요구사항의 ‘약속’을 정의
  • 클래스(class), 구조체(struct), 열거형(enum)에서는 어떠한 프로토콜을 채택하여 해당 프로토콜의 요구사항을 실제로 구현 가능
  • 프로토콜의 요구사항을 충족시키는 모든 타입은 해당 프로토콜을 준수한다 혹은 따른다고 함
  • 프로토콜을 채용한 형식은 요구사항을 반드시 모두 구현해야 함
  • 프로토콜은 프로토콜 간 상속을 지원하며, 클래스와 달리 다중 상속도 지원

 

프로토콜 채택하기

  • 클래스, 구조체, 열거형에서 정의한 프로토콜을 채택하기 위해서는 콜론(:)을 사용
  •  하나의 타입에서 다수의 프로토콜을 채택하기 위해서는 콤마(,)를 사용
  • 클래스에서 상속과 프로토콜 채택을 동시에 하려면 상속받으려는 클래스를 먼저 명시한 뒤,  채택할 프로토콜 목록을 작성
protocol SomeProtocol {}

// 프로토콜 채택
struct SomeStructure: SomeProtocl {}

// 다수의 프로토콜 채택
struct SomeStructure: SomeProtocol, AnotherProtocol {}

// SomeSuperClass를 상속 받고 있고, SomeProtocl을 채택한 클래스 정의
class SomeClass: SomeSuperClass, SomeProtoc {}

 

프로토콜 프로퍼티

  • 프로퍼티는 타입과 이름만 작성
  • gettable/settable 여부를 작성
  • 프로퍼티는 var로 선언

 

프로토콜 메서드

  • 메서드 작성 가능
  • 일반적인 메서드 와는 달리 본문은 작성하지 않음
protocol SomeProtocol {
    var a: Int { get }
    var b: Int { get set }
    func setNumber(a: Int, b: Int)
    func add() -> Int
}

class SomeClass: SomeProtocol {
     var a: Int = 0
     var b: Int = 0
     
     func setNumber(a: Int, b: Int) {
         self.a = a
         self.b = b
     }
     func add() -> Int {
         return a + b
     }
}

 

프로토콜 이니셜라이저

  • 프로토콜에서는 필수로 구현해야 하는 이니셜라이저를 지정 가능
  • 이니셜라이저가 있는 프로토콜을 채택한 타입에서는 해당 이니셜라이저에 required 키워드를 작성해야 함
protocol SomeProtocol {
	init(someParameter: Int)
}
class SomeClass: SomeProtocol {
     required init(someParameter: Int) {
     }
}

 

프로토콜 상속

  • 프로토콜은 하나 이상의 프로토콜을 상속받아 기존 프로토콜의 요구사항보다 더 많은 요구사항을 추가할 수 있음
  •  프로토콜 상속 문법은 클래스의 상속 문법과 유사하지만, 프로토콜은 클래스와 다르게 다중상속이 가능

 

클래스 전용 프로토콜

  • 구조체, 열거형에서 사용하지 않고 클래스 타입에만 사용가능한 프로토콜을 선언하기 위해서는 프로토콜에 AnyObject 키워드를 추가
반응형

'⌨️ Language > swift' 카테고리의 다른 글

[Swift] 클로저 (Closure)  (0) 2023.02.06
[Swift] 익스텐션 (Extensions)  (0) 2023.02.06
[Swift] assert와 guard  (0) 2023.02.06
[Swift] 타입 캐스팅  (0) 2023.02.06
[Swift] 클래스(Class)와 구조체(Struct)  (0) 2023.02.06

댓글