공부/Java

[공부/자바] SOLID에 대해서

오잎 클로버 2022. 2. 22. 12:40
728x90

SOLID란?

객체지향 설계 5원칙인 SOLID, 각 원칙들의 영어 앞글자를 따서 SOLID라고 합니다.

  1. SPR (Single Responsiblity Principle): 단일 책임 원칙
  2. OCP (Open Closed Principle): 개방 폐쇄 원칙
  3. LSP (Liskov Subsitution Principle): 리스코프 치환 원칙
  4. ISP (Interface Segregation Principle): 인터페이스 분리 원칙
  5. DIP (Dependency Inversion Principle): 의존 역전 원칙

위 원칙들은 응집도를 높이고, 결함도는 낮추자는 고전 원칙을 객체 지향의 관점에서 재정립한 것으로 볼 수 있습니다.

SRP (Single Responsiblity Principle)이란?

SRP 하나의 클래스에는 하나의 책임만 부여하는 것입니다.

클래스가 변경되면 클래스 사용여부와 상관없이 기능적으로 연관된 기능을 모두 다시 테스트해야 합니다.

따라서, 하나의 클래스는 하나의 책임만 부여하는 것이 좋습니다.

여기서 말하는 책임이란, 해야 하는 것, 할 수 있는 것, 해야하는 것을 잘할 수 있는 것을 말합니다.

→ 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.

어떤 경우에 안 지켜지는 가?

  • 변수 레벨
    • 하나의 속성이 여러 의미를 갖는 경우
    • 어떤 곳에서는 쓰고, 어떤 곳에선 안 쓰는 속성이 있는 경우
  • 메소드 레벨
    • 분기 처리를 위한 if문이 많을 경우

SPR 원칙이 지켜지지않은 예제
SPR 원칙을 적용

OCP (Open Closed Principle)란?

확장에는 개방하고, 수정에는 닫는 원칙으로, 기존 코드는 변경하지 않고, 기능을 추가하는 것을 의미합니다.

OCP를 위반하지 않는 설계를 위해 무엇을 변하는 것인지, 변하지 않는 것인지 구별해야 합니다.

OCP 위반
OCP 위반하지않은 예제

LSP (Liskov Subsitution Principle)이란?

Subsitution 치환성은 자료형 S가 자료형 T의 하위형이라면 필요한 프로그램의 속성(정확성, 수행하는 업무 등)의 

변경 없이 자료형 T의 객체를 자료형 S의 객체로 교체(치환)할 수 있어야 하는 원칙입니다.

자료형 T가 자료형 S로 교체될 수 있다면 리스코프 원칙에 부합합니다.

하위 클래스의 인스턴스는 상위 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 수행하는 데 문제가 없어야 합니다. OOP 4대 특징의 상속, 인터페이스 원칙이 잘 지켜진다면, LSP는 자동으로 잘 적용됩니다.

ISP (Interface Segregation Principle)이란?

클라이언트가 자신이 사용하지 않는 메소드에 의존해서는 안된다는 원칙으로,

인터페이스들을 구체적이고 작은 단위들로 분리시켜 클라이언트가 꼭 필요한 메소드만 사용할 수 있게 하는 것입니다.

이 같은 작은 단위들을 역할 인터페이스라고 합니다.

역할 인터페이스로는 시스템 내부 의존성을 약화시켜 리팩토링, 수정, 재배포를 쉽게 할 수 있습니다.

→ 범용의 인터페이스보다 클라이언트에 특화된 인터페이스 사용

(관리자 클라이언트, 유저 클라이언트, 그리고 게시판이 있다고 가정하였을 때,

게시판은 추가, 수정, 삭제 이렇게 3가지 메소드가 있고, 모든 클라이언트들은 게시판 메소드에 의존되어 있습니다.

하지만 관리자 클라이언트는 굳이 추가, 수정 메소드는 굳이 필요하지 않고 관리에 필요한 삭제만 필요하기에 변경합니다.)

DIP (Dependency Inversion Principle)

의존관계 역전 원칙은 특정 형태의 소프트웨어 모듈을 분리하는 것을 의미합니다.

객체 사이에 서로 도움을 주고받으면, 의존관계가 형성됩니다.

DIP는 무분별한 의존 관계를 맺는 것을 방지하기 위해 의존 관계를 맺을 시, 지켜야 할 기본적인 형식을 의미합니다.

상위 계층이 하위 계층에 의존하는 전통적인 의존 관계를 반전시켜 상위 계층이 하위 계층의 구현으로 독립되게 할 수 있습니다.

의존관계를 맺을 때, 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 원칙입니다. 변하기 어려운 추상적인 것들을 표현하는 수단은 추상 클래스와 인터페이스가 있습니다.

지켜야할 원칙

  1. 상위 모듈은 하위 모듈에 의존해서는 안된다.
  2. 상위 모듈, 하위 모듈 모두 추상화에 의존해야 한다.
  3. 추상화는 세부 사항에 의존해서는 안된다.
  4. 세부 사항이 추상화에 의존해야 한다.

 

 

이상입니다.