iOS

프로토콜의 기초에 대해서...

GEEEEEEEE

프로토콜 (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