본문 바로가기

Language/JAVA

[JAVA] 객체지향 설계 5대 원칙 - SOLID

JAVA 객체지향 설계 5대 원칙 - SOLID

객체지향 설계 5대 원칙 SOLID에 대해 알아봅니다.

 


 

객체지향 설계 5대 원칙 SOLID

좋은 코드를 설계하려면 이러한 원칙들이 지켜지는 것이 좋다.

SOLID

 

 

단일 책임 원칙 SRP : Single Responsibility Principle

클래스나 함수는 단 하나의 책임(기능)만을 가져야 합니다.

클래스나 함수가 거대해지면 분리시킬 필요가 있습니다.

책임 영역이 확실해지면 연쇄작용에서 자유롭습니다.

적용방식

▶ 리팩토링 Refactoring

프로그램의 기능이나 동작(method) 변경 없이 내부 구조를 개선하는 방법

▶ 여러 원인에 의한 변경 Divergent Change

extra class를 통해 혼재된 각 책임을 개별 클래스로 분리하여 클래스 간의 복잡도를 줄이는 방법

▶ 산탄총 수술 Shotgun Surgery

여러 곳에 분포된 책임들을 한 곳으로 모아 응집도를 높이는 방법

Example

SRP

 

개방-폐쇄 원칙 OCP : Open-Closed Principle

소프트웨어의 구성요소 컴포넌트 Component, 클래스 Class, 모듈 Module, 함수 Function는

  • 확장에 열려있고
  • 변경에 닫혀있어야

한다는 원칙입니다.

변경을 위한 비용은 최소화하고, 확장을 위한 비용을 최대화합니다.

요구사항이 변경되어도 기존의 구성요소는 변경되지 않아야 하고, 확장은 쉽게 하여 재사용이 가능해야 합니다.

적용방식

▶ 변경(확장)될 것 vs. 변하지 않을 것을 엄격히 구분

▶ 두 모듈이 만나는 지점에 인터페이스 정의

▶ 구현에 의존하기 보다 정의한 인터페이스에 의존하도록 작성

 

리스코프 치환 원칙 LSP : Liskov Substitution Principle

서브 타입은 기반 타입으로 교체할 수 있어야 합니다.

서브 타입은 기반 타입의 규약을 지켜야 합니다.

구현 상속 관계(extends), 인터페이스 상속 관계(implements) 모두 해당됩니다.

OCP(개방-폐쇄 원칙)를 구성하는 구조가 됩니다.

적용방식

▶ 두 개체가 같은 job을 한다면, 하나의 클래스로 표현하고 구분할 필드 flag 두기

▶ 같은 연산 다른 동작이면 인터페이스 상속으로 구현

▶ 공통된 연산이 없다면 별개의 클래스로 구현

▶ 두 개체가 하는 일에 추가적인 동작이 있다면 구현 상속(extends) 사용

 

인터페이스 분리 원칙 ISP : Interface Segregation Principle

클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 합니다.

한 클래스가 다른 클래스에 종속될 경우, 최소한의 인터페이스를 사용합니다.

인터페이스 단일 책임

적용방식

▶ 클래스 인터페이스를 통한 분리 - 클래스 상속 extends

▶ 객체 인터페이스를 통한 분리 - 위임 Delegation

 

의존 역전 원칙 DIP : Dependency Inversion Principle

하위 모듈의 변경이 상위 모듈의 변경을 요구합니다.

의존 관계시 변하지 않는 것에 의존해야 합니다.

  • 변하기 쉬운 것 : 구체적인 것(클래스, 서브 클래스 인스턴스)
  • 변하기 어려운 것 : 추상적인 것(추상클래스, 인터페이스)

IOC, 훅 메소드, 확장성

적용방식

▶ 레이어링 Layering

728x90