SOLID 객체 지향 설계 5원칙

JunSeong_Park·2022년 12월 27일
0

객체 지향 프로그래밍 및 설계를 위한 다섯 가지 기본 원칙

이와 같은 원칙은 아래와 같은 방향성을 가지므로 조금 이들이 지향하는 바를 알아보자



낮은 결합도 지향 Loose Coupling

  • 결합도는 모듈 간의 상호 의존 정도 ( 결합도가 낮으면 모듈 간의 상호 의존성이 줄어 객체의 재사용이나 수정 유지보수 용이 )
  • 결합도 수준
    • 데이터 결합도
    • 스탬프 결합도
    • 컨트롤 결합도
    • 외부 결합도
    • 공유 결합도
    • 내용 결합도

높은 응집도 지향 High Cohesion

  • 응집도는 하나의 모듈 내부에 존재하는 구성 요소들의 기능적 관련성 ( 응집도가 높은 모듈 하나의 책임에 집중하고 독립성이 높아져 재사용이나 기능의 수정, 유지보수가 용이 )
  • 응집도 수준
    - 기능 응집도
    - 순차 응집도
    - 통신 응집도
    - 절차 응집도
    - 시간 응집도
    - 논리 응집도
    - 우연 응집도


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

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

클래스를 역할과 책임에 따라 분리하여 하나의 역할과 책임을 줘야한다



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

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

자신의 확장에는 열려 있고 , 주변의 변화에 대해서는 닫혀 있어야 한다


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

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

객체 지향에서의 상속은 조직도나 계층도가 아닌 분류도가 돼야 한다

하위 클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류

구현 클래스 is able to 인터페이스 - 구현 분류는 인터페이스할 수 있어야 한다

하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는 데에 문제가 없어야 한다

” 인터페이스할 수 있어야 한다 “

  • AutoCloseable - 자동으로 닫힐 수 있어야 한다
  • Appendable - 덧붙일 수 있어야 한다
  • Cloneable - 복제할 수 있어야 한다
  • Runnable - 실행할 수 있어야 한다


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

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

프로젝트 요구사항이나 설계자의 취향에 따라 SRP 나 ISP 중 하나를 선택할 수 있지만 특별한 경우가 아니라면 SRP 를 적용하는 것이 더 좋은 해결책

클래스에 대해 특정 역할이나 책임에 따라 인터페이스로 분류하여 최소주의 원칙을 지키게 한다


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

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

상위 클래스일수록 , 인터페이스일수록 , 추상 클래스일수록 변하지 않을 가능성이 높기에 하위 클래스나 구체 클래스가 아닌 상위 클래스 , 인터페이스 , 추상 클래스를 통해 의존하라는 것이 바로 DIP ( 의존 역전 원칙 ) 이다




SOLID 는 원칙의 집합이다
원칙의 사전적 정의를 찾아보면 어떤 행동이나 이론 따위에서 일관되게 지켜야 하는 기본적인 규칙이나 법칙임을 의미한다.. 자세히 봐보면 이전 글들에서 다뤘던 객체 지향들의 특징들이 조금 더 확장시키고 추상화한 것을 알겠는가..
각 원칙 별로 로버트 C.마틴의 말이 하나씩 적혀 있는데 이는 이 원칙이 존재해야하는 이유를 간단한 문장을 통해 잘 정리했다고 생각해서이다
이번 파트는 사실 엄청 중요한 부분이라고 생각한다 spring 을 배우는 입장에서 굳이 이렇게 해야하는가라던지 의문들에 대해 대답이 되는 시간들이였기 때문이다 이 글을 통해 SOLID 5원칙에 쉽게 접근할 수 있길 바란다


출처 : 스프링 입문을 위한 자바

profile
안녕하세요 언어에 구애 받지 않는 개발자가 되고 싶은 박준성입니다

0개의 댓글