날쌘 개발자

Protocols - (1) 본문

ios/기본문법

Protocols - (1)

훈식이 2022. 4. 7. 17:56
728x90

프로토콜 - (1)

이번에는 프로토콜에 대해서 정리해보려 한다.
아직 이해가 부족해 틀린부분이 있을수도 있으므로 틀린부분이 있다면 지적 부탁드립니다..

먼저 프로토콜이란, "특정 역할을 수행하기 위한 메소드, 프로퍼티, 기타 요구사항 등의 청사진", "약속, 규약"
구조체, 클래스, 열거형들에서 프로토콜을 "채택"하여 특정 기능을 실행하기 위한 프로토콜의 요구사항을 실제로 구현할 수 있다.
+구현해야 할 요구사항을 지정하는 것 이외에도, 프로토콜을 확장(extension)하여 이러한 요구사항 중 일부를 구현하거나, conforming타입에서 활용할 수 있는 추가 기능을 구현할 수도 있다.

중요한점은 프로토콜은 기능을 정의하고 제시할 뿐 스스로 기능을 구현하지는 않는다는 것.

  • 기본형태
protocol MyProtocol {
    func something()
}

이런식으로 생성한 프로토콜을 구조체, 클래스 등에서 채택(adopted)하기 위해서는

struct MyStruct: MyProtocol {
    func something() {
        // something do
    }
}

이런식으로 상속받는것과 비슷한 형태로 프로토콜을 채택 할 수 있는데,
한번에 하나씩이 아닌, 여러개의 프로토콜을 동시에 채택할 수도 있다.

위의 예시는 프로토콜에서 메소드의 헤드를 구현한것이고, 채택한 구조체에서 (상속한 프로토콜의)메소드의 헤드를 가져온 뒤 메소드의 바디부분을 구현하면 된다.


다음은 프로토콜에서 프로퍼티를 구현하는것을 알아보자.
프로토콜에서 프로퍼티를 구현할 때는 읽기/쓰기 (gettable/settable) 속성을 부여해주어야 한다.

protocol MyProtocol {
    var name: String { get }
}

struct MyStruct: MyProtocol {
    var name: String
}

위는 name프로퍼티를 요구사항으로 가진 MyProtocol을 생성한 후, MyStruct구조체가 채택한 예시인데, 여기서 MyStruct가 MyProtocol을 채택하였으므로 요구사항인 name프로퍼티를 구현하는것은 필수이다.
이것을 프로토콜을 준수(conform)한다고 하며, 이를 지키지 않으면 에러가 발생한다.


프로토콜에서 프로퍼티를 선언할때는 가변성에 상관없이 무조건 var을 사용해 선언한다.
그렇다면 프로퍼티의 가변성을 결정하는것은? 뒤에 붙는 get / set 이 프로퍼티의 가변성을 결정

읽기와 쓰기 모두 가능한 프로퍼티는 프로퍼티의 정의 뒤에 get set 이라고 명시하며,
읽기 전용 프로퍼티는 프로퍼티의 정의 뒤에 get 이라고 명시한다.

protocol MyProtocol {
    var name: String { get }
}

struct MyStruct: MyProtocol {
    let name: String
}
var nalSsen = MyStruct(name: "NalSsen dev")
nalSsen.name = "Hoon" // 에러

위의 예시는 읽기전용 프로퍼티를 가진 MyProtocol인데,
구조체에서 프로퍼티를 let 으로 (= 상수 프로퍼티) 정의하였기때문에
처음 값이 할당 된 후에는, 바꿀 수 없다.


+여기서 만약 구조체에서 name 프로퍼티를 var로 선언했다면, 변수 프로퍼티로 정의가 되기 때문에
처음 값이 할당 된 후라도 바꿀 수 있다.

 

protocol MyProtocol {
    var name: String { get set }
}

struct MyStruct: MyProtocol {
    //let name: String
    var name: String
}

위의 예시에서 프로토콜(MyProtocol)은 읽기와 쓰기 전용인 name 프로퍼티를 갖기때문에,
프로토콜을 채택한 구조체는 name프로퍼티를 읽기와 쓰기가 가능하게 정의해야 한다.
주석과 같이 let으로 상수 프로퍼티를 선언한다면 프로토콜의 요구사항과 다르게 쓰기가 불가능해지기 때문에 프로토콜을 준수하지 않는것이 된다.


공부하면서도 이해가 부족해 횡설수설하는듯이 쓴 것같아 나중에 다듬을 필요가 있어 보인다.
다음에는 연산 프로퍼티를 가진 프로토콜의 정의 방법과, 메소드 요구사항, 이니셜라이저 요구사항, 익스텐션에 관해서도 차근차근 알아보겠다.

728x90

'ios > 기본문법' 카테고리의 다른 글

Design Pattern - MVMM  (0) 2022.05.15
Property - (1)  (0) 2022.04.17
MVC 에 대해  (0) 2022.04.01
components / split  (0) 2022.04.01
소문자 대문자  (0) 2022.04.01