티스토리 뷰

반응형



Protocol Type, Opaque Type 모두 얼핏 생각하면 Protocol Type은 해당 프로토콜을 채택한 타입을, Opaque Type도 해당 타입을 conform하는 세부타입을 외부에 노출되지 않게 해주는 동일 역할을 할 것으로 보여집니다.

하지만, 이 둘이 동일하다면 Opaque Type이라는 다른 명칭으로 개념이 나오지 않았을텐데요. Opaque Type은 Protocol Type과 달리, 보다 강력한 타입 보장을 하며, 타입 entity를 보존한다고 합니다.

이 특징으로인해 swift가 해당 Opaque 타입의 세부 타입을 추론할 수 있게 해준다고 하며, 일반 Protocol Type과 차이점을 갖게 됩니다. 이러한 Opaque Type, 불투명타입의 장점을 기본 Protocol type 사용 예제 코드와 함께 보면서 비교, 알아보도록 하겠습니다.

 


OpaqueType, ProtocolType 사용 전, 사용할 프로토콜 구현

ConfigurableCell이라는 프로토콜을 먼저 구현했습니다. 안의 내용을 보면 반드시 구현해야하는 configure, identifier 메서드가 보이구요. associatedtype, 연관타입도 정의되어있습니다.

ConfigurableCell을 채택하는 객체들은 associatedtype인 Model 타입을 정의할 필요가 있습니다. typealias로 정의할 수도 있고, 연관타입과 관련된 메서드에 타입을 정의하여 타입추론을 이끌어낼 수도 있는데 해당 프로토콜을 채택한 객체를 아래에서 보겠습니다.

 

ConfigurableCell을 conform한 StudentCell은 Model타입은 User타입으로 정의했습니다. 이에 따라 Model타입을 사용하는 configure method도 Model타입을 User 타입으로서 정의하게 됩니다.

이렇게 Opaque Type, Protocol Type 비교를 위해 사용할 클래스를 구성했습니다. StudentCell 뿐만 아니라 StaffCell도 있는데 위와 유사하다고 간주하고 구현 설명은 넘어가겠습니다.

 


associatedtype이 있는 ConfigurableCell ProtocolType을 반환타입으로 사용 시도

우리는 이제 ConfigurableCell을 채택한 StudentCell, StaffCell을 세부 타입은 숨기고 외부에 assocatedtype이 명시 된ConfigurableCell 타입으로서 보여지도록 하려고 합니다.

그래서 반환타입을 Protocol Type인 ConfigurableCell로 지정했지만, 컴파일 에러가 발생합니다. 이처럼 일반적인 Protocol type은 type identity를 보존하지 못하고, 위와 같은 상황에서 반환타입으로 사용이 될 수 없습니다.

* 원래 associatedtype이 명시되지 않은 protocol 타입을 반환하는 경우, protocol 성격에 따라 위 케이스에서 Protocol Type으로도 반환이 됩니다.
 protocol 내에 associatedtype이 명시되면서 발생하는 컴파일 에러에서 반환타입에 any를 넣으라고 하고 추천을 하고 있는데, any type에 대한 개념도 추후에 포스팅 해보겠습니다.

이어서 Opaque type으로 사용하면 어떻게 될지 보겠습니다.

 


Type Identity를 보존하는 Opaque Type을 반환타입으로 사용

Opaque type으로 반환타입을 바꿔보았습니다. 아까전처럼 각각의 메서드는 분명히 ConfigurableCell을 채택한 StudentCell, StaffCell을 반환하고 있지만, 컴파일 에러 없이 반환이 될 수 있는 것을 볼 수 있습니다.

 

Opaque type을 반환하는 메서드로 각 타입의 멤버를 호출해도 정상적으로 호출이 됩니다. Protocol type과 달리, Opaque type은 type identity를 보존하기 때문에, 반환과 더불어, 멤버 호출까지도 문제가 없는 것을 볼 수 있습니다.

 


항상 Protocol Type 보다 Opaque Type이 좋은것은 아니다.

Opaque Type 대신 ProtocolType을 사용해야 하는 경우도 있습니다. Protocol Type은 유연성이 있다면, Opaque Type은 type identity 를 보존하고, type에 대한 보다 강력한 보장을 한다고 기억하면 될 것 같은데요.


위 메서드를 보시면 메서드 내에서 Shape타입을 채택한 다양한 타입(Square, FlippedShape)을 반환할 수 있는 상황입니다. 이런 경우, 일반 Protocol Type인 Shape를 사용하면 컴파일 에러없이 코드가 동작됩니다.

하지만, 타입에 대한 보다 강력한 보장을 하는 Opaque Type의 경우 위와 같은 동작을 할 수가 없습니다.

 

 


오늘은 Opaque Type과 Protocol Type 두가지 타입을 반환타입으로 사용되었을때 어떤 동작이 각각 가능할지, 이를 통해 각각 어떤 특성이 있음을 알 수 있는지 보았습니다.


결국 불투명타입, 프로토콜타입이 각자 장단점, 할 수 있는 동작이 있음을 알 수 있었습니다. 이런 점을 기억해서 개발할때 특성에 맞게 Protocol Type, Opaque Type을 활용하면 될 것 같습니다.


관련 의견이 있으시면 언제든 댓글 부탁드립니다. 감사합니다. 🤗
Opaque Type, Protocol Type 관련 reference ▼

 

[Swift] Opaque Type vs Protocol Type

Swift Docs > Opaque Types 에 나오는 내용입니다! Shape 라는 프로토콜이 있다고 해봅시다! protocol Shape { func draw() -> String } Triangle, Square처럼 이 프로토콜을 컨펌하는 타입을 만들 수 있습니다. struct Triangl

eunjin3786.tistory.com

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함