학습목표 : OCP[Open/Closed principle] 개방-폐쇄 원칙을 이해하고, 예제로 설명할 수 있다.
OCP[Open/Closed principle] 개방-폐쇄 원칙
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- "소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만
변경에 대해서는 닫혀 있어야 한다" - 로버트 C. 마틴
"자신의 확장에는 열려 있고, 주변의 변화(수정)에 대해서는 닫혀 있어야 한다" 위키북스
헷갈리지 말기
- 개방-폐쇄 원칙은 두가지의 개념이 아니라 동전의 양면처럼, 하나의 개념이 개방과 폐쇄를 가지고 있다는 의미이다.
예를들어 설명하기
첫번째, JAVA 프로그램은 어떤 운영체제에서도 JVM 을 통해 동일하게 실행된다.
(JAVA 는 OS 에 개방적이다.)
다르게 표현해보면, JAVA 프로그램 언어는 운영체제가 변경되더라도 영향을 받지 않는다.
(JAVA는 OS변경에 영향을 받지 않는다. OS 변경에 닫혀있다.)
두번째, JDBC 는 데이타 커넥션 부분만 변경하면, 어떤 DB 에서도 동일하게 사용할 수 있다.
(JDBC 는 DB 에 개방적이다.)
다르게 표현해보면, JDBC 는 DB가 중간에 변경되더라도 영향을 받지 않게 설계되어 있다.
(JDBC 는 DB의 변경에 닫혀있다.)
세번째, 나는 자동차 운전을 할 수 있다. 소나타, 그랜저, BMW...
(나는 자동차 운전에 개방되어 있다.
다르게 표현해보면, 나는 자동차가 바뀌더라도 영향을 받지 않는다.
즉 자동차가 바뀌더라도 내가 운전하는 방식은 동일해야 한다.
그림으로 이해해보기
코드로로 이해해보기
예제1) Bad
package book.oopforsprings.lec05.solid;
public class OCP운전자_NO {
public static void main(String[] args) {
// TODO Auto-generated method stub
소나타2 운전자 = new 소나타2();
운전자.drive();
그랜저2 운전자2 = new 그랜저2();
운전자2.drive();
BMW2 운전자3 = new BMW2();
운전자3.drive();
}
}
class 소나타2{
void drive() {
System.out.println("나는 소나타를 운전한다.");
}
}
class 그랜저2{
void drive() {
System.out.println("나는 그랜저를 운전한다.");
}
}
class BMW2{
void drive() {
System.out.println("나는 BMW를 운전한다.");
}
}
예제2) Good
package book.oopforsprings.lec05.solid;
public class OCP운전자_OK {
public static void main(String[] args) {
자동차[] 운전자 = new 자동차[3];
운전자[0] = new 소나타();
운전자[1] = new 그랜저();
운전자[2] = new BMW();
for(int i=0; i<운전자.length; i++) {
운전자[i].drive();
}
}
}
class 자동차{
String myCar="자동차";
void drive() {
System.out.printf("나는 %s 를 운전할 수 있다. \n", myCar);
}
}
class 소나타 extends 자동차{
public 소나타() {
myCar = "소나타";
}
}
class 그랜저 extends 자동차{
public 그랜저() {
myCar = "그랜저";
}
}
class BMW extends 자동차{
public BMW() {
myCar = "BMW";
}
}
OCP의 장점
- 유연성, 사용성, 유지보수성을 얻을 수 있다.
정리하기
- OCP 의 개방/폐쇄의 원칙은 결국 상속/인터페이스의 사용과 연결점이 있어 보인다.
특히, 인터페이스 안쪽과 바깥쪽을 구분하여 유연성있는 프로그램을 만드는것에
이번 원칙의 의미가 있지 않난 생각해 본다.
참고도서 : 스프링 입문을 위한 자바 객체 지향의 원리와 이해 (위키북스)
'객체지향 (OOP) > 객체 지향 설계 5원칙' 카테고리의 다른 글
[DIP] 객체지향 설계 5 원칙 (5) (0) | 2021.05.22 |
---|---|
[ISP] 객체지향 설계 5 원칙 (4) (0) | 2021.05.21 |
[LSP] 객체지향 설계 5 원칙 (3) (0) | 2021.05.15 |
[SRP] 객체지향 설계 5 원칙 (1) (0) | 2021.05.13 |
객체지향 설계 5원칙 (0) | 2021.05.13 |