『스프링입문을 위한 자바 객체지향의 원리와 이해』로 공부한 내용을 정리한 글입니다.
개방 폐쇄 원칙 (Open-Closed Principle) 이란?
"소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다."
— 로버트 C. 마틴 (Robert C. Martin)
이 말은 즉, 기존 코드를 수정하지 않고도 기능을 확장할 수 있어야 한다는 뜻입니다. 즉, 변경이 필요한 상황이 오더라도 기존 코드를 뜯어고치지 않고 새 코드를 추가해서 해결할 수 있어야 합니다.
잘못된 설계 예시: 자동차 운전 습관 클래스
다음과 같은 예를 보겠습니다.
한 남자가 수동 변속기 차량(기어 조작과 창문 수동 조작 포함)을 운전한다고 가정해봅시다. 이 남자 클래스는 수동운전()이라는 메서드를 가지고 있고, 이 메서드는 내부에서 마티즈라는 차의 기어와 창문 조작 메서드를 호출합니다.
- 문제는 이 남자가 차를 마티즈에서 쏘나타로 바꾸면 수동운전() 메서드의 내용도 바뀌어야 한다는 것입니다.
- 마티즈는 기어수동조작()과 창문수동개방()을 사용하지만,
- 쏘나타는 기어자동조작()과 창문자동개방()을 사용하죠.
즉, 자동차를 바꾸는 순간 남자 클래스의 메서드도 바꿔야 하므로, 이건 변경에 닫혀있지 않은 구조입니다. 개방 폐쇄 원칙을 어긴 것이죠.
바람직한 구조: 인터페이스를 통한 확장
이제 올바른 구조를 살펴봅시다.
핵심 설계
- 운전자는 자동차라는 추상화된 인터페이스에 의존합니다.
- 자동차는 추상 메서드 운전()만 가지고 있습니다.
- 구체적인 자동차들 (마티즈, 쏘나타 등)은 자동차 인터페이스를 구현하고,
각각의 운전() 구현에서 자신의 기어와 창문 조작을 수행합니다.
이렇게 하면 운전자는 어떤 차든 자동차.운전()만 호출하면 되기 때문에, 자동차가 바뀌더라도 운전자 클래스는 전혀 수정할 필요가 없습니다.
→ 이게 바로 확장에는 열려 있고, 변경에는 닫혀 있는 구조입니다.
현실 예시: JDBC 드라이버 구조
현실에서도 개방 폐쇄 원칙은 JDBC에서 잘 적용됩니다.
- 애플리케이션은 JDBC 인터페이스에 의존합니다.
- 이 인터페이스는 다양한 DB 드라이버(MySQL, Oracle, MS-SQL 등)가 구현합니다.
- 데이터베이스가 바뀌더라도 애플리케이션 코드를 건드릴 필요 없이 드라이버만 교체하면 됩니다.
이처럼 인터페이스를 중심으로 한 설계는 개방 폐쇄 원칙을 잘 지키는 전형적인 구조입니다.
또 다른 현실 예시: 편의점 직원과 손님 구조
편의점에서 손님이 물건을 구매합니다. 이때 행동의 핵심은 구매하다()인데, 이 동작은 여러 직원(담당자) 중 한 명이 수행합니다.
- 구매 인터페이스를 통해:
- 구매 담당자
- 보안 담당자
- 청소 담당자
- 점장 등...
이 모두가 판매하다() 행동을 구현할 수 있습니다.
이 경우, 손님은 구매 인터페이스만 알고 있으면 되고, 어떤 담당자가 오든 그에게 판매하다()를 요청하면 됩니다. 즉, 새로운 직원이 추가되어도 손님 코드는 수정되지 않습니다. 개방 폐쇄 원칙을 만족하죠.
결론
개방 폐쇄 원칙(OCP)은 다음과 같은 구조를 만들기 위한 설계 원칙입니다:
- 새로운 기능이 추가되거나 환경이 바뀌어도, 기존 코드는 건드리지 않음
- 추상화(인터페이스/추상 클래스)와 다형성(override 등)을 이용해 기능 확장
- 실세계 문제(자동차, DB, 쇼핑, 역할)에 매우 잘 적용됨
즉, “변화에 강한 설계”, “유지보수에 유리한 구조”를 만들고자 할 때 필수로 따라야 하는 원칙입니다.
'Spring > 스프링입문을 위한 자바객체지향의 원리와 이해' 카테고리의 다른 글
ISP - 인터페이스 분리 원칙 (0) | 2025.07.03 |
---|---|
LSP - 리스코프 치환 원칙 (0) | 2025.07.02 |
SRP - 단일 책임 원칙 (0) | 2025.07.02 |
객체 지향 설계의 품질을 높이기 위한 SOLID 원칙 (0) | 2025.07.02 |
인터페이스 (0) | 2025.07.01 |