Swift

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

ziziDev 2024. 5. 20. 17:15
반응형

안녕하세요

오늘은 프로토콜에 대해서 알아보고자 합니다

 

프로토콜은 양이 방대하므로

잘 이해해야하는 부분인것 같습니다

 

Protocol

|

프로토콜

 

정리된 수 많은 게시글을 보면 청사진이다라고 말하지만

 

내 기준에서 이해하기엔 프로토콜을 정의만 한 다음

프로토콜을 채택한 곳에서 구현을 할 수 있다라고 정의를 내렸다

 

사실 Protocol이 C#과 비슷하게 사용하는건 Interface라고 생각이 들었다

인터페이스도 동일하게 구현없이 공통된 목적을 가진 함수를 만들고

구체적인 구현은 채택한 곳에서만 사용하고 있기 때문입니다

 

예를 들어서 쉽게 설명하자면

게임 중 대전게임이나 몬스터를 공격할 때

각각의 능력이나 눈에 보이는 모션은 다르지만

공통적으로 공격한다라는 함수를 구현해야하기 때문에

Attack()과 같은 공통된 함수를 만들어야합니다

 

그래서 내가 이해한

Protocol에 대한 이점은 

공통적으로 목적을 가진 함수지만 그 중에서도 사용하지 않는 인스턴스엔 Protocol을 넣지 않으면 사용하지 않아도 되기 때문에

코드의 효율성이 높아지고 메모리 낭비도 줄일 수 있다

 

구조체 클래스에서 사용이 가능하므로 효율성이 좋은 녀석 중 하나라고 생각이 든다

 

Protocol

기본 사용법

|

기본적으로 메서드를 구현해도 세부내용을 작성하지 않는것이 원칙입니다

 

이렇게 메서드만 작성되어있고

세부내용과 대괄호가 없는걸 볼 수 있습니다

 

채택 및 구현


구조체

 

 

프로토콜을 채택하고 구현하지 않으면

에러가 발생하는걸 볼 수 있습니다

fix를 클릭하면

프로토콜 메서드가 생기는걸 확인할 수 있습니다

 

 

이렇게 채택된 곳에서 코드를 작성하면 됩니다

 

 

클래스

 

 

클래스도 동일하게 채택을 한 곳에서 코드를 작성하면 됩니다

 

그리고 상속을 프로토콜에 넣고싶다면??

 

이렇게 부모클래스 뒤에 ,프로토콜을 넣으면 됩니다

 

그리고

구조체/클래스 프로토콜

예시를 여러개 보고자 합니다

 

뜬금없지만

요즘 이사준비하는 중 은행에서 업무를 빨리 처리하지 않아

화가 많이난 상태이기 때문에

공격관련으로 지어봤습니다..

 

이상한소리가 많다구요?

네 코드 보여드리겠습니당

 

이렇게 프로토콜도 여러개를 넣을 수 있답니다

근데 오 ㅐ 오류가 발생하지??

 

??!!!!

 

메서드 구현이 되지 않아서 나오는 오류입니다

프로토콜은 다시 말하지만

반드시 구현해야합니다~~!!

 

이렇게 프로토콜의 메서드 부분을

구현하면 오류가 사라진것을 볼 수 있습니다

 

Protocol

도입

|

클래스와 상속의 단점을 보완


 

상속을 하며 속성이나 메서드를 모두 사용하는 경우면 얼마나 좋을까?

하지만 상속을 하며 사용하지 않는 속성이나 메서드들도 분명 있을것이다

그래서 우리가 이것을 사용하는 이유 중 큰 부분을 차지하고 있다

 

예를 들어 자동차 클래스를 만들었다고하자

거기에 자동차 부품의 속성들이 가득할 것이다

하지만 여러 자동차 상속에서

오토바이를 상속하게 된다면?...

 

버려지는 메서드나 속성들이 한가득일것이다

 

그래서 프로토콜을 사용하려는 이유라고 생각하면 됩니다

 

protocol

요구사항

|

 

요구사항을 하나하나 살펴보도록 합시다

 

 

제가 구매하고싶은 위시템을 넣었습니다 :)

예시에서 보면 알 수 있듯이

id 프로퍼티를 get 으로 설정하였지만

프로토콜에서 채택된 IMac을 보시면 계산 속성을 사용하고 있습니다

 

또 다른 예를 통해서 알아볼까용?

 

 

여기서 저장속성과 계산속성 그리고 타입프로퍼티에 대해서 볼 수 있습니다

여기서 static은 원칙적으로 상속이 불가능하지만

⭐️class keyword⭐️를 통해서 상속이 가능합니다

 

 

 

또 다른 예제를 볼까요?

 

 

protocol에 저장한 저장속성을가지고

초기화를 하는걸 볼 수 있습니다

 

 

protocol

메서드 요구사항

|

 

 

메서드의 헤드(input/output) 형태만 요구사항으로 정리

 

 

프로토콜로  input/output이 있는 메서드인 random()을 만들어주고

클래스에서 프로토콜을 채택하여

난수를 만드는 알고리즘을 만들어 활용하는걸 볼 수 있습니다

 

 

protocol mutating

mutating은 열거형(enum) / 구조체(struct) 값타입에서 변경가능한 의미로 사용되는 함수 앞에 사용되지만

프로토콜에서도 사용이 가능합니다

 

하지만 클래스에서 사용못하는건 아닌의미입니다

만약 mutating 키워드가 있는걸 클래스에서 사용하고 싶다면

mutating 키워드는 빼고 작성하면 된다

 

 

다른 언어와 다르게 mutating이 있기 때문에 mutating 키워드를 사용해서

클래스와 구조체의 접근도 가능하다는것을

알게되었습니다

 

Protocol 생성자 요구사항

 

 

코드를 통해서 알아볼까요??

 

 

구조체는 상속이 불가하기 때문에 required가 필요없습니다

 

 

 

이렇게 예시를 통하여

프로토콜에서 생성자를 작성하면

 

클래스에서 반드시 작성해야한다는 키워드를 작성해야하고

자식클래스가 생성되면

필수적으로 작성하지 않아도

자동적으로 생성이 됩니다

 

 

이 예시에서는

상속된 클래스 + 프로토콜을 같이 채택하므로

재정의 생성자를 구현해야하는걸 확인할 수 있습니다

 

 

위 코드에서 보다시피

프로토콜에서 생성자를 만들 수도 있고

final을 구현할 때 구조체에서는 required를 붙일 필요가 없고 그 외 반드시 required가 붙어야하는걸 볼 수 있었으며

 

 

마지막으로 지정생성자를 구현하지 않아도 편의 생성자로도 구현해도 되며

생략이 가능하다는걸 알 수 있었습니다

 

다음으로  실패가능생성자가 protocol내 들어가는 경우에 대해서 알아보고자 합니다

 

실패가능 생성자

|

 

 

앞에서 배웠던것 처럼

init?() -> init() / Init?() / init!()

구현이 가능합니다

 

init() -> init?()

을 구현할 수 없습니다

 

이유는 범위가 더 넓어지기 때문입니다  

 

 

이렇게 프로토콜 1편이 끝났습니다

다음에 2편 정리를 이어서 하도록 하겠습니다

 

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

 

 

 

✏️참고

apple 공식 문서

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

반응형