3.14 Concept Note - 프로토콜(Protocol) : 약속된 인터페이스

Jay·2025년 2월 6일

Level 3 - SingleView App

목록 보기
14/24

그동안 클래스를 주로 작성해 보았는데 이번엔 프로토콜이라는 새로운 개념에 대해 알아보자.

스위프트에서 프로토콜은 어려운 용어로 ’객체지향적 인터페이스’라고 정의해 볼 수 있다.
프로토콜은 여러분야에서 다양한 의미로 해석되는데 공통적으로 ’약속'의 개념이다.
우리는 앞으로 수많은 클래스를 만들게 될 것이다.

어떤 클래스들은 서로 완전히 다를수도 있고 어떤 클래스들은 아래와 같이 비슷한 속성을 지닐 수 있다.

Human,Monkey,Zombie 라는 클래스를 만든다고 생각해보자. 그들은 모두 걸을 수 있다.
그래서 각각 클래스를 설계할 때 walk()라는 메서드를 정의할 것이다.
하지만 이것을 좀 더 객체지향적으로 설계하기 위해 필요한 것이 프로토콜이다.
‘객체지향' 이라는 방대한 의미 중 하나는 무언가 공통적인 부분을 따로 떼어내어 관리를 편하게 하는 것이다.

Walkable이라는 프로토콜을 만들고 내부에 walk()라는 메서드를 선언했다.
프로토콜은 클래스가 아니므로 메서드를 구현하지 않고 단순히 선언만 한다.
다만 필수적인 메서드가 아니라면 ‘optional’ 키워드를 추가하여 선택사항으로 맡겨 둘 수 있다.

이제 이 프로토콜을 따르게 되면 프로토콜 내부의 메서드를 구현하기로 ’약속’을 하는 것이다.
클래스나 스트럭처를 선언할 때 콜론뒤에 프로토콜 이름을 작성하면 프로토콜을 ’채택’또는 ’준수’한다(conform) 고 표현하고 채택과 동시에 프로토콜의 필수적인 메서드를 구현해야 하는 의무를 지니게 된다.

아래와 같이 프로토콜을 선언해보자.

protocol SomeProtocol {

     func doSomething()
}

doSomething() 이라는 메서드를 선언하였으므로
이 프로토콜을 채택하는 타입은 doSomething() 메서드를 구현해야 한다.

struct AStruct: SomeProtocol {

func doSomething() {
...
   }
}

struct BStruct: SomeProtocol {

func doSomething() {
...
   }
}

이렇게까지만 보면 프로토콜의 필요성을 별로 느끼지 못할수 있다. 프로토콜을 채택하지 않아도 해당 메서드를 구현할 수 있기 때문이다. 그러나 여기서 중요한점은 AStruct 와 BStruct 는 SomeProtocol 이라는 동일한 프로토콜을 따르게 됨으로써 같은 타입처럼 다룰수 있다는 점이다.

이것만으로도 대단한 이점이 있지만 이를 기반으로 좀 더 유용한 기술을 적용하는 방법을 뒤에서 다뤄볼것이다.

profile
Software Engineer Specialized on iOS

0개의 댓글