리셋 되지 말자

OCP - 개방 폐쇄 원칙 본문

Java(폐지)/객체지향 설계 5원칙-SOLID

OCP - 개방 폐쇄 원칙

kyeongjun-dev 2020. 7. 20. 20:41

OCP-개방 폐쇄 원칙

"소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다." - 로버트 C. 마틴

역시 잘 모르겠다. 이를 의역하면 아래와 같다.

  • "자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다."
    모르겠다.

코드적으로 해석해보자면

  • "기존의 코드를 수정하지 않고, 추가적인 기능을 추가할 수 있어야 한다."

예시1 - JDBC

JDBC를 사용하는 사용자는 데이터베이스가 MySQL에서 Oracle로 바뀌더라도 Connection(연결)을 설정하는 부분 외에는 따로 수정할 필요가 없다.
Connection 설정 부분을 별도의 설정 파일로 분리해두면 클라이언트 코드는 단 한줄도 변경할 필요가 없다.
JDBC뿐만 아니라 iBatis, MyBatis, 하이버네이트 등의 데이터베이스 프로그래밍을 지원하는 라이브러리와 프레임워크에서도 개방 폐쇄 원칙의 예를 볼 수 있다.

데이터 베이스를 변경할 때, JDBC 인터페이스라고 하는 완충 장치로 인해 변화에 영향을 받지 않는다.
-> 자바 어플리케이션은 데이터베이스라고 하는 주변의 변화에 닫혀 있는 것이다.
-> 데이터베이스를 교체한다는 것은 데이터베이스가 자신의 확장에는 열려 있다는 것이다.

예시2 - 자바 언어

자바언어로 프로그래밍을 할때, 프로그래머는 자신이 작성하는 Java 코드가 윈도우에서 돌아갈지, 리눅스에서 돌아갈지 고민하지 않는다. .class 파일과 각 운영체제에서 동작하는 JVM이 있으면 되기 때문이다.
-> 자바 소스 코드는 운영체제의 변화에 닫혀있다.
-> 각 운영체제별 JVM은 확장에 열려 있는 구조가 된다.

예시3 - 자바의 각종 상속구조

Object 클래스를 상속받는 Number 클래스는Integer, Float, Long, Short 등 수많은 자료형으로 상속한다.
-> 다양한 자료형에 대해 열려 있는 구조다.
-> 자료형이 변하더라도 Number 클래스는 변화에 대해 닫혀있다.

Object 클래스를 상속받는 InputStream 클래스는 버퍼, 문자열, 에러, 파일 등 수많은 입력을 받도록 상속한다.
-> 다양한 입력에 대해 닫혀있다.
-> 입력은 입력되는 type에 대해 열려있다.

예시4 - 편의점 직원

편의점에 구매 담당 직원, 보안 담당 직원, 청소 담당 직원, 편의점 사장이 교대로 근무를 한다고 가정한다.
각자 하는 주요한 역할은 다르지만, 손님에게 '판매'하는 행위는 모두 공통된다.(직원이 바뀐다고 해서 손님의 '구매'행위에 영향이 없다. 구매라는 손님의 행위(직원의 판매) 인터페이스가 변경되지 않는 이상 )
여기서 '판매'를 인터페이스로 지정한다.
-> 직원 교대라는 주변의 변화에 손님의 구매 행위는 영향을 받지 않는다.
-> 직원은 교대라고 하는 확장 행위에 열려있다.

스프링 프레임 워크도 개방 폐쇄 원칙을 잘 활요하는 예이다.

내가 막무가내로 생각한 예시

  • 자판기에 동전을 사용할 때, 각 동전별로 투입구를 만들지 않는다. 새로운 동전이 추가되더라도 기존의 자판기에 사용할 수 있어야 한다.

  • 자판기에 카드를 사용할 때, 새로운 카드가 출시 되더라도 기존의 자판기의 카드 리더기를 새롭게 수정하지 않아도 새로운 카드를 사용할 수 있어야 한다.

'Java(폐지) > 객체지향 설계 5원칙-SOLID' 카테고리의 다른 글

SRP와 ISP  (0) 2020.07.21
ISP - 인터페이스 분리 원칙  (0) 2020.07.21
LSP - 리스코프 치환 원칙  (0) 2020.07.20
SRP-단일 책임 원칙  (0) 2020.07.20
객체 지향 설계 5원칙 - SOLID  (0) 2020.07.20
Comments