디자인패턴, 프로그래밍 패러다임, 아키텍처/OOP

SOLID 원칙

차가운에스프레소 2023. 3. 6. 16:55

0. 개요

- SOLID 원칙이란 객체 지향 프로그래밍(OOP) 설계 5원칙을 의미한다.

- OOP는 프로그래밍을 객체 간 상호작용으로 간주한다. 그리고 그 객체는 1) 추상화, 2) 상속, 3) 다형성, 4) 캡슐화라는 특징을 기반으로 설계될 것을 권장한다.

- 이를 통해, 개발자는 코드 재사용성, 유지보수의 용이성, 개발 생산성 제고라는 이익을 취할 수 있다.

- SOLID 원칙은 그러한 OOP를 통한 이익을 극대화하기 위한 설계 원칙이라고 간주된다. 

- 그러한 SOLID 원칙은 다음과 같이 5개 원칙으로 구성되어 있다.

  • SRP(단일 책임 원칙)
  • OCP(개방 폐쇠 원칙)
  • LSP(리스코프 치환 원칙)
  • ISP(인터페이스 분리 원칙)
  • DIP(의존 역전 원칙)

- 각 원칙이 강조하는 개념은 명확히 구분되는 개념들이 아니다. 각 원칙에서 지향하는 개념들은 상호 연관되어 있다.


1. SRP(단일 책임 원칙)

- SRP는 하나의 클래스는 하나의 책임만 가져야한다는 설계 원칙이다. 이 때, 책임이라는 것은 하나의 "기능"을 의미한다고 생각하면 된다.

- 하나의 클래스에 여러 책임을 부여하게 되면, 해당 클래스가 담당하는 책임 중 몇가지에서 변경사항이 생겼을 떄, 수정해야하는 코드가 복잡해질 수 있다. 아울러, 클래스가 담당하는 기능이 여러개면, 코드의 가독성 또한 떨어질 수밖에 없다.

- 즉, SRP는 클래스의 책임을 명료화하여, 유지보수의 용이성을 극대화하기 위한 설계원칙이라 할 수 있겠다.

 


2. OCP(개방 폐쇠 원칙)

- OCP는 클래스는 확장에는 열려있고, 변경에는 닫혀있어야 한다는 설계 원칙이다.

- 이 때, 변경에 닫혀있어야 한다는 것은 실제 사용되고 있는 클래스에 변경사항이 생겼을 때, 해당 클래스를 직접적으로 수정해야만 하는 구조를 지양해야한다는 것으로 이해된다.

- 즉, OCP는 코드 재사용성을 극대화하기 위해 OOP의 특징인 상속과 다형성을 잘 구현하는 것을 권장하는 설게원칙이라 할 수 있겠다.

 


3. LSP(리스코프 치환 원칙)

- LSP는 하위 클래스는 언제나 상위 클래스로 대체될 수 있어야 한다는 설계 원칙이다.

- 즉, LSP는 OOP의 특징인 다형성을 지향하는 구조를 권장하는 설계원칙이라고 할 수 있겠다.


4. ISP(인터페이스 분리 원칙)

- ISP는 인터페이스에 대한 단일 책임을 강조하는 설계 원칙이다.

- 구체적으로, 인터페이스에 대한 단일 책임을 지향함으로써, 인터페이스를 구현한 클래스가 클래스에서 불필요한 기능을 포함하지 않게끔 해야한다는 것이다.


5. DIP(의존 역전 원칙)

- DIP는 어떤 객체를 참조해야할 떄, 변화하기 쉬운 것보다는 변화하기 어려운 것에 의존해야한다는 설계 원칙이다.

- 이 때, 변화하기 쉬운 것은 구체적인 맥락으로 구현된 클래스를 의미하고, 변화하기 어려운 것은 어떤 대상을 추상화한 인터페이스, 추상 클래스를 의미한다.

- 즉, DIP는 상속 관계를 구현할 때, 구체적인 구현체보다는 그것의 기반이 되는 추상화 인터페이스와 추상 클래스에 의존하라는 설계원칙이다.

- DIP를 통해서 개발자는 객체 간 결합도를 낮출 수 있다.

- 예컨대, 객체 A는 인터페이스 B로 구현된 객체 C,D,E에 상황에 따라 의존해야한다고 했을 떄, DIP를 통해 인터페이스 B만 의존함으로써 다형성을 이용해 객체 A의 다른 객체와의 결합도를 낮추는 것이다.

- 이처럼, DIP는 객체의 다형성이란 특징을 이용해서 객체 간 결합도를 낮추고, 이를 통해 코드 재사용성과 유지보수의 용이성의 이득을 극대화하기 위한 설계원칙으로 이해된다.


6. 정리

- SOLID 원칙은 OOP의 특징을 잘 살려, 이를 통한 개발 생산성을 극대화하기 위한 설계원칙으로 이해된다.

- SOLID는 총 5개 원칙으로 구성되어 있고, 각 원칙은 독립적인 내용이 아니며 상호 연관된다.

  • SRP(단일책임원칙)
    • 하나의 클래스는 하나의 책임(기능)만 가져야한다.
    • 코드 가독성, 유지보수의 용이성
  • OCP(개방폐쇠원칙)
    • 클래스는 확장에 열려있고, 변경에 닫혀있어야 한다.
    • 다형성과 상속에 대한 강조 -> 코드 재사용성, 유지보수의 용이성 극대화
  • LSP(리스코프 치환 원칙)
    • 하위 클래스는 언제나 상위 클래스로 교체될 수 있어야 한다.
    • 다형성에 대한 강조
  • ISP(인터페이스 분리 원칙)
    • 클래스와 마찬가지로 인터페이스는 하나의 책임만 가져야한다.
    • 추상화에 대한 강조
  • DIP(의존 역전 원칙)
    • 변화하기 쉬운  것(구현체)보다는 변화하기 어려운 것(인터페이스, 추상 클래스)에 의존해야 한다.
    • 다형성에 대한 강조 -> 코드 재사용성 극대화

7. 참고자료

- https://inpa.tistory.com/entry/OOP-%F0%9F%92%A0-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84%EC%9D%98-5%EA%B0%80%EC%A7%80-%EC%9B%90%EC%B9%99-SOLID

 

[OOP] 💠 객체 지향 설계의 5가지 원칙 - S.O.L.I.D

객체 지향 설계의 5원칙 S.O.L.I.D 모든 코드에서 LSP를 지키기에는 어려움. 리스코프 치환 원칙에 따르면 자식 클래스의 인스턴스가 부모 클래스의 인스턴스를 대신하더라도 의도에 맞게 작동되어

inpa.tistory.com

- https://minkwon4.tistory.com/281

 

[OOP] SOLID 원칙

SOLID란 클린코드의 저자 로버트 C.마틴이 2000년대 초, 객체지향 프로그래밍 및 설계의 다섯가지 원칙을 정의하였다. 이를 동료 개발자인 마이클 페더스가 앞글자를 따와서 정리한 것이 SOLID 이다.

minkwon4.tistory.com