본문 바로가기
개발 공부 일지/CS

SOLID 원칙: 객체지향 설계 원칙

by yelimu 2024. 8. 30.

SOLID는 객체지향 프로그래밍에서 소프트웨어를 더욱 유연하고 확장 가능하게 만들기 위한 5가지 설계 원칙의 약자입니다.

이를 잘 이해하고 적용하면 더욱 견고하고 유지보수하기 쉬운 소프트웨어를 개발할 수 있습니다.

1. 단일 책임 원칙 (Single Responsibility Principle, SRP)

  • 정의: 하나의 클래스는 하나의 책임만 가져야 합니다.
  • 설명: 한 클래스가 너무 많은 일을 하게 되면 변경이 발생할 때마다 다른 부분에도 영향을 미쳐 유지보수가 어려워집니다. 따라서 각 클래스는 명확하고 단일한 책임을 가져야 합니다.

2. 개방-폐쇄 원칙 (Open-Closed Principle, OCP)

  • 정의: 확장에는 열려 있되, 변경에는 닫혀 있어야 합니다.
  • 설명: 새로운 기능을 추가할 때 기존 코드를 수정하지 않고 확장할 수 있어야 합니다. 이를 위해 인터페이스, 추상 클래스, 상속 등을 활용합니다.

3. 리스코프 치환 원칙 (Liskov Substitution Principle, LSP)

  • 정의: 자식 클래스는 언제든지 부모 클래스로 대체될 수 있어야 합니다.
  • 설명: 자식 클래스가 부모 클래스의 기능을 변경하거나 예상치 못한 동작을 하면 코드의 안정성이 떨어집니다. 따라서 자식 클래스는 부모 클래스의 계약을 준수해야 합니다.

4. 인터페이스 분리 원칙 (Interface Segregation Principle, ISP)

  • 정의: 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 특화해야 합니다.
  • 설명: 하나의 거대한 인터페이스보다는 여러 개의 작고 특화된 인터페이스를 사용하여 클라이언트의 의존성을 줄입니다.

5. 의존성 역전 원칙 (Dependency Inversion Principle, DIP)

  • 정의: 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 합니다.
  • 설명: 구체적인 클래스에 대한 의존성을 줄이고 인터페이스나 추상 클래스에 의존하도록 설계하여 결합도를 낮춥니다.

SOLID 원칙을 지켜야 하는 이유

  • 유지보수성 향상: 코드의 변경이 다른 부분에 미치는 영향을 최소화하여 유지보수 비용을 절감합니다.
  • 확장성 향상: 새로운 기능을 추가하거나 변경하기가 용이하다.
  • 테스트 용이성 향상: 각 클래스가 단일 책임을 가지므로 테스트 케이스 작성이 용이해집니다.
  • 재사용성 향상: 잘 설계된 클래스는 다른 프로젝트에서도 재사용할 수 있습니다.

SOLID 원칙 적용 예시

  • SRP: 사용자 정보를 관리하는 클래스는 사용자 정보를 저장하고 조회하는 기능만 담당하고, 사용자 인증 기능은 별도의 클래스에서 처리합니다.
  • OCP: 새로운 결제 방식이 추가될 때 기존 결제 시스템 코드를 수정하지 않고 새로운 결제 모듈을 추가합니다.
  • LSP: 사각형 클래스를 상속받은 정사각형 클래스에서 높이와 너비를 독립적으로 변경할 수 없도록 제한합니다.
  • ISP: 프린터 인터페이스를 여러 개의 작은 인터페이스로 분리하여 흑백 프린터, 컬러 프린터 등 각 기능에 맞는 인터페이스를 제공합니다.
  • DIP: 데이터베이스 연결 클래스를 추상화하여 구체적인 데이터베이스 종류에 의존하지 않도록 합니다.