[Java] OCP(Open/Closed Principle)
2025. 10. 20. 19:02ㆍDev./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
반응형
'Dev. > Java' 카테고리의 다른 글
| [Java] Map, 객체를 value로 활용하기 (객체 중첩) (0) | 2025.10.22 |
|---|---|
| [Java] getter/setter 왜 사용 지양해야할까? (0) | 2025.10.21 |
| [Java] Stack(스택) 자료구조 (0) | 2025.10.17 |
| [Java] 캡슐화 (0) | 2025.10.16 |
| [Java] 인터페이스와 다형성 (0) | 2025.10.15 |