Skip to content
난이도 출제 빈출문제은행 5

SOLID 원칙과 재사용 ​

SOLID(SRP, OCP, LSP, ISP, DIP, 객체지향 설계 5원칙)는 객체지향 설계를 변경에 강하게 만드는 다섯 원칙의 첫 글자를 모은 말이다. 로버트 마틴(Robert C. Martin)이 2000년 논문에서 원칙들을 정리했고, 마이클 페더스(Michael Feathers)가 2004년 무렵 SOLID라는 약어를 붙였다. 시험은 원칙의 정의를 주고 약어나 이름을 쓰게 하는 형태가 대부분이다. 뒤에서는 이미 만든 기능을 다시 쓰는 재사용(reuse)의 규모별 분류도 함께 본다.

다섯 원칙 한눈에 ​

약어이름한 문장 정의
SRP단일 책임 원칙(Single Responsibility Principle)클래스는 하나의 책임만 가진다
OCP개방-폐쇄 원칙(Open-Closed Principle)확장에는 열고 수정에는 닫는다
LSP리스코프 치환 원칙(Liskov Substitution Principle)자식은 부모 자리를 대신할 수 있어야 한다
ISP인터페이스 분리 원칙(Interface Segregation Principle)쓰지 않는 메서드에 의존하지 않게 한다
DIP의존 역전 원칙(Dependency Inversion Principle)구체가 아닌 추상에 의존한다

원칙마다 위반과 해결 ​

각 원칙은 "이렇게 하면 곤란하다"는 장면으로 기억하면 쉽다.

SRP 는 클래스가 바뀌는 이유가 하나뿐이어야 한다는 원칙이다. Report 클래스가 내용 계산과 PDF 출력까지 맡으면, 출력 형식만 바꿔도 계산 코드가 든 클래스를 건드린다. 계산과 출력을 두 클래스로 나누면 해결된다.

OCP 는 기능을 추가할 때 기존 코드를 고치지 않고 새 코드를 더하는 방식으로 하라는 원칙이다. 결제 수단이 늘 때마다 if (type == ...) 분기를 고치는 대신, Payment 인터페이스를 두고 새 구현 클래스만 추가한다.

LSP 는 바바라 리스코프(Barbara Liskov)의 이름을 딴 원칙으로, 부모 타입을 쓰는 코드에 자식 객체를 넣어도 올바르게 동작해야 한다는 뜻이다. Rectangle을 상속한 Square가 너비만 바꿔도 높이까지 바뀌게 만들면, 사각형을 기대한 코드가 깨진다. 이럴 때는 상속 관계를 다시 설계한다.

ISP 는 큰 인터페이스(interface) 하나보다 쓰임새별 작은 인터페이스 여럿이 낫다는 원칙이다. 인쇄만 하는 기기가 print·scan·fax가 다 든 인터페이스를 구현하면 쓰지도 않는 메서드를 억지로 채워야 한다. 인터페이스를 기능별로 쪼갠다.

DIP 는 상위 모듈이 하위 모듈의 구체 클래스가 아니라 추상화(abstraction, 보통 인터페이스로 구현한다)에 기대야 한다는 원칙이다. 주문 서비스가 MySqlRepository를 직접 만들면 저장소를 바꿀 때 서비스도 고쳐야 한다. Repository 인터페이스에 의존하게 하고 구현은 밖에서 넣어 준다.

재사용 ​

재사용은 이미 만들어 검증한 기능을 새 시스템에서 다시 쓰는 일이다. 처음부터 만들지 않으니 비용과 시간이 줄고, 실제로 돌려 본 코드라 결함도 적다. 그러려면 만드는 쪽이 다른 사람도 쓸 수 있게 사용법을 문서로 남겨 두어야 한다. 시험은 재사용하는 단위의 크기로 세 가지로 나눈다.

규모재사용 방식예
함수와 객체작은 코드 단위를 가져와 필요하면 고쳐 씀날짜 변환 메서드
컴포넌트(component)부품은 손대지 않고 인터페이스로만 연결결제 모듈
애플리케이션(application)공통 기능을 하는 프로그램 전체를 함께 씀공용 인증 서버

작은 단위일수록 가져와서 고쳐 쓰기 쉽고, 큰 단위일수록 손대지 않고 연결해 쓰는 방식이 된다는 흐름으로 이해하면 순서가 헷갈리지 않는다.

시험 포인트 ​

  • "기존 코드를 변경하지 않고 기능을 추가할 수 있어야 한다" → OCP(개방-폐쇄 원칙).
  • "자식 클래스는 부모 클래스의 기능을 수행할 수 있어야 한다" → LSP.
  • "사용하지 않는 인터페이스에 의존하지 않아야 한다" → ISP. "추상성이 높은 쪽에 의존" → DIP.
  • "객체는 하나의 책임만" → SRP. 약어와 한글 이름을 짝으로 쓸 수 있게 외운다.
  • 재사용 규모: 함수와 객체 · 컴포넌트 · 애플리케이션. "수정 없이 인터페이스로 통신" → 컴포넌트.

관련 문서