본문 바로가기
내가 공부하려고 올리는/스프링

좋은 객체 지향 설계의 5가지 원칙(SOLID)

by 결딴력 2022. 2. 1.
반응형

SOLID

 

좋은 객체 지향 설계의 5가지 원칙(SOLID)

  • SRP : 단일 책임 원칙(Single Responsibility Principle)
  • OCP : 개방-폐쇄 원칙(Open-Closed Principle)
  • LSP : 리스코프 치환 원칙(Liskov Substitution Principle)
  • ISP : 인터페이스 분리 법칙(Interface Segregation Principle)
  • DIP : 의존관계 역전 원칙(Dependency Inversion Principle)

 

 

단일 책임 원칙(SRP)

  • 한 클래스는 하나의 책임만 가져야 한다.
  • 하나의 책임이란?
    • 책임이 클 수 있고 작을 수도 있다.
    • 문맥과 상황에 따라 책임이 다름
  • 중요한 기준은 '변경'
  • 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것

 

 

개방 폐쇄 원칙(OCP)

  • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
  • 즉, 기능을 확장해야 할 때 기존 코드를 수정하는 것이 아닌 새로운 구현 클래스를 만들어 실행
  • 인터페이스를 구현한 새로운 구현 클래스로 새로운 기능을 구현

 

 

OCP의 문제점

  • 구현 객체를 변경하려면 클라이언트의 코드를 변경해야 한다.

    ex) 자동차 - 운전자
    Car라는 interface의 구현 객체가 K3 였다가 K5로 변경하는 경우

    기존 코드
    Car car = new K3();

    수정 코드
    Car car = new K5();

  • 다형성을 사용했지만 OCP 원칙이 깨짐(코드의 변경)

 

 

리스코프 치환 원칙(LSP)

  • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서
    하위 타입의 인스턴스로 변경할 수 있어야 한다.
  • ex)
    자동차 인터페이스에 있는 엑셀이라는 기능은 앞으로 속도를 늘리며
    자동차를 움직일 수 있게 해주는 기능이다.

    이 기능을 바꿔서 엑셀을 밟으면 뒤로 가게 만드는 경우
    컴파일 단계에서는 오류가 발생하지 않는다.
    (엑셀의 기능을 위와 같이 바꿔도 운전자는 엑셀을 밟을 수는 있다.)

    하지만 이 경우 구현하고자 했던 본래의 기능과는 멀어지게 되고,
    이러한 상황을 '프로그램의 정확성이 깨졌다.'고 표현한다.

  • 하위 클래스는 인터페이스 규약을 전부 지켜야 한다는 것을 의미

 

 

인터페이스 분리 원칙(ISP)

  • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다는 것을 의미
  • ex)
    자동차 인터페이스 : 운전 인터페이스 / 정비 인터페이스로 분리
    사용자 클라이언트 : 운전 클라이언트 / 정비 클라이언트로 분리

  • 이렇게 인터페이스를 분리하면 정비 인터페이스가 변해도
    운전자 클라이언트에 영향을 주지 않는다.
  • 인터페이스가 명확해지고 대체 가능성이 높아짐

 

 

의존관계 역전 원칙(DIP)

  • 프로그래머는 '추상화'에 의존해야지, '구체화'에 의존하면 안된다는 뜻
  • 구현 클래스가 아닌 인터페이스에 의존해야 한다는 것을 의미한다.
  • 클라이언트가 구현 클래스를 직접 선택하는 경우
    클라이언트는 인터페이스에 의존
    BUT, 동시에 구현 클래스에도 의존하게 된다.
  • ex)
    앞서 언급한 운전자가 자동차의 구현 클래스를 선택하는 예시를 보자

    Car car = new K3();

    위와 같은 클래스에서 운전자는 'Car'인터페이스에 의존하고 있지만,
    구현 클래스인 K3를 직접 선택해서 객체를 생성하고 있기 때문에
    동시에 구현 클래스에도 의존하게 된다.

  • 위와 같은 상황은 DIP를 위반한 것이다.

 

 

정리하자면

  • 좋은 객체 지향의 핵심은 다형성을 활용하는 것
  • 하지만 위의 몇 예시와 같이 다형성만으로는 OCP와 DIP를 지킬 수 없다.
  • OCP와 DIP도 지키면서 다형성을 활요하기 위해서는 스프링이 필요하다.

 

 

 

출처 : 인프런 김영한님 스프링 강의

 

반응형

댓글