카테고리 없음

Swift) 개방폐쇄의 원칙

나태한개발 2024. 6. 9. 16:32

개방폐쇄 원칙(OCP)이란?

개방폐쇄 원칙은 객체 지향 설계의 SOLID 원칙 중 두 번째 원칙이다. 소프트웨어 구성 요소는 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다는 원칙이다.

잘못된 예제부터 봅시다.

 

class Rectangle {
    var width: Double
    var height: Double
    
    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }
    
    func area() -> Double {
        return width * height
    }
}

class AreaCalculator {
    func calculateArea(shape: Rectangle) -> Double {
        return shape.area()
    }
}

AreaCalculator 클래스는 Rectangle 클래스에 의존하고 있으며, 새로운 도형이 추가될 때마다 AreaCalculator 클래스를 수정해야 한다.

 

다음은 올바른 예제이다.

protocol Shape {
    func area() -> Double
}

class Rectangle: Shape {
    var width: Double
    var height: Double
    
    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }
    
    func area() -> Double {
        return width * height
    }
}

class Circle: Shape {
    var radius: Double
    
    init(radius: Double) {
        self.radius = radius
    }
    
    func area() -> Double {
        return .pi * radius * radius
    }
}

class AreaCalculator {
    func calculateArea(shape: Shape) -> Double {
        return shape.area()
    }
}

// 사용 예시
let rectangle = Rectangle(width: 5, height: 10)
let circle = Circle(radius: 7)
let calculator = AreaCalculator()

print(calculator.calculateArea(shape: rectangle))  // 출력: 50.0
print(calculator.calculateArea(shape: circle))  // 출력: 153.93804002589985

AreaCalculator 클래스는 Shape 프로토콜에 의존하고, 다양한 도형 클래스를 Shape 프로토콜을 구현하여 확장할 수 있다. 이를 통해 AreaCalculator 클래스는 변경 없이 새로운 도형 클래스를 지원할 수 있다.

OCP를 준수함으로써 얻을 수 있는 장점

  1. 유연성: 고수준 모듈과 저수준 모듈 간의 결합도를 낮춰 변경에 더 유연해집니다.
  2. 테스트 용이성: 프로토콜을 통해 모의 객체(mock objects)를 사용하여 테스트할 수 있어 테스트가 용이해집니다.
  3. 유지보수성: 시스템의 한 부분을 변경하더라도 다른 부분에 미치는 영향을 최소화할 수 있어 유지보수가 용이합니다.