프로토콜 (Protocol)
프로토콜은 “약속”이라고 할 수 있다.
약속이라 하면, 내가 축구 선수단을 만들고 싶은데, 이 때 필요한 것들이 무엇인지 생각해보면 선수, 감독,
그리고 스폰서 등을 얘기할 수 있다.
그래서, 선수단을 만들 때 내가 직접 선수, 감독, 스폰서를 고르는 게 아니라 이러한 것들이 필요하다고 명시해놓는 것이
바로 프로토콜이라고 할 수 있다.
그러면 이런 약속들의 구현은 어디서 이루어지냐 하면,
바로 프로토콜이 채택한 클래스, 구조체, 열거형안에서 이들을 실제로 구현해 내게 되는 것이다.
protocol FootballTeam {
var player: String { get set }
var manager: String { get set }
var sponser: String { get set }
func play()
}
struct myTeam: FootballTeam {
var player: String = "Hazard"
var manager: String = "김상식"
var sponser: String = "AIA"
func play() {
print("축구팀 완성")
}
}
프로토콜은 메서드/프로퍼티에 대한 껍데기만 제공하고, 직접 구현은 하지 않는 것이다.
프로토콜의 프로퍼티로 팬이 추가된다면 어떨까? 팬은 있을수도 있고 없을수도 있으니, optional 상태로 지정을 해보자.
import Foundation
@objc protocol FootballTeam {
var player: String { get set }
var manager: String { get set }
var sponser: String { get set }
@objc optional var fan: String { get set }
func play()
}
class myTeam: FootballTeam {
var player: String = "Hazard"
var manager: String = "김상식"
var sponser: String = "AIA"
func play() {
print("축구팀 완성")
}
}
fan이라는 프로퍼티 앞에 @objc를 붙이게 될 경우, optional의 상태를 가지게 되는데, 프로토콜 앞에도 @objc를 붙여줘야 한다.
그리고 myTeam 구조체에서 클래스로 바꾼 이유는, @objc는 Objective-C에서 사용될 수 있다는 것인데, Objective-C에서 프로토콜은
오직 클래스만이 채택할 수 있기 때문이다.
프로토콜에서 Optional 상태인 프로퍼티는 물론 채택된 구조체나 클래스에서 구현하지 않아도 오류가 발생하지 않는다.
'iOS' 카테고리의 다른 글
Hashable에 대하여 (0) | 2023.02.10 |
---|---|
UISearchController에 대하여 (0) | 2023.02.09 |
타입 캐스팅이란? (0) | 2023.02.06 |
while문에 대해 알아보자 (0) | 2023.02.06 |
Storyboard 없이 UI를 짜는 방법 (0) | 2023.02.03 |