객체 지향 설계(SOLID)

HyeonWoo·2021년 2월 4일
0

스프링 & JPA

목록 보기
25/34
post-thumbnail

SOLID 원칙들은 자기 자신 클래스 안에 응집도는 내부적으로 높이고, 타 클래스들 간 결합도는 낮추는 객체 지향의 관점에서 도입.

SRP(Single Responsibility Principle) 단일 책임 원칙

클래스의 역할과 책임을 너무 많이 주지 마라.
클래스를 설계할 때 어플리케이션의 경계를 정하고, 추상화를 통해 어플리케이션 경계 안에서 필요한 속성과 메서드를 선택하여 설계 해야 한다.

예를 들어 사람이라는 클래스가 존재한다고 할때 필드로 나이, 이름, 혈액형등등 모든 내용을 추가해주었다.
하지만 회사 어플리케이션, 병원 어플리케이션에는 각각의 어울리는 필드들이 존재한다.
이렇기에 클래스에 모든 기능을 다 넣지않고 목적과 취지에 맞는 속성과 메소드로 구성 해야한다. => 관련된 책임만 준다.
SRP(단일 책임 원칙)은 추상화와 깉은 관련이 있다.
정리하자면,
속성, 메서드, 패키지, 모듈, 컴포넌트, 프레임워크를 단일 책임을 주고, 독립적으로 모듈화 시키는 것이 바로 SRP(단일 책임 원칙)이다.

OCP(Open Closed Principle)개방 폐쇄 원칙

자신의 확장에는 열려있고, 주변의 변화에 대해서는 닫혀 있어야한다.

이 원칙은 자바의 JDBC로 예를 들 수 있다.
OCP(개방 폐쇄 원칙)에 의거하여 상위 클래스 또는 인터페이스를 중간에 두어 직접적인 연동은 피했다.
JDBC Driver Manager을 하나로 두고 각 디비에 맞게 메서드를 재정의한 샘이다.
이로서 JDBC Driver Manager은 따로 코드 수정이 없으면서도 여러 디비 Driver과의 연동에는 확장적이게 된다.

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

하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야한다.
즉 Upcating 된 객체 참조 변수가 논리적으로 그 역할이 문제가 없어야 한다.

LSP(리스포크 치환 원칙)은 인터페이스와 클래스 관계, 상위 클래스와 하위 클래스 관계를 얼마나 잘 논리적으로 설계 했느냐가 관건이다.

상속의 계층적 구조가 아니라 분류이다.
예를 들어,

잘못된 상속 관계: 아버지와 아들 // 아들은 아버지의 한 종류이다
올바른 상속 관계: 포유류와 고래 // 고래는 포유류의 한 종류이다

객체 지향은 인간이 실세계를 보면서 느끼고 논리적으로 이해한 것과 똑같이 프로그래밍 하는 게 목적이기 때문에 논리적으로 맞아 떨어져야한다.

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

상황과 관련 있는 메소드만 제공

ISP(인터페이스 분리 원칙)은 SRP(단일 책임 원칙)과 같은 원인에 대한 다른 해결책을 제시하는 것이다.
SRP는 여러개의 클래스로 쪼개버리는 방안을 제시하고, ISP은 해당 클래스를 그냥 냅두는 상태에서 인터페이스 최소주의 원칙에 따라 각 상황에 맞는 기능만 제공하도록 필터링 한다

DIP(Dependency Inversion Principle) 의존 역전 원칙

자신보다 변하기 쉬운 것에 의존하지 마라

추상클래스 또는 상위클래스는 구체적인 구현클래스 또는 하위클래스에게 의존적이면 안된다. 왜냐면 구체적인 클래스는 코딩에 있어서 가장 전면적으로 노출되고 사용되기 때문에 변화에 민감하다.
DIP에 의해 설계하지 않는다면, 구체화된 클래스가 수정될 때마다 상위클래스나 추상클래스가 변화해야 한다. 그러면 그 상위 또 그 상위 계속 연관되어 있는 클래스들이 수정되어야한다. 이에 하위클래스나 구체클래스에게 의존하면 안된다.
하지만 DIP에 의해 설계가 된다면 자신보다 변하기 쉬운 것에 의존하던 것을 추상화 된 인터페이스나 상위클래스를 두어 변하기 쉬운 것의 변화에 영향 받지 않게 의존방향을 역전시킬수 있다.
추가적으로 상위로 갈 수록 더 추상적이고 변화에 민감하지 않고 수정 가능성이 낮아진다.

객체 지향 설계를 잘해야 프로그램 유지 보수 측면에서 굉장이 용이하고 개발 시간과 비용을 절감할 수 있다 !!


참고자료
https://limkydev.tistory.com/77

profile
학습 정리, 자기 개발을 위한 블로그

0개의 댓글