객체지향 설계의 5가지 원칙 SOLID

Jino·2023년 1월 14일
0

OOP

목록 보기
1/1

설계 시 고려할 점

  • 응집도 :
    • 프로그램의 한 요소(모듈)가 해당 기능을 수행하기 위해 책임을 기준으로 관련있는 기능들로만 이루어져 있는지를 나타내는 정도
    • 응집도는 높을 수록 좋다.
      • 변경 대상과 범위가 명확해지는 장점이 있어 변경에 쉽게 대처할 수 있다.
    • 응집도가 낮으면 어떠한 모듈이 가지는 책임의 범위를 짐작하기 어려워 변경에 대처하기 어렵고 재사용 역시 어려울 가능성이 높다.
  • 결합도 :
    • 한 요소(모듈)가 다른 요소와 얼마나 강력하게 연결되었는지를 나타내는 정도
      → 얼마나 의존적인지를 나타내는 정도
    • 결합도는 낮을 수록 좋다.
      • 어떠한 요소에 대한 변경이 일어날 시 관련 요소만 변경하는것만으로 대처할 수 있다.
    • 결합도가 높은 코드는 한 요소에 변경이 일어났을때 다른 요소도 함께 일일이 변경을 해주어야하며 재사용이 어려운 코드가 된다.
  • “응집도는 높고 결합도는 낮게 설계되어야한다. “
    • 한 요소가 다른 요소에 크게 의존하지 않으면서도 명확히 요소의 책임에 관련된 기능들로만 구성되어있는 설계를 지향해야한다.

객체지향 설계를 위한 5가지 원칙

  1. SRP: 단일 책임 원칙(single responsibility principle)

    • 하나의 클래스는 하나의 책임만 가져야한다.
      • 하나의 클래스는 하나의 대상만을 변경시킬수 있는 주체여야한다 라는 의미
    • 책임 범위는 적당히 나눈다.
      • 책임의 범위는 어떠한 변경이 일어났을 시 클래스 받는 영향으로 책임의 범위를 짐작할 수 있다.
      • 즉 하나의 책임만을 가진다면 모듈이 변경되는 이유는 해당 책임에 대한 변경이 이루어질때 한가지만 해당할 것이다.
      • 적절히 적용된다면 코드 가독성 향상, 유지보수 용이 등의 이점이 있다.
  2. OCP: 개방-폐쇄 원칙 (Open/closed principle)

    • 확장에는 열려있으나 변경에는 닫혀있어야 한다. → 기존의 코드를 변경하지 않으면서, 새로운 기능을 추가할 수 있도록 설계할수 있어야한다.

    OCP 는 관리가능하고 재사용 가능한 코드를 만드는 기반이며

    OCP 를 가능케 하는 중요 메커니즘은 추상화와 다형성이다.

    • 다형성을 사용하고 클라이언트가 DIP 를 잘 지킬때 OCP 가 지켜질 수 있는 환경이 구성된다.
    • 다형성을 활용해서 지킨다.
      • 다형성을 지킬 수 있는 다른 객체로 확장하여도 기존의 클라이언트 코드는 수정하지 않아도 되도록 구성
  3. LSP: 리스코프 치환 원칙 (Liskov substitution principle)

    • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지않으면서 하위타입의 인스턴스로 바꿀 수 있어야 한다.
    • 이 말의 의미는 다형성에서 하위클래스는 인터페이스 규약을 다 지켜야 한다는 것
    • 이는 곧 다형성을 지원하기 위한 원칙으로 인터페이스를 구현한 구현체를 믿고 사용하려면 해당 원칙이 필요하다.
    • 컴파일과는 별개로 인터페이스에서의 목적을 맞춰서 구현해야한다.
      • 예시
        • 자동차 악셀을 밟으면 앞으로 간다.
        • 뒤로 가면 LSP 원칙 위배
  4. ISP: 인터페이스 분리 원칙 (Interface segregation principle)

    • 하나의 범용 인터페이스보다
      특정 클라이언트를 위한(구체적인) 인터페이스 여러개가 좋다.
  5. DIP: 의존관계 역전 원칙 (Dependency inversion principle)

    • 추상화에 의존해야지 구체화에 의존하면 안된다.
    • 즉 클라이언트 코드가 구현체에 의존하는것이 아닌 추상클래스 or 인터페이스에 의존해야한다는 뜻
    • DIP 를 지키지 않으면 OCP 를 준수할 수 없다.

객체지향의 핵심은 다형성이지만

  • 다형성만으론 OCP 와 DIP 를 지킬 수 없다.

  • 관심사를 분리하여 객체를 생성하고, 의존관계를 맺어주는 별도의 조립, 설정자가 필요하다.
    (Config 역할 : 의존성 주입 )

  • 의존성 주입은 를 해당 원칙을 준수할 수 있게 해주는 방법 중 하나다.

  • 스프링 컨테이너의 역할 : 의존성 주입

  • DI, IOC 컨테이너가 필요한 이유


profile
방대한 백엔드의 바다에서 착실히 습득하는 유망주 J

0개의 댓글