나만 모르는 SOLID (객체지향 설계 5원칙 )

문지원(JiwonMoon)·2022년 6월 2일
0

Spring

목록 보기
4/10
post-thumbnail

😵 목적

정리한 개념들의 포스트들은 있지만, 한번에 보기 난해하고 전체적인 흐름을 바로 잡고 OOP의 더 깊이 있는 학습을 위해 정리하려고 한다.

전체적으로 개념에 대한 내용이므로 세부적인 사항은 생략될 수 있다.

🔥 객체지향 5원칙 (SOLID)

객체지향 5원칙 (SOLID)이란?

객체지향 프로그래밍 및 설계의 다섯 가지 기본 원칙이라고 한다 프로그래머가 시간이 지나도 유지보수와 확장이 쉬운 시스템을 만들고자 할 때 원칙들을 함께 적용할 수 있다.
SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩토링하여 적용할 수 있는 지침이다 이 원칙들은 애자일 소프트웨어 개발과 적응적 소프트 개발의 전반적 전략의 일부라고 한다.

애자일 소프트웨어 개발이란? 소프트웨어 개발 방법에 있어서 아무런 계획이 없는 개발 방법과 계획이 지나치게 많은 개발 방법들 사이에서 타협점을 찾고자하는 방법론이다.

🧐 단일 책임 원칙 (SRP)

단일 책임 원칙은 모델 추상화와 가장 관련이 깊다.

단일 책임 원칙 (single responsibility principle, SRP)란?

말그대로 "하나의 객체는 하나의 책임만을 가져야한다"라는 원칙이다.
클래스가 제공하는 모든 기능은 이 책임과 주의깊에 부합해야한다고 한다.

Why? 클래스가 여러 책임을 갖게 되면 그 클래스는 각 책임마다 변경되는 이유가 발생하기 때문에 클래스가 한 개의 이유로만 변경되려면 클래스는 클래스는 한 개의 책임만을 가져야한다고 합니다

🧐 개방-폐쇄 원칙 (OCP)

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

"소프트웨어의 개체(클래스, 모듈, 함수, 등등)는 확장에 대해 열려 있어야 하고, 변경에 대해서는 닫혀 있어야 한다"는 프로그래밍 원칙이다.

즉, 기능을 변경하거나 확장할 수 있으면서 그 기능을 사용하는 코드는 수정하지 않아야한다.


인터페이스로 공통점을 묶어서 구매 행위에는 닫혀있되 직원 관리에는 개방된 예시

🧐 리스코프 치환 원칙 (LSP)

리스코프 치환 원칙 (Liskov substitution principle, LSP)이란?

말이 굉장히 어렵지만, 특정 메소드가 상위 타입을 인자로 사용한다는 가정하에 그 타입의 하위타입도 문제없이 정상 작동해야 한다는 의미이다.
즉, 부모 클래스의 인스턴스를 사용하는 위치에 자식클래스의 인스턴스를 대신 사용했을 때 코드가 의도에 맞게 작동해야한다는 것이다.

다른 원칙들과 마찬가지로 당연한 원칙이다 그 이유는 상속관계에서의 자식클래스는 부모클래스의 필드와 메소드가 상속받기 때문에 부모클래스의 역할을 하게되는데 이 역할을 정확히 하였는가? 를 묻는 원칙이다.

리스코프 치환 원칙 (LSP)는 개발자 간 협력에 매우 중요하다고 합니다.

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

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

클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다.
인터페이스 분리 원칙은 큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리시킴으로써 클라이언트들이 꼭 필요한 메서드들만 이용할 수 있게 한다.
이와 같은 작은 단위들을 역할 인터페이스라고도 부른다고 한다.

즉, 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야한다는 의미해석도 가능하다

인터페이스 분리 원칙을 통해 시스템의 내부 의존성을 약화시켜 리팩토링, 수정, 재배포를 쉽게 할 수 있다.

🧐 의존성 역전 원칙 (DIP)

의손성 역전 원칙(Dependency Inversion Principle, DIP)이란?

IoC/DI( 제어의 역전/의존성주입 )인가 싶었지만 의존 역전 원칙은 " 고수준 모듈은 저수준 모듈의 구현에 의존하면 안되고, 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야한다" 라고 한다 말이 어렵지만
즉, "자신의 모듈이 변하기 쉬운 모듈에 의존하면 안된다" 라는 의미이다. 또는 "상위 모듈은 하위 모듈에 의존해서는 안된다" 라고 생각해도 된다

쉽게 설명하면 DIP의 핵심은 의존 관계를 맺을 때 변화하기 쉬운 것에 의존하기 보다는, 변화하지 않는 것에 의존하라는 것이다.

References (참고 자료)

0개의 댓글