CS/소프트웨어 공학

[소프트웨어 공학] 객체 지향 설계(OOD) 5가지 원칙 - S.O.L.I.D 원칙

magae 2023. 7. 7. 15:41
반응형

S.O.L.I.D란?

S.O.L.I.D 원칙은 로버트 C. 마틴(Robert C. Martin)이 최초로 제안한 객체 지향 설계의 5가지 원칙이다. 이름에서 알 수 있듯, S.O.L.I.D는 5원칙의 앞글자를 하나씩 따서 만들어진 준말이다. Design Smell이 발생하지 않게 하기 위한 설계 원칙이라고 생각하면 된다.

S.O.L.I.D
Single-Responsibility Principle (SRP)
 Open-Closed Principle (OCP)
 Liskov Substitution Principle (LSP)
 Interface Segregation Principle (ISP)
Dependency Inversion Principle (DIP)

S. Single-Responsibility Principle

A class should have one, and only one reason to change.
우리가 클래스를 변경해야 하는 이유는 단 하나여야 한다.

 

클래스는 하나의 책임(Responsibility)을 가져야 한다는 원칙이다. 여기서, 책임이란 클래스가 수행하고자 하는, 수행해야 하는 역할이나 기능을 말한다. 어떤 클래스가 다양한 책임을 가질수록 클래스를 변경할 수 있는 가능성이 높아진다. 이런 변화는 이 클래스를 의존하는 다른 개체들에게 영향을 미치고, 이는 고된 디버깅이 될 것이다.


O. Open-Closed Principle

 Software entities(classes, modules, function, etc.) should be open for extension but closed for modification.
소프트웨어 개체(클래스, 모듈, 함수 등)은 확장가능해야 하지만, 수정되진 않도록 해야한다.

 

어떤 소프트웨어 개체에 대해 소스코드가 수정되지 않고 개체의 동작이 확장될 수 있어야 한다는 원칙이다. 어떤 함수나 모듈이 다른 곳에서 사용될 때마다 그 코드가 수정되어야 한다면, 이는 잘못된 설계라는 뜻이다.


L. Liskov Substitution Principle

Subtypes must be substitutable for their base types.
서브타입은 본인의 기본타입으로 치환될 수 있어야 한다.

 

모든 자식 클래스는 자신의 부모 클래스로 온전히 치환되어야 한다는 원칙이다. 우리가 어떤 클래스를 상속하여 자식 클래스를 만들고 싶을 때 확인해봄직한 원칙이다. 만약 자식 클래스가 부모 클래스를 온전히 치환하지 못한다면, 클래스보단 인터페이스(Interface)로 설계해야 한다.


I. Interface Segregation Principle

Clients should not be forced to depend on methods they do not use.
클라이언트는 본인의 사용하지 않은 메서드에 의존하도록 해선 안된다.

 

인터페이스가 필요 없는 메서드를 가져선 안된다는 원칙이다. 어떤 인터페이스(Interface)가 너무 많은 메서드를 가질 때, 그 인터페이스를 뚱뚱한 인터페이스(Fat Interface)라는 데, 뚱뚱한 인터페이스는 ISP에 위배된다. 이 뚱뚱한 인터페이스는 다른 클래스나 인터페이스에 연결될 때, 그들과의 결합력을 떨어뜨리는 문제를 일으킨다.


D. Dependency Inversion Principle

High-level modules should not depend on low-level modules. Both should depend on abstractions.
상위 모듈은 하위 모듈에 의존해선 안된다. 모두 추상화에 의존해야 한다.
Abstractions should not depend on details. Details should depend on abstractions.
추상화는 구체화에 의존해선 안된다. 구체화는 추상화에 의존해야 한다.

 

모듈의 의존관계를 추상화를 통하라는 법칙이다. 인터페이스나 추상 클래스와 같이 높은 추상화 레벨을 가지는 모듈은 대개 높은 경직성을 가진다. 따라서, 다른 모듈이 그 모듈에게 의존하더라도 그 관계가 잘 깨지지 않는다.