객체지향 (OOP)/객체 지향 설계 5원칙

[OCP] 객체지향 설계 5 원칙 (2)

고인돌개발자 2021. 5. 14. 23:28

학습목표 : 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...
(나는 자동차 운전에 개방되어 있다.
다르게 표현해보면, 나는 자동차가 바뀌더라도 영향을 받지 않는다.

즉 자동차가 바뀌더라도 내가 운전하는 방식은 동일해야 한다.

 

그림으로 이해해보기

<운전으로 보는 OCP>

코드로로 이해해보기

 

예제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 의 개방/폐쇄의 원칙은 결국 상속/인터페이스의 사용과 연결점이 있어 보인다.

특히, 인터페이스 안쪽과 바깥쪽을 구분하여 유연성있는 프로그램을 만드는것에
이번 원칙의 의미가 있지 않난 생각해 본다.

 

참고도서 : 스프링 입문을 위한 자바 객체 지향의 원리와 이해 (위키북스)