[swift] 프로토콜 데이터 타입과 관련된 Swift의 기능

Swift에서 프로토콜은 다른 타입들이 구현해야 하는 메서드, 프로퍼티, 이니셜라이저들의 청사진을 정의하는데 사용됩니다. 프로토콜은 타입의 일종이기 때문에, 변수, 상수, 함수의 인자 타입, 함수의 반환 타입 등으로 사용될 수 있습니다. 이번 블로그 포스트에서는 Swift의 프로토콜 데이터 타입 및 관련된 기능들에 대해 알아보겠습니다.

프로토콜 변수

프로토콜을 변수 또는 상수로 선언할 수 있습니다. 이렇게 선언된 변수나 상수는 해당 프로토콜을 준수하는 어떤 타입이라도 할당할 수 있습니다. 아래의 예제는 Printable이라는 프로토콜을 정의하고, Person 클래스가 이를 준수하는 예시입니다.

protocol Printable {
    func printInfo()
}

class Person: Printable {
    func printInfo() {
        print("Name: John Doe")
        print("Age: 30")
    }
}

class Animal: Printable {
    func printInfo() {
        print("Name: Dog")
        print("Breed: Labrador Retriever")
    }
}

let printable1: Printable = Person()
let printable2: Printable = Animal()

위의 예제에서 printable1Person 인스턴스를 할당받고, printable2Animal 인스턴스를 할당받습니다. Printable 프로토콜을 준수하는 어떤 타입이라도 이 변수들에 할당할 수 있습니다.

프로토콜 컬렉션

프로토콜을 배열 또는 딕셔너리 타입으로 사용할 수도 있습니다. 이 경우에는 해당 프로토콜을 준수하는 여러 개의 인스턴스들을 함께 저장하거나 처리하는데 사용됩니다. 아래의 예제는 Equatable 프로토콜을 정의하고, 이를 준수하는 Point 구조체를 사용하는 예시입니다.

protocol Equatable {
    static func ==(lhs: Self, rhs: Self) -> Bool
}

struct Point: Equatable {
    let x: Int
    let y: Int
    
    static func ==(lhs: Point, rhs: Point) -> Bool {
        return lhs.x == rhs.x && lhs.y == rhs.y
    }
}

let points: [Equatable] = [Point(x: 1, y: 2), Point(x: 3, y: 4), Point(x: 5, y: 6)]

위의 예제에서 points 배열은 Equatable 프로토콜을 준수하는 여러 개의 Point 인스턴스들을 저장하고 있습니다. 이를 통해 배열 내의 인스턴스들을 비교하거나 처리할 수 있습니다.

프로토콜 상속

Swift에서 프로토콜은 다른 프로토콜을 상속할 수 있습니다. 이를 통해 여러 프로토콜을 하나의 프로토콜로 묶어 사용할 수 있습니다. 아래의 예제는 Drawable 프로토콜과 Resizable 프로토콜을 정의하고, 이들을 상속하는 Shape 프로토콜을 사용하는 예시입니다.

protocol Drawable {
    func draw()
}

protocol Resizable {
    func resize()
}

protocol Shape: Drawable, Resizable {
    var color: String { get set }
}

class Square: Shape {
    var color: String = "Red"
    
    func draw() {
        print("Drawing a square")
    }
    
    func resize() {
        print("Resizing the square")
    }
}

let square: Shape = Square()

위의 예제에서 Shape 프로토콜은 Drawable 프로토콜과 Resizable 프로토콜을 상속하고 있습니다. Square 클래스는 Shape 프로토콜을 준수하며, 이를 통해 Shape 타입의 변수에 해당 인스턴스를 할당할 수 있습니다.

결론

Swift에서 프로토콜은 데이터 타입으로 사용될 수 있으며, 변수, 상수, 컬렉션 타입에 할당하여 사용할 수 있습니다. 프로토콜 상속을 통해 여러 프로토콜을 한번에 사용할 수도 있습니다. 프로토콜을 사용하면 코드의 재사용성을 높여 유연하고 확장 가능한 구조를 만들 수 있습니다.