[SOLID] OCP 개방-폐쇄 원칙

마라탕천재 ㅣ 2024. 8. 1. 21:16

1. OCP 란?

OCP는 객체 지향 프로그래밍의 5대 원칙 중 하나인 개방-폐쇄 원칙(Open-Closed Principle)의 약자이다. 이 원칙은 "소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다"는 것이다. 즉, 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계해야 한다는 것이다.

 

 

2. OCP 예시

// OCP가 지켜지지 않은 사례
class Rectangle {
    public double width;
    public double height;
}

class AreaCalculator {
    public double calculateArea(Rectangle rectangle) {
        return rectangle.width * rectangle.height;
    }
}

이 경우, 새로운 도형을 추가하려면 AreaCalculator 클래스를 수정해야 한다.

// OCP가 잘 지켜진 사례
interface Shape {
    double calculateArea();
}

class Rectangle implements Shape {
    private double width;
    private double height;

    public double calculateArea() {
        return width * height;
    }
}

class Circle implements Shape {
    private double radius;

    public double calculateArea() {
        return Math.PI * radius * radius;
    }
}

class AreaCalculator {
    public double calculateArea(Shape shape) {
        return shape.calculateArea();
    }
}

이제 새로운 도형을 추가할 때 AreaCalculator를 수정할 필요가 없다.

 

 

3. OCP 를 구현하는 방법

  1. 인터페이스 활용
  2. 추상클래스 활용
  3. 상속성과 다형성 이용
  4. 의존성 주입
  5. 디자인 패턴 적용(팩토리 패턴, 전략 패턴, 컴포지트 패턴, 데코레이터 패턴)

 

 

4. OCP의 장단점

장점:

  1. 유연성과 확장성이 높아짐
  2. 코드 재사용성이 증가함.
  3. 유지보수가 용이해짐.
  4. 시스템의 결합도를 낮춤

단점:

  1. 초기 설계 시 더 많은 시간과 노력이 필요함.
  2. 코드의 복잡성이 증가
  3. 과도한 추상화로 인해 가독성이 떨어짐
  4. 모든 상황에 OCP를 적용하는 것은 비효율적일 수 있음.