본문 바로가기
코딩 공부/CS

[CS] 객체지향설계 5원칙 : SOLID

by 현장 2023. 2. 1.

SOLID 원칙

객체지향 설계5대 원칙이라 부르는데 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 역전 원칙)을 말하고 앞자를 따서 SOILD 원칙이라고 부른다.

 

1. 단일 책임 원칙 (Single Responsiblity Principle)

 

"어떤 클래스를 변경해야 하는 이유는 오직 하나뿐 이어야한다 - 로버트 C 마틴" 

클래스는 그 책임을 완전히 캡슐화해야 함을 말한다.

 

설명

  • 작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는데 집중되어야 한다.
  • 작성된 클래스가 여러 기능을 가질 경우 기능에 대한 분기 처리를 해야 하기에 코드의 복잡도만 높아지므로 유지보수 시 좋지 않다

 

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

"소프트위어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다. - 로버트 C 마틴"

확장에는 열려있고 수정에는 닫혀있는. 기존의 코드를 변경하지 않으면서( Closed), 기능을 추가할 수 있도록(Open) 설계가 되어야 한다는 원칙을 말한다.

설명

  • 변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화해야 한다는 의미로, 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다는 뜻

예시) JDBC : DB의 확장에는 열려있고, JDBC 인터페이스 변화에는 닫혀 있다. (기존 코드 수정X)

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

"서브 타입은 언제든 자신의 기반 타입으로 교체할 수 있어야 한다. - 로버트 C 마틴" 

자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙이다. 즉 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다.

 

자식클래스는 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행하도록 해야 LSP를 만족한다.

설명

  • 딸은 아버지의 역할을 수행할 수 없다. 이에 반해 펭귄은 동물의 역할을 수행할 수 있다. 즉, 객체 지향에서의 상속은 조직도나 계층도가 아닌 분류도가 되어야 한다.
  • 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야한다.

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

"클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다. - 로버트 C 마틴" 

한 클래스는 자신이 사용하지않는 인터페이스는 구현하지 말아야 한다. 하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스가 낫다.

 

설명

  • 인터페이스 최소주의 원칙
  • 인터페이스를 통해 메서드를 제공할 때 최소한의 메서드만 제공하라는 것.
  • 범용 인터페이스보다 전문화된 인터페이스를 사용하라는 것.

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

"고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."
"추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다."
"자주 변경되는 구체(Concrete) 클래스에 의존하지 마라"
"자신보다 변하기 쉬운 것에 의존하지 마라"
- 로버트 C 마틴 -

의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다. 한마디 로 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺으라는 것이다.

// 기존 코드
class 201Class {
    Student student = new Ksmart44Gi();
}

// DIP 적용
class 201Class {
    Student student;

    void setStudent(Student student) {
        this.student = student;
    }
}

설명

  • 자동차는 스노우 타이어에 의존하고 있어 타이어 변경 시 소스코드가 변하기 쉬워짐
  • 상위 클래스일수록, 인터페이스일수록, 추상 클래스일수록 변하지 않을 가능성이 높기에 하위 클래스나 구체적 클래스가 아닌 상위 클래스, 인터페이스, 추상 클래스를 통해 의존하라는 것이 바로 의존 역전 원칙 ex) JDBC

'코딩 공부 > CS' 카테고리의 다른 글

[CS] 프레임워크와 라이브러리  (0) 2023.02.13
[CS] 메모리 구조 (Stack, Heap, Data, Code)  (0) 2023.02.02
[CS] REST API (REST, RESTful)  (0) 2022.12.07
[CS] 아키텍처(Architecture)  (0) 2022.12.04
객체지향 프로그래밍  (0) 2022.08.31