Swift/개념 & 응용

[Swift] Swift 문법 - 프로토콜(Protocol)

유정주 2021. 8. 29. 00:10
반응형

안녕하세요.

 

오늘은 프로토콜(protocol)에 대해 알아보겠습니다.

프로토콜은 java의 interface와 동일한 개념입니다.

 

Swift를 처음 공부하며 작성한 포스팅이기 때문에 부족한 내용이 있을 수 있습니다.

댓글로 알려주시면 공부해서 내용 추가하도록 하겠습니다. 미리 감사합니다!

 

그럼 바로 시작하겠습니다.


참고 자료

해당 포스팅은 Smile Han님의 유튜브 영상을 참고하며 작성하였습니다.

https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA


Protocol

프로토콜이란 특정 클래스와 관련 없는 property와 method 선언의 집합입니다.

포인트는 메서드 정의는 없고 선언만 있다는 것입니다.

클래스에서 프로토콜을 채택(adopt)해서 직접 구현(conform) 해야 합니다.

프로토콜은 java의 interface와 비슷한 개념으로 볼 수 있습니다.

 

프로토콜은 채택(adopt)한다는 표현을 사용합니다.

프로토콜의 멤버를 모두 구현하는 것을 conform 한다라고 표현합니다.

이 표현들은 에러에서 자주 나오므로 알고 계시는 것이 좋겠습니다.

 

상속과 프로토콜의 차이점으로는

상속은 클래스만 가능하지만 프로토콜 채택은 클래스, 구조체, 열거형, extension도 가능합니다.

 

Swift에는 Delegate DataSource라고 이름이 붙여진 프로토콜이 많다고 하네요.


프로토콜 사용 이유

프로토콜이라는 것은 왜 사용할까요?

언뜻 보면 클래스에서 직접 구현해야 하는 게 불필요해 보일 수 있습니다.

프로토콜을 사용함으로서 단일 상속의 한계를 극복할 수 있습니다.

예를 들어, 자동차와 자전거를 "탈 것"이라는 같은 부모 클래스로 묶기에는 공통점이 상당히 적습니다.

또한 자전거와 자동차 각각의 부모 클래스를 가지고 있을 가능성도 높습니다.

 

이럴 때 교통수단의 특징인 "타다"의 공통점을 공유할 수 있는 것이 프로토콜입니다.

protocol Transportation { 
    func ride()
}

class Car: <super class>, Transportation{
    func ride() {
    }
}

class Bicycle: <super class>, Transportation {
    func ride() {
    }
}

 

이렇게 프로토콜은 단일 상속의 한계를 극복할 수 있다는 점,

반복된 코드 작성을 피할 수 있다는 점에서 유용하게 사용 가능합니다.

 

Protocol Oriented Programming(POP)

프로토콜 단위로 묶어 표현하고, extension으로 기본적인 것을 구현(protocol default implementation)을 해서

단일 상속의 한계를 극복하고자 하는 프로그래밍 기법이라고 하네요.


프로토콜 채택

부모 클래스를 상속하는 경우에는 부모 클래스 다음에 표기합니다.

class <클래스명> : <부모 클래스명>, <프로토콜명> { }
class <클래스명> : <부모 클래스명>, <프로토콜명1>, <프로토콜명2> { }

 

부모 클래스가 없는 경우 콜론 뒤에 바로 표기합니다.

class <클래스명> : <프로토콜명> { }

 

상속과 채택(adopt)을 위 한 문장만을 가지고는 구분할 수 없습니다.

다만 전체 코드 문맥을 통해 파악할 수 있습니다.

콜론 다음 오는 게 클래스면 상속, 프로토콜이면 프로토콜 채택이겠죠?

실제 앱을 만들어보며 익숙해져야 할 듯합니다.


프로토콜 정의

프로토콜 정의는 아래 방법으로 가능합니다.

protocol 프로토콜명 {
  //property. 변수만 사용 가능.
  //method 선언
}

property에서 주의할 점은 프로토콜의 property는 무조건 var여야 한다는 것입니다.

클래스에서 채택하여 구현해야 하는데 값을 변경할 수 없는 let인 게 더 말이 안 되는 문법이겠죠.

또한 gettable, settable을 설정해줘야 합니다.

즉, 읽기만 가능한지 값을 설정할 수 있는지를 get과 set을 이용해 정의해야 합니다.

아래 예시에서 자세히 살펴봐 주세요.

 

method는 정의가 존재하면 안 되고 선언만 해야 합니다.

 

프로토콜은 클래스와 다르게 다중 상속이 가능합니다.

프로토콜에서 다른 프로토콜을 상속할 땐 프로토콜을 채택한 클래스에서 모두 구현해야 합니다.

protocol 프로토콜명: 다른 프로토콜1, 다른 프로토콜2 { 

}

 

프로토콜 예시

protocol Person {
    var name: String { get set } //gettable, settable
    var gender: Int { get } //gettable
    func breathing() //메소드 선언
}

class Jeong: Person {
    var name: String = "Unknown"
    var gender: Int = 2
    func breathing() {
        print("후우 후우")
    }
}

이렇게 프로토콜에서는 멤버를 선언만 해주고

프로토콜을 채택한 클래스에서 정의를 해줍니다.

 

채택한 프로토콜의 멤버 정의가 없다면

error: type 'Jeong' does not conform to protocol 'Person' 에러가 납니다.


오늘은 프로토콜에 대해 알아보았습니다.

Swift의 단일 상속의 한계를 극복하기 위한 필수 요소인 프로토콜!

상황에 맞게 잘 사용하기 위해서는 경험치가 필요해 보이네요.

 

감사합니다!


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

반응형