Swift/개념 & 응용

[Swift] 프로토콜 기본 구현 정의하기 (extension Protocol)

유정주 2022. 12. 31. 13:45
반응형

필요성

프로토콜은 상속과 달리 프로토콜의 정의 부분만 추가된다는 장점이 있습니다.

상속은 부모 클래스의 모든 것을 받기 때문에 프로토콜보다는 무겁죠.

또, 프로토콜은 구조체를 이용해 다형성을 구현하는 핵심 기술이기 때문에 반드시 필요합니다.

 

그렇지만 프로토콜은 프로토콜에서 정의한 모든 것을 구현해야 한다는 번거로움(?)이 있는데요.

 

프로토콜을 확장(extension)하면 이를 해소할 수 있습니다.

 

프로토콜 확장

protocol Testable {
    func hello()
    func bye()
}

실습을 위한 프로토콜입니다. (형편 없는 네이밍이지만 able은 꼭 붙여주는 ㅋㅋ)

Testable 프로토콜에서는 hello와 bye 메서드가 있어서

Testable 프로토콜을 채택하면 두 개의 메서드를 꼭 구현해줘야 합니다.

 

구현을 하지 않으면

이렇게 컴파일 에러가 발생하게 됩니다.

 

struct TestStruct: Testable {
    func hello() {
        print("hello!")
    }
    
    func bye() {
        print("bye!")
    }
}

구현을 해주면 컴파일 에러는 사라지지만,

위와 같은 동작은 다른 곳에서도 충분히 중복 구현이 될 수 있습니다.

굳이 채택하는 곳마다 "hello!"나 "bye!"를 적을 필요가 없다는거죠.

 

이럴 때 프로토콜을 확장해서 기본 구현 코드를 작성해줄 수 있습니다.

extension Testable {
    func hello() {
        print("hello!")
    }
    
    func bye() {
        print("bye!")
    }
}

어려울 거 없이,

중복될 거 같은 코드를 기본 구현으로 프로토콜에서 제공해주는 것입니다.

 

이러면

구조체에서는 아무것도 구현을 하지 않아도 에러가 발생하지 않고,

let test: TestStruct = TestStruct()
test.hello() //hello!
test.bye() //bye!

프로토콜에서 제공하는 기본 구현 메서드를 사용할 수 있습니다.

 

만약 메서드를 직접 구현해주고 싶다면

평소처럼 구조체 안에서 구현해주시면 돼요!

그럼 커스텀한 동작으로 수행할 수 있습니다.

 

프로퍼티도 가능

메서드뿐만 아니라 프로퍼티로도 가능합니다.

protocol Testable {
    var name: String { get }
    
    func hello()
    func bye()
}

extension Testable {
    var name: String {
        "시리"
    }
    
    func hello() {
        print("hello, \(name)")
    }
    
    func bye() {
        print("bye, \(name)")
    }
}

name 프로퍼티를 추가해주고 "시리"를 기본으로 제공하면

let test: TestStruct = TestStruct()
test.hello() //hello, 시리
test.bye() //bye, 시리

Testable을 채택하는 것만으로 시리에게 인사를 할 수 있고,

 

struct TestStruct: Testable {
    let name: String
}

let test: TestStruct = TestStruct(name: "정주")
test.hello() //hello, 정주
test.bye() //bye, 정주

name 프로퍼티를 직접 넣을 수도 있답니다.

 

감사합니다!


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

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

공감 댓글 부탁드립니다.

 

 

반응형