티스토리 뷰

반응형

 

 

iOS개발에 사용되는 swift는 class의 경우 상속이 가능합니다. 하지만 상속은 단일상속이 가능하지요. 그리고 struct의 경우, 이러한 상속이 불가능하죠.

protocol은 class와 달리 다수의 프로토콜을 함께 채택하며 사용이 가능합니다. 또한 struct도 protocol을 채택할 수 있지요. 이렇게 다양한 프로토콜을 준수하도록 할 수 있는 개념을 protocol composition, 프로토콜 조합 이라고 한다고 합니다.

오늘은 protocol composition(프로토콜 조합) 개념을 사용하는 예시를 코드를 보며 몇가지 알아보도록 하겠습니다.

 


Protocol Composition(프로토콜 조합) 개념 코드로 알아보기

먼저, Lecture라는 구조체를 하나 정의했습니다. struct 는 생성자를 따로 구현하지 않아도 memberwise initializer(기본 생성자) 를 제공하기 때문에 이정도로 정의해도 문제없네요.

 

 

이어서 Student, VerifiedStudent protocol을 정의하고 있어요. 각기 다른 멤버와 메서드를 정의하고 있는데요. 

Student protocol은 읽기 쓰기가 가능한 lectures 변수와, mutating 메서드인 enroll 메서드를 갖고 있습니다.
VerifiedStudent는 verify 메서드를 정의하고 있습니다. 각각의 프로토콜을 준수하려면 각각 위와 같은 멤버를 구현해주어야 합니다.

 


extension과 where 절을 활용하여 protocol composition default implementation 구현하기

protocol에 대한 extension을 사용하면, 해당 protocol을 채택할때의 사용 가능한 default 구현이 가능합니다. 근데 위의 경우 VerifiedStudent protocol에 대한 단순한 extension이 아닌, where 절로 추가적인 제약을 두고 있습니다. 

where Self : Student 란, "VerifiedStudent protocol을 채택하는 당사자는 Student protocol도 준수해야해!"

같은 느낌입니다. 그렇기 때문에 extension 내부 구현내용을 보시면, Student, VerifiedStudent protocol 준수를 위해 구현해야하는 enroll, verify 메서드를 전부 만들고 있습니다.

위 extension의 구현내용을 default 로 사용하기 위해서는 VerifiedStudent, Student protocol을 모두 준수해야합니다. 이런 개념이 protocol composition의 일부라고 볼 수 있습니다.

위 extension 내용을 정말 Student, VerifiedStudent를 함께 준수할 경우에만 사용 가능한지 이어서 확인해보겠습니다.

 


protocol의 extension 기능 사용가능여부 확인하기

InternationalStudent 구조체는 Student, VerifiedStudent protocol을 둘 다 채택하고 있죠? 반면, BadStudent는 VerifiedStudent protocol만 채택하고 있습니다.

 

 

Student, VerifiedStudent protocol을 둘 다 채택하고있는 InternationalStudent 구조체만 extension으로 구현했던 enroll 메서드를 사용 가능한 것을 볼 수 있습니다.

 


'&'를 사용한 protocol composition(프로토콜 조합) 개념

protocol composition을 활용하여 정의된 대표적인 타입 예시는 Codable이 있습니다.

디코딩(Decodable), 인코딩(Encodable)이 전부 가능한 타입인데요. 위와 같이 다수의 프로토콜 사이에 '&'를 사용하면 다수의 프로토콜을 모두 지원하는 타입을 정의할 수도 있습니다.

 


오늘은 iOS protocol의 개념 중 하나인 protocol composition(프로토콜 조합) 에 대한 개념을 코드와 함께 몇가지 알아보았습니다.

이처럼 프로토콜은 다수의 프로토콜을 조합하여 세부적인 제약 지정이 가능하고, associatedtype을 사용하여 유연한 타입 정의도 가능하다는 장점이 있습니다.

많은 피드백, 의견 부탁드립니다. 감사합니다.

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
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
글 보관함