https://devlog-wjdrbs96.tistory.com/380

위 블로그 글 참고해서 간략하게 작성했습니다.

0. SOLID란

  • 객체지향 설계 5원칙
  • 각 원칙 이름의 초성을 따서 만듬, SRP, OCP, LSP, ISP, DIP

 

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

  • 한 클래스에 너무 많은 메소드가 쏠리는 것을 방지하고자 하는 원칙
  • 어떤 남자가 해야할 일로 기념일 챙기기, 키스하기, 효도하기, 안마하기, 출근하기, 아부하기, 사격하기, 구보하기 등이 있다고 했을 때 남자에게 너무 많은 책임이 몰려있는 것
  • 남자친구, 아들, 사원, 소대원으로서 책임을 분담한다면 좋을 것

 

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

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

로버트 C.마틴

  • 운전자가 마티즈의 창문을 수동 개방할지, 소나타의 창문을 자동 개방할지를 따로 정하기보단 운전자는 '창문을 개방'한다만 할 줄 알면 된다.
  • 그러기 위해선 마티즈, 소나타의 공통의 클래스 자동차가 있어야 할 것이고 자동차의 '창문개방'을 각각의 다른 자동차마다 구현하면 된다.
  • 운전자의 입장에선 자동차의 '창문개방'을 할 줄만 알기 때문에 '폐쇄'되어 있는 것이고 자동차의 입장에선 '창문개방'에 대해서 다양한 자동차가 다른 구현을 가질 수 있기 때문에 '개방'되어 있다고 할 수 있겠다.

 

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

서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.

로버트 C.마틴

  • 하위 클래스가 상위 클래스의 습성을 물려받은 만큼 상위의 구현이 하위에서 퇴화되지 말아야 한다.
  • 하위 분류는 상위 분류의 한 종류, 구현 분류는 인터페이스 할 수 있어야 함
  • 위 원칙을 어긴 예는 아버지 라는 클래스에서 아들과 딸로 분화한다면 아버지의 모든 특성을 아들과 딸이 가지고 있지 않기 때문에 위 원칙에 어긋난다.
  • 옳은 예는 포유류가 고래, 박쥐로 분화한다면 고래, 박쥐는 포유류의 모든 특징을 가지고 있기 때문에 옳다고 할 수 있다.

 

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

클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안 된다.

로버트 C.마틴

  • 위 예로 들었던 남자가 너무 많은 책임을 지고 있다면 그 책임을 각각의 인터페이스로 분화하여 다시 남자에게 상속시켜주는 것이 ISP
  • 단일 책임 원칙과 같은 문제에 대해 다른 해결 방식을 가지고 있다고 볼 수 있으며, 대체로 단일 책임 원칙을 적용하는 것이 좋다고 함
  • 상위 클래스는 풍성할 수록 좋다
  • 인터페이스는 메소드를 최소화, 구현을 강제화하며 최소한의 기능만 제공하고 그 역할에 집중하는 것이 목적

 

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

고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다. 추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다. 자주 변경되는 구체 클래스에 의존하지 마라

로버트 C.마틴

  • 자동차가 스노우 타이어에 의존한다면 좋지 않다.
  • 자동차는 타이어에 의존할 수는 있지만 이 타이어를 인터페이스로 두어 다양한 타이어로 교체할 수 있어야 한다.
  • 상위 클래스, 추상 클래스, 인터페이스(변하지 않을 가능성이 높은)를 두어 의존하라는 것이 의존 역전 원칙

'C++ > 키워드 정리' 카테고리의 다른 글

키워드 정리 [16] - Lambda  (0) 2023.12.01
키워드 정리 [14] - RTTI  (1) 2023.12.01
키워드 정리 [13] - 가상 함수  (0) 2023.12.01
키워드 정리 [12] - 클래스  (4) 2023.12.01
키워드 정리 [11] - OOP  (1) 2023.12.01

+ Recent posts