본문 바로가기

프로그래밍 언어/Architecture

SOLID (객체 지향 설계) 설명

객체지향 프로그래밍 및 설계 다섯가지 기본 원칙 by 로버트 마틴

 

- SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지

  소프트웨어 소스 코드를 리팩터링하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다.

 

SOLID 약어 개념

A. SRP(단일 책임의 원칙)

- 개념: 작성된 클래스는 하나의 기능만을 가지며, 클래스가 제공하는 모든 서비스는 하나의 책임(변화의 축: axis of change)을 수행하는데 집중되어야 한다. 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐. 책임 변경에서 다른 책임 변경의 연쇄 작용에서 자유로울 수 있다. 

- 효과 : 코드 가독성 향상, 유지보수 용이

- 연습 방법 : 도메인에 따라 적용 방법이 다르므로, 항상 상기해서 설계할 수 있도록 한다. 두 클래스간의 관계의 복잡도를 줄인다. 

- 예시

(변경 전) / (변경 후)

SerialNumber는 변경되는 정보가 아니며, Spec은 변경이 발생할 수 있는 부분이므로 따로 클래스로 두었다.

변경이 필요하면 GuitarSpec 클래스만 변경하면 된다.

(사실 이 예제에서 본인은 SRP 적용 필요성을 아직은 못느끼겠다..)

 

B. OCP(개방폐쇄의 원칙)

- 개념: 소프트웨어 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다.

  요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다. OOP의 추상화와 다형성이 중요 메커니즘

- 연습 방법 : 변경 될 것과 변경되지 않을 것을 엄격히 구분한다. 두 모듈이 만나는 지점에 인터페이스를 정의한다. 

정의한 인터페이스에 의존하도록 코드를 작성한다. 인터페이스는 가능한 변경되어서는 안된다. 설계자에게는 예지력이 필요. 

- 예시

위의 예시에서 본다면 Guitar를 추상화하기 보다는 현악기 클래스를 두고, Guitar를 하위 개념으로 두는 것이 나아보인다. 그렇게 되면 현악기Spec 클래스로 필요하다.

OCP를 적용한 예시

 

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

- 개념: "서브 타입은 기반 타입으로 교체할 수 있어야 한다". 상속을 통한 재사용은 기반 클래스와 서브클래스 사이에 IS-A 관계가 있을 경우로만 제한되어야 한다. 그 외의 경우에는 합성(Composition)을 이용한 재사용을 해야 한다. 

 

 

 

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

- 개념: 어떤 클래스가 다른 클래스에 종속될 때에는 최소한의 인터페이스 만을 사용해야 한다. 

 

 

E. DIP(의존성역전의 원칙)

- 개념: 상위 수준의 모듈이 하위 수준의 모듈에 의존하면 안된다. 두 모듈이 모두 추상화(Abstraction)에 의존해야 한다. 추상화가 세부사항에 의존해서는 안되고, 세부 사항들이 추상화에 의존해야 한다. 

- 예시: 운영체제는 운영체제가 사용자 코드에 의존하기 않게 콜백함수 원형을 제공한다. 콜백함수는 의존관계 역전의 한 형태이다.

 


[1] https://www.nextree.co.kr/p6960/

[2] '임베디드 C를 위한 TDD'

반응형

'프로그래밍 언어 > Architecture' 카테고리의 다른 글

객체 지향 & 패턴 in C (2)  (0) 2021.09.27
객체 지향 & 패턴 in C (1)  (0) 2021.08.17