본문 바로가기
기술 면접 대비

CS 면접 질문 정리 4 - OOP의 SOLID 5원칙이란?

by jeongttak 2025. 7. 7.

SOLID 5원칙은 객체지향 프로그래밍(OOP)에서 코드의 유지보수성과 확장성을 높이기 위해 따라야 할 설계 원칙들입니다. SOLID는 다섯 가지 원칙의 약자로, 각각 Single Responsibility Principle, Open/Closed Principle, Liskov Substitution Principle, Interface Segregation Principle, Dependency Inversion Principle를 의미합니다. 하나씩 간단히 설명드릴게요.

1. Single Responsibility Principle (단일 책임 원칙, SRP)
- 한 클래스는 하나의 책임만 가져야 합니다.
- 특징: 클래스가 여러 역할을 맡으면 수정할 때 다른 기능에 영향을 줄 가능성이 커집니다. SRP를 따르면 코드가 간결해지고 유지보수가 쉬워집니다.  
- 예시: 사용자 정보를 저장하는 클래스는 데이터 저장만 담당하고, 사용자 정보를 출력하는 로직은 별도의 클래스에서 처리해야 합니다. 예를 들어, `UserService` 클래스가 데이터 저장과 이메일 발송을 동시에 하면 SRP를 위반하는 겁니다.

2. Open/Closed Principle (개방-폐쇄 원칙, OCP)
- 클래스는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 합니다. 
- 특징: 다형성과 상속을 활용해 새로운 요구사항을 처리할 수 있도록 설계합니다.  
- 예시: 결제 시스템에서 신용카드 결제만 처리하던 코드에, 새로운 결제 방식(예: PayPal)을 추가할 때 기존 코드를 수정하지 않고 새로운 클래스를 추가해 구현하는 방식입니다.

3. Liskov Substitution Principle (리스코프 치환 원칙, LSP)  
- 자식 클래스는 부모 클래스의 역할을 완전히 대체할 수 있어야 합니다.   
- 특징: 상속 관계에서 자식 클래스가 부모 클래스의 계약(기능, 제약)을 위반하지 않도록 합니다.  
- 예시: `Bird` 클래스의 `fly()` 메서드가 모든 새가 날 수 있다고 가정하면, 펭귄(날지 못하는 새)을 자식 클래스로 만들 때 `fly()`를 빈 메서드로 두면 LSP를 위반합니다. 대신, 날 수 있는 새와 날 수 없는 새를 별도의 인터페이스로 분리해야 합니다.

4. Interface Segregation Principle (인터페이스 분리 원칙, ISP)
- 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 합니다.    
- 특징: 큰 인터페이스를 여러 개의 작은 인터페이스로 나누어, 필요한 기능만 구현하도록 합니다.  
- 예시: `Printer` 인터페이스가 `print()`, `scan()`, `fax()` 메서드를 모두 가지면, 단순히 출력만 하는 프린터는 불필요한 메서드를 구현해야 하므로 ISP를 위반합니다. 이를 `Printable`, `Scannable` 같은 작은 인터페이스로 나누는 게 좋습니다.

5. Dependency Inversion Principle (의존성 역전 원칙, DIP)  
-  고수준 모듈은 저수준 모듈에 직접 의존하지 않고, 추상화(인터페이스나 추상 클래스)에 의존해야 합니다.  
- 특징: 의존성을 주입(Injection)하거나 인터페이스를 통해 결합도를 낮춥니다.  
- 예시: `OrderService` 클래스가 직접 `MySQLDatabase`에 의존하면, 데이터베이스를 변경할 때 코드 수정이 필요합니다. 대신 `Database` 인터페이스를 만들어 `OrderService`가 이에 의존하도록 하면, MySQL이나 PostgreSQL로 쉽게 전환할 수 있습니다.


SOLID 원칙을 따르면 코드의 유연성이 높아지고, 새로운 요구사항이나 변경 사항에 쉽게 대응할 수 있습니다. 또한, 코드가 더 읽기 쉽고 테스트하기 쉬워져 유지보수가 간편해집니다. 예를 들어, Spring 프레임워크는 DI(의존성 주입)를 통해 DIP를 잘 구현한 사례입니다.

하츠투하츠 이안