상세 컨텐츠

본문 제목

[iOS/Swift] Protocol 프로토콜을 재미있게 이해해보자

Swift

by Mr.Garlic 2022. 2. 19. 02:37

본문

Swift의 Protocol 프로토콜이 무엇인지 알아보자

프로토콜, 이거 우리 언제썼더라?

저는 프로토콜을 처음 델리게이트 패턴을 사용하면서 보게 되었는데요! 

뷰 컨트롤러는 이미 ViewController 클래스를 상속받아 더 이상 상속을 할 수 없음에도 불구하고 

TableView 등을 사용할 때 꼭 필요한 프로퍼티나 메소드를 위임받기 위해서 클래스 어노테이션 옆이나 

Extension으로 따로 빼서 프로토콜을 구현해두면서 처음 보게 되었어요! 

 

대충 이렇게 생겼죠? 

import UIKit

class exampleViewController: UIViewController, UITableViewDelegate, UITableVIewDataSource {
.
.
.
blah blah...
.
.
.

}

extension exampleViewController: whateverProtocol {


}

생긴 것과 언제 쓰는지를 기억해 냈으니 이제 진짜 용도와 사용 방법에 대해서 자세하게 알아봅시다! 

 

Protocol 의 용도를 이해하기

예를 들어 반이 세 개가 있습니다. 각각 댄스, 그림, 음악반 입니다. 

각각의 반에 들어가면 화려한 신고식을 치러야 합니다. 이때 유행하는 신고식은 윈드밀, 드롭킥, 개다리춤입니다. 

 

너무나도 할게 많은 신입생이 불쌍하다! 

자, 댄스반은 윈드밀 2번, 드롭킥 2번, 개다리춤 3번에 특이하게도 타투를 10개나 시키네요.

그림반에 들려면 윈드밀 1번, 드롭킥 1번, 개다리춤 2번으로 댄스 동아리보다는 덜 시키지만 그림을 10개나 그리게합니다. 

마지막으로 음악반은 선배들이 짖궃은지 윈드밀 4번, 드롭킥 4번에 개다리춤 8번, 그리고 피아노 배틀을 20회나 해야합니다. 

 

그런데 모든 반이 따로 신고식을 운영하다보니 항목을 하나 바꿀때마다 신고식 안내문을 새로 만들어야 해서 굉장히 피곤합니다. 

 

 

그런데 동아리 연합회에서 곰곰히 생각해 보니, 어차피 유행하는 윈드밀, 드롭킥, 개다리춤이 모든 반의 신고식에 다 들어간다면 

각각 따로 안내할 필요 없이 신고식 공통사항으로 만들고, 유행이 바뀌면 공통사항만 바꿔주려고 합니다. 

아래와 같이 되겠죠? 

 

그러면 각각 댄스클래스, 그림클래스, 음악 클래스에서 이 공통사항을 채택해서 횟수만 각자 정해주면 되는거죠! 

장황하게 설명했지만 결국 좋은 모듈화와 관리를 위해 프로토콜이 자주 사용된다는 것을 말씀드리려고 했답니다. 

 

Protocol 예시

 

프로토콜 내부에는 메서드와 프로퍼티 모두 구현이 가능합니다. 

대신 프로토콜은 초기화를 하지 않습니다. 초기값을 지정하지 않는다는건데요.

그냥 껍데기 역할만 잘 해주면 되기 때문입니다. 

protocol singoProtocol {

 var windmillCount: Int { get, set }
 var dropkickCount: Int { get, set }
 var gaedariCount: Int { get }
 
 func showWindmill(count: Int) 
 
 func showDropkick(count: Int) -> Pain
 
 func showGaedari() -> Shame
 
}

여기서 살펴볼 것은 함수의 경우, 파라미터가 있어도 되고 없어도 되며, 리턴값이 있어도 되고 없어도 됩니다. 마찬가지로 실제로 실행할 

구문은 함수 내에 없습니다. 그건 각각의 반에서 알아서 사용하면 되는겁니다. 

 

댄스반에서 이 프로토콜을 어떻게 사용할 지 봅시다. 

class DanceClass: SingoProtocol {
	
    //프로토콜 내에 구현된 프로퍼티나 메서드는 무조건 다 써줘야됩니다. 더 쓸게 있으면 새로 만들어주는건 괜찮습니다.
     var windmillCount = 2
     var dropkickCount = 2
     var gaedariCount = 3
     
     //댄스반만의 특징인 타투 프로퍼티는 따로 만들어 주었습니다. 
     var tattooCount = 10
     

     func showWindmill(count: Int) {
         print("윈드밀 \(count)회 돌았지 말입니다!")
     }

     func showDropkick(count: Int) -> Pain {
         print("드롭킥 \(count)회 찼지 말입니다!")
         let pain = Pain()
         pain.painImpact = count
         
         return pain
     }

     func showGaedari() -> Shame {
         print("개다리 많이 췄지 말입니다!")
         let shame = Shame()
         shame.veryShameful = true
         
         return shame
     }

}

자, 신고식 프로토콜을 따라서 시키는 대로 다 했습니다! 대신 각자 반에 맞게 필요한 값이나 구문을 넣어줬기 때문에 각 반에 적합하게 사용은 가능하겠죠??

 

어떤가요? 이해가 잘 되셨나요??

 

혹시 설명 때문에 더 이해가 안간다면 죄송합니다. 

좀더 정석적인 설명을 해주는 블로그는 더 많으니까요 ! 참고해보시기 바랍니다! 

 

Swift. Protocol, Extension 정리

 

devmjun.github.io

 

감사합니다 :) 

관련글 더보기