[CS]SOLID원칙

김피자·2023년 1월 20일
0

CS

목록 보기
2/22
  1. 디자인패턴 : 싱글톤패턴에 등장한 SOLID원칙에 대해 정리했다.

출처 : haero_kim님 글

SOLID 객체 지향 설계

: 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩토링하여 코드 냄새를 제거하기 위해 적용될 수 있는 지침

  1. SRP(Single Responsivility Principle) 단일 책임 원칙
  2. OCP(Open Closed Principle) 개방, 폐쇄 원칙
  3. LSP(Liskov Substitution Principle) 리스코프 치환 원칙
  4. ISP(Interface Segregation Principle) 인터페이스 분리 원칙
  5. DIP(Dependency Inversion Principle) 의존관계 역전 원칙

1. SRP : 단일 책임 원칙

  • 클래스는 단 한개의 책임을 가져야 함
  • 클래스를 변경하는 이유는 단 하나여야 함
  • 이를 지키지않으면, 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향을 미칠 수 있음 > 유지보수 매우 비효율적

책임이 뭔데??
SRP에서 이야기하는 책임은 '기능'이라 생각하자
만약 한 클래스가 수행할 수 있는 기능이 여러 개면, 클래스 내부 함수끼리의 결합도가 높아질 가능성 큼

객체지향의 설계의 핵심 : 응집도는 높고 결합도는 낮게

결합도가 높아져버리면 새로운 요구사항이나 프로그램 변경에 의해 클래스 내부의 동작들이 연쇄적으로 변경되어야 할 수도 있고 이는 유지보수에 굉장히 비효율적 > 책임을 잘게 쪼개 분리하자


2. OCP : 개방-폐쇄 원칙

  • 확장에는 열려있고, 변경에는 닫혀 있어야 함
  • 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야 함
  • 이를 지키지않으면, Instanceof와 같은 연산자를 사용하거나, 다운캐스팅 발생

어떤 모듈의 기능을 하나 수정할 때, 그 모듈을 이용하는 다른 모듈들을 다 고쳐야 한다면 유지보수가 굉장히 복잡
따라서 개방-폐쇄 원칙을 잘 적용하여 기존 코드를 변경하지 않아도 기능을 새롭게 만들거나 변경할 수 있도록 해야함

그렇지 않으면 객체지향 프로그래밍의 가장 큰 장점인 유연성, 재사용성, 유지보수성 등을 모두 잃어버리는 셈이고, OPP를 사용하는 의미가 사라짐

OCP는 추상화 (인퍼페이스)와 상속 (다형성) 등을 통해 구현해낼 수 있음
자주 변화하는 부분을 추상화함으로써 기존 코드를 수정하지 않고도 기능을 확장할 수 있도록 함으로써 유연함을 높이는 것이 핵심!


3. LSP : 리스코프 치환 원칙

  • 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 함
    > 즉, 상위 타입 객체를 하위 타입 객체로 치환해도 정상적으로 동작해야 함
  • 상속관계에서는 꼭 일반화 관계가 성립해야 함
  • 상속관계가 아닌 클래스들을 상속관계로 설정하면, 이 원칙 위배

즉, 리스코프 치환 원칙을 위배하면 개방-폐쇄 원칙도 위배하는 것


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

  • 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다는 원칙
  • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 함
    > 하나의 통합적인 인터펭이스보다는 차라리 여러 개의 세부적인(구체적인) 인터페이스가 나음
  • 인터페이스는 해당 인터페이스를 사용하는 클라이언트를 기준으로 잘게 분리되어야 함

각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 하는 것이 핵심


5. DIP : 의존 역전 원칙

  • 의존 관계 성립 시, 변하기 쉬운 것(구체적인 것)보다는 변하기 어려운 것(추상적인 것)에 의존해야 한다.

구체화 된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야 한다는 뜻

  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 됨
  • 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 함
  • 저수준 모듈이 변경되어도 고수준 모듈은 변경이 필요없는 형태가 이상적

정리

SRP와 ISP는 객체가 커지는 것을 막음
LSP와 DIP는 OCP를 서포트
OCP는 (자주 변화하는 부분을 추상화)하고 (다형성)을 이용해 기능 확장에는 용이하고 기존 코드 변화에는 보수적이도록 만들어줌
여기서 (자주 변화하는 부분을 추상화) 할 수 있도록 도와주는 것이 DIP
(다형성) 구현을 돕는게 LSP


출처
https://blog.naver.com/systudio21/222983772076

profile
제로부터시작하는코딩생활

0개의 댓글