BOID

[Swift] 프로토콜 지향 프로그래밍이란? 본문

swift 시작기

[Swift] 프로토콜 지향 프로그래밍이란?

HoonIOS 2021. 3. 21. 14:40

안녕하세요 HoonIOS입니다 :)

스위프트 버전 2.0을 발표하면서 스위프트는 프로토콜 지향 언어라고 말을 했는데요 그럼 프로토콜 지향 언어는 무엇인지에 대해 알아보겠습니다.

 

스위프트 표준 라이브러리를 보면 타입과 관련된 소스는 클래스 형태가 아니라 구조체 형태로 되어있는 것을 확인할 수 있습니다.

 

여기서 많은 분들이 의심을 가질께 구조체 형태면 상속이 되지 않는데 어떻게 그렇게 많은 기능을 구현하지?라는 의문을 가지 실수 있습니다.

- 이 해답은 프로토콜. 익스텐션, 제네릭이 있습니다.

( 익스텐션이란? , 제네릭이란? )

 

프로토콜이란?

- 아직 프로토콜은 포스팅을 하지 않아서 간단히 설명해 보겠습니다.

- 프로토콜에 정의한 프로퍼티, 메소드는 필수 정의해야 하는 조건입니다. 

- 타입마다 해당 프로토콜에 있는 메소드는 많은 코드를 중복 사용하기 때문에 유지보수가 힘들어질게 뻔하다. 그래서 이때 필요한 게 익스텐션과 프로토콜의 결합이다. 이에 대해 알아보겠습니다.

프로토콜과 익스텐션의 결합

- 프로토콜을 정의할때는 요구사항을 정의만 할 수 있는데 프로토콜의 익스텐션을 구현해주면 익스텐션 안에서 프로토콜이 요구하는 실제 기능을 구현해 줄 수 있습니다.

- 다만 익스텐션에서는 저장 프로퍼티는 구현해줄수 없으므로 저장 프로퍼티는 각각 타입에서 직접 구현해 주어야 합니다. 저번 익스텐션 포스팅에서 포스팅했던 부분입니다 ㅎㅎ

- 아래 예제를 보시면 protocol로 값을 정의해주고 extension을 통해 프로토콜이 요구하는 기능을 실제로 구현해줘 class에 할당할때는 저장 프로퍼티(옵셔널) 값만 지정해준 걸 확인할 수 있습니다.

protocol 예시

- 위예제처럼 프로토콜과 익스텐션을 결합하면 코드의 재사용성이 훨씬 증가하게 됩니다.

- 이렇게 프로토콜의 요구사항을 익스텐션을 통해 구현하는 것을 프로토콜의 초기 구현이라고 합니다.

- 만약에 프로토콜의 익스텐션에서 구현한 기능을 사용하지 않고 타입의 특성에 따라 조금 변경해서 구현하고 싶으면 프로토콜을 상속한 class { } 안에 재정의를 해주면 됩니다.

protocol 재정의

- 2번째 functionTest(_: String) -> String 메소드는 이미 프로토콜을 준수하는 타입의 메소드를 호출했으므로 특정 프로토콜 준수하는 타입에 프로토콜의 요구사항을 찾아보고 이미 구현되어 있다면 그 기능을 호출하고, 그렇지 않으면 초기 구현의 기능을 호출합니다.

 

- 스위프트의 클래스는 다중 상속을 지원하지 않으므로 부모클래스의 기능으로 부족하다면 자식 클래스에서 다시 구현해야 하지만, 프로토콜 초기 구현을 한 프로토콜을 채택했다면 상속도 추가 구현도 필요가 없습니다. 

- 구조체, 열거형은 상속을 지원하지 않지만 초기구현한 프로토콜만 채택한다면 기능을 얼마든지 추가할 수 있습니다.

 

- 프로토콜의 초기구현, 프로토콜 상속을 통해 stack을 구현한 예시를 살펴보겠습니다.

프로토콜의 상속 구현
스택 구현

- 위 예시를 보면 프로토콜 상속, 프로토콜을 초기 구현한 프로토콜을 Stack이라는 구조체에 구현해 Stack을 구현했습니다. 이런 식으로 프로토콜을 채택만으로 기능을 추가해줄 수 있는데 이것이 바로 프로토콜 지향 프로그래밍의 핵심 콘셉트 중 하나입니다.

프로토콜을 이용한 기본 타입 확장

- 프로토콜 초기 구현을 통해 스위프트 기본 타입을 확장하여 내가 원하는 기능을 공통적으로 추가할 수 있습니다.

- 스위프트의 표준 라이브러리의 실제 구현 코드를 보고 수정할 수 없으므로, 익스텐션, 프로토콜, 프로토콜 초기 구현을 사용해 추가하면 됩니다.

기본타입 확장

- 프로토콜 초기 구현을 통해 Int, String 타입에 타입 확장을 해줘 .printType() 메소드를 출력하면 해당하는 타입이 나오는 메소드를 만들었습니다.

-  위 예시와 같이 기본 타입을 확장해주려면 프로토콜 초기구현을 구현해주고 이 프로토콜을 기본 타입에 익스텐션 해주면 해당 프로토콜에 속하 타입이나 메소드를 활용할 수 있습니다.

 

지금까지 프로토콜 지향 프로그래밍에 대해서 알아보았고 그중 중요 개념인 프로토콜 초기 구현에 대해 알아보았습니다. 이번 공부하면서 느낀 거지만 프로토콜 초기 구현만 잘 구현해주면 유지보수 및 코드 관리가 쉬울 거라는 생각이 드네요..ㅎㅎ

긴 글 읽어주셔서 감사합니다. 혼자 좀 더 공부해보고 싶으면 프로토콜을 통해 기본 타입을 확장도 해보시고 한번 혼자 프로토콜 초기 구현도 구현해보시는 걸 추천해드립니다 :)

반응형
Comments