티스토리 뷰

카테고리 없음

Protocol-Oriented Programming

ccc124213131 2022. 12. 11. 11:25
728x90

Swift에서 프로토콜은 다른 유형이 준수할 수 있는 인터페이스를 정의합니다. 프로토콜은 적합한 유형이 구현해야 하는 메서드, 속성 및 기타 요구사항을 정의할 수 있습니다. 프로토콜은 다른 객체 지향 언어의 인터페이스와 비슷하지만 스위프트에서 더 유연하고 강력하다.

프로토콜 지향 프로그래밍(Protocol-oriented programming)은 스위프트에서 프로토콜을 사용하는 코드를 설계하고 구성하는 방법이다. 프로토콜 지향 프로그래밍의 아이디어는 당신의 유형의 인터페이스와 요구 사항을 지정하는 프로토콜을 정의하는 데 초점을 맞춘 다음, 그러한 프로토콜을 사용하여 당신의 유형의 동작을 정의하는 것이다. 이렇게 하면 유형의 공통적인 측면을 캡처하는 프로토콜을 정의한 다음 이러한 프로토콜을 사용하여 프로토콜을 준수하는 모든 유형에서 작동할 수 있는 코드를 작성할 수 있으므로 보다 유연하고 모듈식이며 재사용 가능한 코드가 생성됩니다.

다음은 프로토콜과 프로토콜 지향 프로그래밍이 실제로 어떻게 작동하는지 보여주는 예입니다.

protocol Shape {
    var sides: Int { get }
    func area() -> Double
    func perimeter() -> Double
}

struct Square: Shape {
    let sides = 4
    let sideLength: Double

    func area() -> Double {
        return sideLength * sideLength
    }

    func perimeter() -> Double {
        return sides * sideLength
    }
}

struct Circle: Shape {
    let sides = 0
    let radius: Double

    func area() -> Double {
        return .pi * radius * radius
    }

    func perimeter() -> Double {
        return 2 * .pi * radius
    }
}

let square = Square(sideLength: 5.0)
let circle = Circle(radius: 3.0)

// calculate the areas of the square and circle
let squareArea = square.area()
let circleArea = circle.area()

// calculate the perimeters of the square and circle
let squarePerimeter = square.perimeter()
let circlePerimeter = circle.perimeter()

이 예에서는 다음을 수행합니다.

형상 프로토콜이 정의되어 있으며, 이 프로토콜은 적합한 유형이 구현해야 하는 측면, 면적 및 둘레 요구사항을 지정합니다.

사각형 및 원 구조는 모두 형상 프로토콜을 준수하므로 측면, 면적 및 둘레 요구사항을 구현해야 합니다.

사각형 및 원 상수는 적절한 값으로 사각형 및 원을 초기화하여 생성됩니다.

면적과 둘레 방법은 정사각형과 원에서 호출되어 형상의 면적과 둘레를 계산한다.

Shape 프로토콜은 사각형과 원형 유형이 준수해야 하는 공통 인터페이스를 정의하기 때문에 프로토콜 지향 프로그래밍의 예입니다. 쉐이프 프로토콜을 준수함으로써 사각형과 원형 유형은 내부 구현이 다른 다른 유형임에도 불구하고 쉐이프와 함께 작동하는 코드에서 상호 교환적으로 사용될 수 있다. 이는 Shape 프로토콜을 사용하는 코드가 프로토콜에 의해 정의된 메서드, 속성 및 기타 요구 사항만 알고 있으면 되며 사각형 및 원 유형이 구현되는 방법에 대한 구체적인 세부 정보는 알 수 없기 때문입니다.

프로토콜 지향 프로그래밍은 사용자 유형의 공통적인 측면을 캡처하는 프로토콜을 정의한 다음 이러한 프로토콜을 사용하여 프로토콜을 준수하는 모든 유형에서 작동할 수 있는 코드를 작성할 수 있기 때문에 보다 유연하고 모듈식이며 재사용 가능한 코드로 이어질 수 있습니다. 이렇게 하면 코드가 반복되는 것을 방지하고 코드를 더 쉽게 유지 관리하고 확장할 수 있습니다.

let shapes: [Shape] = [square, circle]

for shape in shapes {
    print("This shape has \\(shape.sides) sides and an area of \\(shape.area())")
}

이 코드에서 도형 배열은 도형 객체의 배열로 정의되며 사각형과 원으로 초기화됩니다. 사각형과 원은 모두 Shape 프로토콜을 준수하므로 Shape 배열에서 서로 교환하여 사용할 수 있습니다.

그런 다음 코드는 도형 배열의 요소 위에서 반복되고 각 도형에 대한 정보를 출력합니다. 코드는 Shape 프로토콜에 의해 정의된 sides 속성과 면적 메소드만 알면 되며 객체가 Square, Circle 또는 Shape 프로토콜을 준수하는 다른 유형인지 여부에 관계없이 Shape 배열의 모든 객체에서 이러한 속성과 메소드를 사용할 수 있습니다.

이것은 사각형과 원형 유형이 도형 프로토콜을 준수하기 때문에 도형과 함께 작동하는 코드에서 서로 교환하여 사용할 수 있는 방법의 예입니다. 이것은 코드 때문에 가능하다.

댓글