Halo World

[JAVA] SOLID 원칙 본문

개발자 인터뷰 준비

[JAVA] SOLID 원칙

_Yeony 2021. 6. 19. 16:29

SOLID는 OOP설계의 다섯가지 기본 원칙으로 객체지향 설계를 할때 지켜야 하는 원칙으로 알려져 있다.


SRP (Single Responsibility Principle)

  • 단일 책임 원칙 : 하나의 클래스는 하나의 책임만 갖는다.
  • 한 클래스가 여러 책임을 갖고 있는 경우 혼재된 책임을 개별 클래스로 분할하여 한 클래스당 하나의 책임만 맡도록 한다. 자식 클래스끼리 유사한 책임을 중복으로 정의한다면, 부모 클래스로 공통되는 책임을 위임한다.
  • 여러 클래스에 동일한 책임이 분리된 경우 중복되는 책임을 특정 클래스로 분리한다. (응집성 증가)
  • 장점 : 기능의 책임 영역이 확실해져 한 책임의 변화가 다른 책임에게 side effect를 미치지 않도록 방지할 수 있고, 코드의 가독성과 유지보수성이 향상된다.
  • 클래스는 클래스의 책임이 잘 드러나도록 네이밍을 해야 한다.

OCP (Open/Close Principle)

  • 개방/폐쇄 원칙 : 소프트웨어의 구성요소 (컴포넌트, 클래스, 모듈, 함수)는 함수의 확장에는 열려있고, 변경에는 닫혀 있어야 한다.
  • 요구사항의 변경에도 기존 구성요소를 수정하기보다 확장하여 재사용해야 한다. (추상화와 다형성 이용)
  • 변경될 것과 변하지 않는 것을 엄격히 구분하고, 구현에 의존하기보다 정의된 인터페이스에 의존하도록 코드를 작성해야 한다.
  • 인터페이스 정의시 변경될 가능성을 최소화하여 정의한다.

LSP (Liskov Substitution Principle)

  • 리스코프 치환 원칙 : 자료형 S가 자료형 T의 하위형이라면 필요한 프로그램의 속성의 변경 없이 자료형 T의 객체를 자료형 S의 객체로 교체할 수 있어야 한다는 원칙 (즉, 하위 클래스는 언제나 상위 클래스로 치환할 수 있어야 한다.) - Is-a 관계를 만족해야 한다.
  • 일반적으로 선언은 상위 클래스로, 생성은 구체화된 하위 클래스로 대입하는 방법을 사용한다.
  • LSP는 OCP를 구성하는 구조가 된다. 

ISP (Interface Segregtion Principle)

  • 인터페이스 분리 원칙 : 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 말아야 한다. 큰 덩어리의 인터페이스들을 구체적이고 작은 단위로 분리시킴으로써 클라이언트들이 꼭 필요한 메서드들만 이용할 수 있도록 해야 한다. (즉, 하나의 일반적인 인터페이스 보다 여러개의 구체적인 인터페이스가 낫다.)
  • ISP를 통해 시스템 내부 의존성을 약과시켜 리팩토링, 수정, 재배포를 쉽게 할 수 있다.
  • SRP : 클래스의 단일 책임을 강조 / ISP : 인터페이스의 단일 책임을 강조

DIP (Dependency Inversion Principle)

  • 의존관계 역전의 원칙 : 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. (즉, 세부사항에 의존해서는 안되고, 추상화에 의존해야 한다)
  • 첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다. 둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.
  • 이 원칙은 '상위와 하위 객체 모두가 동일한 추상화에 의존해야 한다'는 객체 지향적 설계의 대원칙을 제공한다.

 

https://bamdule.tistory.com/11#recentEntries

https://velog.io/@hanblueblue/Java-SOLID-SRP-OCP-LSP-ISP-DIP

https://huisam.tistory.com/entry/DIP

 

'개발자 인터뷰 준비' 카테고리의 다른 글

Twitter 시스템 설계  (0) 2021.06.13
JAVA 8 비동기 처리 (@Async)  (0) 2021.06.10
AWS SQS vs Kafka vs RabbitMQ  (0) 2021.06.09
Spring 버전별 차이 / 개선점  (0) 2021.06.09
JAVA 버전별 개선점 (7, 8, 11)  (0) 2021.06.09