카테고리 없음
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를 준수함으로써 얻을 수 있는 장점
- 유연성: 고수준 모듈과 저수준 모듈 간의 결합도를 낮춰 변경에 더 유연해집니다.
- 테스트 용이성: 프로토콜을 통해 모의 객체(mock objects)를 사용하여 테스트할 수 있어 테스트가 용이해집니다.
- 유지보수성: 시스템의 한 부분을 변경하더라도 다른 부분에 미치는 영향을 최소화할 수 있어 유지보수가 용이합니다.