티스토리 뷰
개방-폐쇄 원칙
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 |
- Total
- Today
- Yesterday
- 12기
- 스파르타
- 팬방명록만들기
- 웹개발종합반
- 보험
- python
- 사전스터디
- 4주차
- 아이들팬명록만들기
- 공부하기
- 현재기온넣기
- (여자)아이들
- 지니차트만들기
- 항해
- ajax
- 아이들팬명록
- aihtnyc_h
- 유형검사
- 항해99
- 12기 1주차 숙제
- Til
- visualstudiocode
- 스파르타코딩
- HTML
- 웹개발3주차
- 웹개발
- 현재기온
- 초보개발자
- 2주차
- PyCharm
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |