[Java] OCP(Open/Closed Principle)

2025. 10. 20. 19:02Dev./Java

728x90
반응형
확장에는 열려있고 수정에는 닫혀 있어야 한다

객체지향 설계 5대 원칙(SOLID)중 하나로 기존 코드를 수정하지 않고도 새 기능이나 요구사항을 추가할 수 있어야 한다는 개념이다.

계산기 예제로 살펴보면

좋지못한 설계

class Calculator {
    public double calculate(double x, double y, String operator) {
        if (operator.equals("+")) return x + y;
        else if (operator.equals("-")) return x - y;
        else if (operator.equals("*")) return x * y;
        else if (operator.equals("/")) return x / y;
        // 나중에 새로운 연산 추가하면 여기 코드 계속 수정해야 함
        throw new IllegalArgumentException("Unknown operator");
    }
}

새로운 연산 추가시 메서드를 직접 수정해야한다 - OCP 위반

OCP 준수한 설계

public enum OperatorType {
    ADD("+", (x, y) -> x + y),
    SUB("-", (x, y) -> x - y),
    MULTIPLY("*", (x, y) -> x * y),
    DIVIDE("/", (x, y) -> x / y);
    
    private final BiFunction<Double, Double, Double> op;

    OperatorType(String symbol, BiFunction<Double, Double, Double> op) {
        this.op = op;
    }

    public double apply(double x, double y) {
        return op.apply(x, y);
    }
}

 

  • 새로운 연산을 추가하려면 enum 상수 하나만 추가
  • 기존 apply() 메서드는 수정할 필요 없음
  • 확장에는 열려 있고, 수정에는 닫혀 있음 → OCP 준수한 설계

적용 예시

 

  • enum + 람다 → 새 연산 추가 가능
 +------------------------+
 |  ArithmeticCalculator  | >> 계산 클래스
 +------------------------+
           |
           | getOperator(symbol) >> 연산자 조회
           v
 +-------------------+
 |   OperatorType    |  <-- enum 상수마다 람다식 존재
 +-------------------+
 | ADD("+")          | -> (x, y) -> x + y
 | SUB("-")          | -> (x, y) -> x - y
 | MULTIPLY("*")     | -> (x, y) -> x * y
 | DIVIDE("/")       | -> (x, y) -> x / y
 +-------------------+
           |
           v
       apply(x, y)
           |
           v
        결과 반환
  • OCP 준수 포인트
    • 새로운 연산 추가시 enum 상수만 추가
    • 기존 계산기 코드, apply() 메서드 모두 수정 없음
    • 람다식 덕분에 연산 로직이 enum 상수에 직접 캡슐화됨
  • 전략 패턴 → 새로운 알고리즘 추가 시 기존 코드는 그대로 유지
  • 상속 + 인터페이스 → 구현 클래스를 교체해서 기능 확장

 

 

 

728x90
반응형