[iOS_Swift] 프로토콜(Protocol) (1) - Property Requirements

2022. 1. 10. 20:23Programming/iOS_Swift

  우리는 스위프트의 언어적 특성을 얘기할 때, 함수형・객제지향과 더불어 프로토콜을 지향하는 언어라고 얘기한다. 그정도로 Swift를 이해함에 있어 프로토콜은 중요한 역할을 한다.

 

프로토콜이란?

  공식문서의 정의에 의하면, 프로토콜은 특정한 작업이나 어떠한 기능의 부분을 충족시켜주는(suit) 요구사항들, 메서드, 프로퍼티의 청사진을 정의내린다고 설명하고 있다. 말이 조금 어려운데, 쉽게 생각하면 프로토콜이란 어떤 특정한 기능을 구현함에 있어 만들어야할 체크리스트, 반드시 준수해야할 사항 리스트 같은거라고 생각하면 조금 쉬울 것 같다. 예를 들어 군인을 육성함에 있어서 훌륭한 군인을 만드는 체크리스트가 있다고 가정해보자.

 

  훌륭한 군인을 만들기 위한 메서드와 프로퍼티들을 넣어줬다. 훌륭한 군인을 만들기 위해서는 위의 메서드와 프로퍼티들을 반드시 준수해야한다! 다음으로 만든 프로토콜을 적용시켜보자.

  훈련병 클래스를 만들어줬고 훌륭한 군인 만들기 프로토콜을 채택해줬다. 채택해주면 알아서 준수해야할 메서드와 프로퍼티가 추가된다.

  메서드 내부와 프로퍼티들을 훈련병 클래스에 맞게끔 적절하게 코드를 구성해줬다.

  대략적으로 프로토콜이 무엇이고 무슨 역할을 하는 건지 살펴봤다. 이제 프로토콜의 특징들을 위의 코드를 통해 이해해보자.

 

프로토콜 특징

- 프로퍼티 관련

1. 프로토콜에서 프로퍼티에 대한 정보는 오직 이름과 타입, 읽기만 가능한지 읽고 쓰기도 가능한지만 요구한다. 저장 프로퍼티든 연산프로퍼티든 프로토콜 내에서는 신경쓰지 않는다. (해당 프로토콜이 채택된 클래스나 구조체 등에서 저장일지 연산일지 결정됨)

2. 만약 프로토콜에서 어떤 프로퍼티가 읽고 쓰기가 가능하게끔 선언해줬다면, 해당 프로퍼티는 상수 저장 프로퍼티와 읽기 전용 연산프로퍼티가 될 수 없다!

  반면, 읽기만 가능하게끔 선언해줬다면, 해당 프로퍼티는 모든 종류의 프로퍼티가 될 수 있다. 그리고 필요하다면, 쓰기도 가능하다!

  잘 안 와닿을 수 있는데, 위 2가지 특성과 관련해서 내가 짠 코드를 살펴보자.

  프로토콜에서 4개의 프로퍼티를 선언해줬다. age, weight, height은 읽고 쓰기가 가능하게, bmi는 읽기만 가능하게 만들어줬다. 해당 프로토콜을 채택한 훈련병 클래스를 보면 age, weight, height은 변수 저장프로퍼티가 되었고 bmi는 get-only 연산 프로퍼티가 되었음을 확인할 수 있다. 특징 2번에 의해, age weight height은 코드를 어떻게 구성하냐에 따라 연산프로퍼티가 될 수도 있다. 마찬가지로 bmi는 읽기만 가능하지만 필요에 따라 쓰기도 가능하게 코드를 짤 수 있다!