[swift] 프로토콜과 익스텐션의 결합

프로토콜은 특정 작업이나 기능의 청사진을 정의하고, 익스텐션은 기존 타입에 새로운 기능을 추가합니다. 두 기능을 결합하여 사용하면 타입에 유연하고 강력한 기능을 추가할 수 있습니다.

프로토콜과 익스텐션을 이용한 코드 재사용

프로토콜은 특정한 동작이나 기능에 대한 요구사항을 정의하므로 특정한 기능을 수행할 수 있는 타입들을 일반화할 수 있습니다. 이러한 특성은 코드 재사용을 촉진하고, 각 타입들이 특정 작업을 수행하는 방식을 통일화할 수 있습니다.

protocol Drawable {
    func draw()
}

extension Drawable {
    func draw() {
        print("Drawing default shape")
    }
}

class Circle: Drawable {
    func draw() {
        print("Drawing a circle")
    }
}

class Square: Drawable {
    // draw()를 구현하지 않음
}

let circle = Circle()
circle.draw() // "Drawing a circle" 출력

let square = Square()
square.draw() // "Drawing default shape" 출력

위 예제에서 Drawable 프로토콜은 draw() 메소드를 요구하고, 익스텐션을 통해 기본 구현을 제공합니다. CircleSquare 클래스는 Drawable 프로토콜을 채택하고, 각각 draw() 메소드를 오버라이드하여 원하는 동작을 수행합니다. 만약 Square 클래스에서 draw() 메소드를 구현하지 않더라도 익스텐션에 정의된 기본 구현이 사용됩니다.

프로토콜과 익스텐션의 유연한 확장

기존에 구현된 타입에 새로운 기능을 추가하기 위해 익스텐션을 사용할 수 있습니다. 이때 프로토콜을 함께 사용하면 해당 타입이 특정 기능을 가지고 있음을 명시적으로 나타낼 수 있습니다.

protocol Printable {
    func printContent()
}

extension String: Printable {
    func printContent() {
        print(self)
    }
}

let greeting = "Hello, Swift!"
greeting.printContent() // "Hello, Swift!" 출력

위 예제에서 Printable 프로토콜은 printContent() 메소드를 요구하고, String 타입에 해당 프로토콜을 채택하는 익스텐션을 정의했습니다. 이로서 String 타입에 printContent() 메소드가 추가되어 문자열을 출력할 수 있게 되었습니다.

이처럼 프로토콜과 익스텐션을 결합하여 기능을 추가하고 타입을 확장함으로써 코드를 보다 유연하게 구성할 수 있습니다.

위 내용은 Swift 공식 문서를 참고하여 작성되었습니다.