개방-폐쇄 원칙
Open-Closed Principle, OCP
“소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다.” - 로버트 C. 마틴
'자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다'
Java의 Database 연결
Java에는 데이터베이스에 접속할 수 있도록 도와주는 JDBC 라는 API 가 존재합니다.
이 JDBC 를 개방-폐쇄 원칙의 예로 들 수 있습니다.
개발을 할 때 우리는 Oracle, MySQL 등 다양한 데이터베이스를 사용하게 됩니다.
이때 만약 개발이 진행되는 과정에서 데이터베이스를 변경하게 된다고 하더라도 우리가 그동안 개발하던 코드를 전부 수정할 필요는 없습니다.
연결할 때 필요한 ID, PWD, URL 등의 설정을 담당하는 부분만 변경하면 쉽게 데이터베이스를 변경할 수 있습니다.
개방-폐쇄 원칙을 위반한 계산기
원칙 위반 증상
기능 확장을 할 때마다 기존코드를 수정해야 합니다.if else 블록이 자주 등장합니다.기능 확장을 위한 코드 수정을 할 때 여러 클래스에서 다발적으로 진행이 됩니다.
public class Calculator {
private AddOperation addOperation;
private SubstractOperation substractOperation;
private MultiplyOperation multiplyOperation;
private DivideOperation divideOperation;
public Calculator(AddOperation addOperation, SubstractOperation substractOperation, MultiplyOperation multiplyOperation, DivideOperation divideOperation) {
this.addOperation = addOperation;
this.substractOperation = substractOperation;
this.multiplyOperation = multiplyOperation;
this.divideOperation = divideOperation;
}
public int add(int firstNumber, int secondNumber){
return addOperation.operate(firstNumber, secondNumber);
}
public int substract(int firstNumber, int secondNumber){
return substractOperation.operate(firstNumber, secondNumber);
}
public int multiply(int firstNumber, int secondNumber){
return multiplyOperation.operate(firstNumber, secondNumber);
}
public int divide(int firstNumber, int secondNumber){
return divideOperation.operate(firstNumber, secondNumber);
}
}
public class Client {
public static void main(String[] args) {
Calculator calculator = new Calculator(
new AddOperation(),
new SubstractOperation(),
new MultiplyOperation(),
new DivideOperation()
);
int firNum = 140;
int secNum = 60;
int answer = calculator.add(firNum, secNum);
System.out.println(" + answer = " + answer);
answer = calculator.substract(firNum, secNum);
System.out.println(" - answer = " + answer);
answer = calculator.multiply(firNum, secNum);
System.out.println(" * answer = " + answer);
answer = calculator.divide(firNum, secNum);
System.out.println(" / answer = " + answer);
}
}
public class AddOperation {
public int operate(int firstNumber, int secondNumber){
return firstNumber + secondNumber;
}
}
public class SubstractOperation {
public int operate(int firstNumber, int secondNumber){
return firstNumber - secondNumber;
}
}
public class MultiplyOperation {
public int operate(int firstNumber, int secondNumber){
return firstNumber * secondNumber;
}
}
public class DivideOperation {
public int operate(int firstNumber, int secondNumber){
return firstNumber / secondNumber;
}
}
연산자를 추가하려고 할 때 코드의 변화가 너무 많이 일어납니다.
if else 조건문 블록이 존재하며 연산자 추가 시 코드변화가 빈번하게 일어납니다.
원칙 적용 방법
변화되는 부분을 추상화해서 변화를 고정 시킵니다.
기능이 추가될 때 클래스의 상속을 통해서 하위 클래스에서 기능을 구현 하도록 합니다.
기존코드를 수정하지 않아도 객체 상속의 다형성 원리에 의해 기능이 확장 되도록 합니다.
연산 클래스는 추상화된 부모 클래스를 상속받아 기능별로 구현합니다.
AbstractOperation : 추상 클래스operate : 추상 메서드
'개발 > JAVA' 카테고리의 다른 글
인터페이스 분리 원칙 (0) | 2023.01.27 |
---|---|
리스코프 치환 원칙 (0) | 2023.01.27 |
단일 책임 원칙 (0) | 2023.01.27 |
SOLID (0) | 2023.01.27 |
변수의 종류 (0) | 2023.01.20 |