-
Swift - Protocol CompositionProgramming/Swift 2022. 1. 3. 11:20
안녕하세요 BeePeach입니다 :)
오늘 공부해볼 내용은 protocol composition입니다.
Composition의 의미가 애매할 수 있는데 합성, 조합을 의미한다고 생각하면 됩니다.
이미 존재하는 Protocol을 조합해서 여러 개의 protocol을 동시에 만족시키는 Type을 만들어냅니다.
주의할 점은 새로운 Type을 만든 것은 아니고 기존에 존재하는 것을 조합했을 뿐입니다.
Protocol Composition
헷갈릴 수 있는 부분을 먼저 집고 넘어가는게 좋을 거 같네요.
이전에 protocol을 채용할때 TypeName 옆에 : (colon)을 적고 , (comma)로 구분해서 여러 개의 protocol을 채용할 수 있다고 했습니다.
그럼 이게 Compostion(조합)아니야?? 여러 개를 섞었잖아! 이거랑 뭐가 다른데??라고 헷갈릴 수가 있습니다.
자 예제와 함께 천천히 생각해보도록 하겠습니다.
Named, Aged protocol을 선언한 뒤 Person과 Dog라는 구조체가 둘 다 채용하도록 했습니다.
바로 위에서 말했던 여러개의 protocol을 채용한 모습이네요.
여기까지는 전혀 문제가 없습니다.
그럼 함수 하나를 한 번 만들어볼까요??
wishHappyBirthday(to:) 함수는 Person을 파라미터로 받아서 생일 축하 메시지를 출력하는 함수입니다.
그럼 이 함수의 파라미터로는 Person밖에 못들어가겠죠??
사람만 축하해줘야 할까요?ㅠㅠ 강아지도 축하해주고 싶은데요...
Person과 Dog는 다른 Type이지만 같은 protocol을 채용하고 있습니다.
Named와 Aged를 채용하고 있죠.
!! 이전 포스팅에서 우리는 protocol은 Type으로도 사용되고 함수의 파라미터로도 사용된다는 것을 공부했었습니다.
그럼 celebrator의 Type을 protocol로 해주면 둘 다 사용할 수 있겠네요!
자 이제 파라미터의 Type을 변경하려고 했는데 문제가 생겼습니다.
Named와 Aged를 둘 다 채용하고 있었으므로 두 개의 protocol Type을 넣어야 하는데 어떻게 넣죠??
채용하는 것과 같이 , (comma)로 구분해서 넣어봤더니 에러가 발생합니다.
그럼 Named으로만 해볼까요??
그러면 생일 축하문에서 age 프로퍼티를 사용하는데 이 프로퍼티는 Aged protocol의 프로퍼티입니다.
그래서 또 age를 사용할 수 없다고 에러가 발생합니다.
이 상황을 어떻게 해결해야 할까요??
NamedAndAged라는 protocol을 하나 만들어서 Person과 Dog가 이 protocol 하나만을 채용하도록 바꿔야 할까요??
Syntax
이렇게 파라미터에서 여러 개의 protocol Type을 사용하고 싶을때 사용하는게 바로 Protocol Composition입니다.
Type에 여러개의 protocol을 채용하는 것과의 차이를 아시겠나요??
그럼 protocol composition 문법을 보겠습니다.
,(comma)가 아니라 &로 여러 개의 protocol을 나열하면 됩니다.
아주 간단하죠??
이제 우리는 강아지도 축하해줄 수 있게 됐습니다.
Named & Aged는 새로운 Type이 아닙니다. 기존에 존재하는 protocol을 조합했을 뿐 새로운 protocol을 만들어 낸 게 아닙니다.
이 Type은 Named와 Aged를 채용하는 Type이라면 어떤 Type이든 매개변수로 받을 수 있습니다.
둘 중에 하나라도 채용하지 않는다면 매개변수로 전달될 수 없습니다.
With Class
Protocol Composition의 특징 중 하나는 class와 같이 조합할 수 있다는 점입니다.
Struct, Enum과는 조합할 수 없습니다.
단 하나의 Class랑만 조합이 가능합니다.
그렇다면 이 Type에는 class의 subclass이면서 protocol을 채용한 Type만이 파라미터로 전달될 수 있습니다.
Cat class를 선언하고 subclass로 Persian class를 선언했습니다.
wishHappyBirthdayCat(to:) 함수는 파라미터로 Cat & Named & Aged Type을 받습니다.
Persian 인스턴스는 이 모든 것을 만족하므로 파라미터로 전달되고 함수가 실행되는 것을 확인할 수 있습니다.
하지만 Dog 인스턴스는 Cat의 subclass가 아니므로 파라미터로 전달되지 않고 에러가 발생하는 것을 확인할 수 있습니다.
참고자료
https://docs.swift.org/swift-book/LanguageGuide/Protocols.html
Protocols — The Swift Programming Language (Swift 5.6)
Protocols A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. The protocol can then be adopted by a class, structure, or enumeration to provide an actual implementation of tho
docs.swift.org
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Protocol Extension (0) 2022.01.12 Swift - Protocol Optional Requirement (0) 2022.01.04 Swift - Protocol Inheritance (0) 2022.01.02 Swift - Protocol as Type (0) 2021.12.29 Swift - Protocol Initializer , Subscript (0) 2021.12.28