Swift

Swift | 프로토콜(Protocols)에 관하여 -2

ziziDev 2024. 5. 20. 22:30
반응형

안녕하세요

저번에 이어서 프로토콜을 좀 더 자세히 알아보고자 합니다

 

 

Protocol

|

 

protocol-1에서 다루었던 것들은

기본적으로 사용하는 이유와

전반적으로 기본적으로 속성과 메서드들을 정의하고 사용하는 방법과

 

자주 사용하진 않는다고 하는 Protocol 생성자와 실패 가능 생성자에 대해서 다루었습니다

 

우선 저번에도 말했다시피 공통된 함수를 만들어 활용할 수 있는 효율 좋은 녀석이라고 말했습니다

이번에 강의를 듣고 정리하는 부분은 프로토콜은 1급 객체라고 알 수 있었고

 

타입 캐스팅을 사용할 수 있는 부분과

신기하게도 반드시 구현해야하는걸로 알고 있었던 프로토콜 메서드를

@objc로 선언하면 선택적으로 구현해도 되고 안해도 되는 걸로 변경이 된다는 부분을 알게되었답니다 :)

 

마지막으로 프로토콜 확장에 적용하여 클래스에 적용하는것도

이 부분에서 정리하고자 합니다

 


 

 

Protocol은

타입이다 

|

First Class Citizen(일급객체)이기 때문에 타입(형식)으로 사용할 수 있습니다

 

⭐️1급객체?⭐️

변수에 저장할 수 있어야함

 

함수를 인자로 전달 할 수 있어야함

 

함수의 리턴값으로 사용할 수 있어야함

 

 

 

변수나 상수타입으로 사용할 수 있는 예제를 볼 수 있다

 

 

protocol

타입의 장점

|

 

타입의 장점은 타입캐스팅을 사용하지 않아도 된다

그리고 1급 객체이기 때문에 그냥 매개변수에 집어넣어서 활용이 가능하다

 

 

 

 

 

프로토콜인 Product를 배열로 만든 변수입니다

 

매개변수에 프로토콜을 넣어서 사용도 가능한걸 볼 수 있습니다

 

Protocol 준수성 검사

|

is / as 연산자

 

is

특정 타입이 프로토콜을 채택 유무를 확인

(bool type: true / false)

 

as

타입 캐스팅

(특성 인스턴스를 프로토콜로 변환 or 프로토콜을 인스턴스 실제 형식으로 캐스팅)

 

 

is 연산자

 프로토콜을 채택하고 있는지 유무를 확인할 수 있다

채택을 하고있다면 반드시 true를 반환할 것이고

그렇지 않다면 false를 반환하고 있는것을 확인할 수 있다

위 예제에서 반드시 true가 나오는 예제와 false가 나오는 코드를 작성해 보았습니다

 

as 연산자

업캐스팅과 다운캐스팅이 가능한데

업 캐스팅은 당연히 위로 올라가는 것이라고 생각하면 반드시 사용가능하고 오류날 염려가 없으며

다운캐스팅은 혹시나 사용못할 가능성이 농후하기 때문에

(값이 없는 가능성)

옵셔널로 사용하여 코드를 짠 형태라고 볼 수 있습니다

 

프로토콜도 상속과 다중상속이 가능

|

프로토콜도 클래스 처럼 상속이 가능합니다

프로토콜끼리 상속구조를 만드는것이 가능한데

상속 구조를 만들게 되면 상속한 프로토콜에서 다 구현을 하지 않아도 됩니다

프로토콜을 채택한 구조체나 클래스에서 채택하면 됩니다

 

 

위 코드에서

Remote + AirConRemote = SuperRemoteProtocol( + doSomthing method)

가 더해진걸 볼 수 있습니다

 

그래서 프로토콜끼리 결합된 프로토콜(상속한 프로토콜)

에서 모든 구현을 해야하는걸 볼 수 있습니다

 

클래스 전용 프로토콜

|

AnyObject

 

클래스 전용 프로토콜을 선언할 수 있습니다

 

키워드는 AnyObject입니다

 

단순하게 여태까지 Protocol 명{} 이렇게 사용했지만

클래스 전용 프로토콜을 사용하고 싶다면

protocol 프로토콜명: AnyObject{}로 작성하면 됩니다

 

 

 

우리가 앞전에 Any와 AnyObject에 대해서 배운적이 있습니다

Any는 값타입까지 포함된 모든 타입을 사용할 수 있고

AnyObject같은 경우에는 클래스 관련된 경우에만 사용이 가능하다고 했었습니다

 

그래서 구조체에서는 채택을 할 수 없습니다

 

ONLY

클래스에서만 채택이 가능합니다

 

 

프로토콜의 합성

|

프로토콜의 구조체나 클래스 뒤에 여러개를 붙일 수 있습니다

 

그리고 프로토콜 두 개 병합하는 신기한 방법도 있습니다

만약 사용하려면 &를 사용하여 연결하면 됩니다

 

 

이렇게 프로토콜을 연결하기 위해서 사용을 하며

to를 사용하는 이유는

to 레이블은 함수 호출 시 인자가 celebrator 역할을 한다는것을 명확히 하기 위해서

붙여진거라고 생각하면 됩니다

 

프로토콜의 선택적인 사용

|

지금까지 배웠던 프로토콜은 선택적이 아니라

'반드시'

구현해야한다고 배웠잖아요?

@objc 마법의 키워드만 있다면 선택적으로 구현할 수 있다구요

 

사용방법은 아주 간단하답니다

프로토콜 앞에 @objc를 추가하면 된답니다

그리고 멤버 앞에는 @objc optional 이라고 추가하면 됩니다

 

코드를 보면 더 쉬울거니까 보여드릴게요

 

 

 

 

Protocol + Extension

|

프로토콜  지향 프로그래밍

 

 

프로토콜에서

메서드 두개를 정의하고

클래스와 구조체에 각각 프로토콜을 구현하는데 둘 다 같은 문구를 사용해야하면

똑같이 두 번 같은 구문을 복붙하는건 쉬울지 몰라도 이런 클래스와 구조체가 100개라면??

정말 귀찮을것이다

 

귀찮을 때 간단히 구현하는 방법은?

protocol + extension으로 구현하면 쉬워지게 됩니다

 

 

 

그렇게 아이패드까지 구현하고 인스턴스화해서 봅시다

 

 

프로토콜 타입을 가지고 있는경우는 다르게 출력이 됩니다

on off만 프로토콜로 정의되어있기 때문에

doAnotherAction은 프로토콜에 있는 확장 메서드가 출력하게됩니다

 

 

구조체의 경우도 확인하도록 합시다

구조체도 동일하게 동작하는걸 볼 수 있습니다

 

Protocol + extension

적용 제한

|

 

프로토콜 확장에서

where절

프로토콜 확장의 적용을 제한이 가능합니다

 

'특정 프로토콜'을 채택한 타입에만 프로토콜 확장이 되도록 제한이 가능합니다

where Self

 

특정 프로토콜을 채택하지 않으면 프로토콜의 확장이 적용되지 않기 때문에

메서드를 직접 구현해야합니다

(확장이 없는것과 동일)

 

무슨말인지 잘 모를 수도 있으니 코드를 통해 이해해볼까용?

 

 

 

where self : Remote

가 있으므로

반드시 bluetooth를 사용하려면 Remote 를 사용해야하는걸로 볼 수 있습니다

 

반대로 Remote를 사용할 때는 bluetooth를 반드시 사용할 필요가 없습니다

 

특정한 상황마다 채택하여 사용할 수 있는 확장 제한을 둘 수 있는걸 배울 수 있었습니다 :0

 

 

❤️혹시나 잘못된 부분이 있다면 댓글로 알려주면 감사하겠습니다❤️

 

 

 

✏️참고

apple 공식 문서

앨런스위프트 문법 자료(강의) - ⭐️추천

 

반응형