객체 지향 SOLID 원칙

Sol Kim·2024년 10월 28일
0

객체 지향 코드 개발 시 가급적 지켜야 한다고 여겨지는 원칙들의 모음으로, 다양한 디자인 패턴들이 SOLID 설계 원칙에 입각하여 만들어진 것임.

뿐만 아니라, 표준화 작업 및 아키텍처 설계에 이르기까지 다양한 설계 작업의 근본 원리로 이용된다.

SOLID 원칙의 장점(목표)

  • 시간이 지나도 변경이 용이하다 ( 유지보수의 용이성)
    : 요구사항이나 변경사항이 있을 때 영향받는 범위가 적다
    => 유연성, 확장성의 증가.

결과적으로, 복잡성이 제거되어 개발의 생산성 향상에 용이함

아무리 S.O.L.I.D 라고 해도, 시스템을 고려하지 않고 원칙을 적용하면 불필요한 일이 발생할 수 있으므로, 각각의 원칙들은 코드의 목적에 맞게 적용할 것

S.O.L.I.D 5원칙

  • SRP : Single Responsibility Principle : 단일 책임 원칙
  • OCP : Open/Closed Principle : 개방 폐쇄 원칙
  • LSP : Liskov substitution Principle : 리스코프 치환 원칙
  • ISP : Interface segregation principle : 인터페이스 분리의 원칙
  • DIP : Dependency invertion principle : 의존 관계 역전의 원칙

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

: Single Responsibility를 가진다는 것은, Module이 오직 하나의 Actor에 대해서만 책임을 짐으로서, 모듈에 수정이 필요할 때 모듈 수정이 필요한 이유가 오직 한 가지인 상황을 보장하도록 할 수 있기 위함임.

만일 SRP가 지켜지지 않을 경우, 어떤 Action에 대한 책임이 여러 Module로 분산됨으로서, 모듈 수정의 연쇄성을 불러일으키거나, 최악의 경우 책임 순환으로 인해 정상적 수정이 불가능한 형태까지 다다를 수 있음.

SRP는 변경이 필요할 때 수정할 대상을 명확화함으로서, 프로그램 유지보수성을 증가시키는 것

개방 폐쇄 원칙 (OCP, Open/Closed Principle)

: 모듈의 수정에 있어, 확장에는 Open되어 있어야 하고, 변경에는 Closed되어 있어야 한다는 원칙.

즉, 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 해야 한다는 뜻.

이를 지키지 않으면, instanceof와 같은 연산자를 사용하거나, 다운 캐스팅 발생

결과적으로 OCP란, 모듈을 추상화시키는 것을 통해, 변하는 것들을 숨기고, 변하지 않는 것들에 의존하게 하여, 기존의 코드 및 클래스들을 수정하지 않은 채로 Application을 확장할 수 있도록 하여, 코드의 확장성을 증가시키는 것

리스코프 치환 원칙 (LSP, Liskov Substitution Principle)

: 어떤 Module을 Client 관점에서 볼 때, 부모 모듈과 자식 모듈의 액션이 항상 호환되게 하여, 하위 타입이 상위 타입을 대체 가능하도록 해야 한다는 원칙

즉, 상속관계에서는 꼭 일반화 관계 (IS-A)가 성립해야 한다는 의미
상속관계가 아닌 클래스들을 상속관계로 설정하면, 이 원칙이 위배됨 (재사용 목적으로 사용하는 경우)

LSP를 위반하면 OCP 또한 위반한다.
따라서 상속 관계를 잘 정의하여 LSP가 위반되지 않도록 설계해야 한다.

인터페이스 분리 원칙 (ISP, Interface Segretation Principle)

: ISP는 SRP의 개념이 Interface에 적용된 것이라고 볼 수 있는데, 이는 Client의 목적과 관심이 다르다면, 이 Client의 목적과 용도에 적합한 인터페이스만을 분리 제공하여 Client의 관심에 맞는 Public Interface만을 접근하도록 함으로서, 불필요한 간섭을 최소화하는 원칙이다.

요약하면

  • 클라이언트는 자신이 사용하는 메소드에만 의존해야 하며
  • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 하고
  • 인터페이스는 클라이언트의 관심사를 기준으로 잘게 분리하여, 하나의 통상적 인터페이스가 아닌 여러 개의 세부(구체)적인 인터페이스를 제공해야 한다는 것

다만 한번 인터페이스를 분리 구성하였다면 이후 수정사항이 생겼을 때 인터페이스들을 재분리하는 행위를 가하지 말하야 한다

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

의존 관계 역전(Dependency Inversion)
구조적 디자인에서 발생하던 하위 레벨 모듈의 변경이 상위 레벨 모듈의 변경을 요구하는 위계관계를 끊는 의미의 역전

: Client가 어떤 Class를 참조해서 사용할 때, 해당 Class를 직접 참조하는 것이 아니라, 그 대상의 상위 요소 (추상 클래스, 인터페이스)로 참조하라는 원칙.

즉, 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 되며, 저수준 모듈이 고수준 모듈에 의존해야 한다는 뜻이고, 이는 비즈니스 로직이 세부 사항이 아닌 추상적 사항에 의존해야 한다는 뜻이다.

Summary

  • SRP / ISP : 객체가 과다하게 커지는 것을 막아 기능/요구사항의 변경이 불러일으키는 영향력을 최소화하여 코드의 유연성 향상을 의도
  • LSP / DIP : OOP의 추상화 / 다형성 원칙을 응용한 OCP를 보다 안정적으로 동작할 수 있도록 보조한다. 이 때 DIP변화되는 부분을 추상화하며, LSP다형성 구현을 돕는다
profile
POST : Power-On Study Thoroughly

0개의 댓글