[swift] 프로토콜과 제네릭 프로그래밍

이번 포스트에서는 Swift에서 프로토콜과 제네릭을 사용하여 유연하고 재사용 가능한 코드를 작성하는 방법에 대해 알아보겠습니다.

프로토콜 (Protocol)

프로토콜은 메서드, 속성 및 다른 멤버의 인터페이스를 정의하는데 사용됩니다. 클래스, 구조체 또는 열거형은 프로토콜을 채택하여 프로토콜에서 정의한 요구사항을 구현할 수 있습니다.

프로토콜을 사용하면 코드의 유연성과 확장성이 향상되며, 제네릭과 함께 사용하여 재사용 가능한 코드를 작성하는 데 도움이 됩니다.

protocol Vehicle {
    var numberOfWheels: Int { get }
    func start()
    func stop()
}

struct Car: Vehicle {
    var numberOfWheels: Int = 4
    func start() {
        print("Starting the car")
    }
    func stop() {
        print("Stopping the car")
    }
}

위의 예제에서 Vehicle 프로토콜은 numberOfWheels, start, stop 세 가지 요구사항을 정의하고, Car 구조체는 이 프로토콜을 채택하여 이 요구사항을 구현하고 있습니다.

제네릭 (Generic)

제네릭은 함수, 구조체, 열거형 및 클래스에서 실제 데이터 형식을 명시하지 않고 일반화된 형태로 코드를 작성할 수 있도록 하는 기능입니다. 이를 통해 코드 재사용성을 높이고 유연성을 확보할 수 있습니다.

제네릭을 사용하는 예시는 다음과 같습니다.

func printValue<T>(value: T) {
    print("The value is \(value)")
}

위의 예제에서 printValue 함수는 제네릭 형식 T를 사용하여 모든 형식의 값을 출력할 수 있습니다.

프로토콜과 제네릭 함께 사용하기

프로토콜과 제네릭을 함께 사용하면 특정한 형식에 의존하지 않는 유연한 코드를 작성할 수 있습니다. 프로토콜을 통해 특정 요구사항을 정의하고, 제네릭을 사용하여 다양한 형식에 대해 일반화된 코드를 작성할 수 있습니다.

예를 들어, 다음과 같이 Container 프로토콜을 정의하고 제네릭을 사용하여 여러 형식의 아이템을 담을 수 있는 컨테이너를 구현할 수 있습니다.

protocol Container {
    associatedtype Item
    var items: [Item] { get set }
    mutating func addItem(_ item: Item)
}

struct Stack<T>: Container {
    var items = [T]()
    mutating func addItem(_ item: T) {
        items.append(item)
    }
}

위의 예제에서 Container 프로토콜은 Item 형식을 요구하고, Stack 구조체는 제네릭 형식 T를 사용하여 Container 프로토콜을 채택하고 있습니다.

프로토콜과 제네릭은 Swift에서 강력한 도구로, 재사용 가능하고 유연한 코드를 작성하는 데 큰 도움을 줍니다.

이상으로 Swift에서의 프로토콜과 제네릭 프로그래밍에 대해 알아보았습니다. 함께 읽어주셔서 감사합니다.

References