[ 객체 지향 설계 원칙 ( SOLID ) ]
컴퓨터 프로그래밍에서 SOLID란 로버트 C. 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어 기억술로 소개한 것이다.
프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다.
SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩터링하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다.
이 원칙들은 애자일 소프트웨어 개발과 적응적 소프트웨어 개발의 전반적 전략의 일부다.
SOLID 원칙들은 결국 자기 자신 클래스 안에 응집도는 내부적으로 높이고, 타 클래스들 간 결합도는 낮추는 High Cohesion - Loose Coupling 원칙을 객체 지향의 관점에서 도입한 것이다.
왜 그랬을까? 간단하다. 좋은 소프트웨어는 응집도가 높고 결합도가 낮기 때문이다.
결국 모듈 또는 클래스 당 하나의 책임을 주어 더욱더 독립된 모듈(클래스)을 만들기 위함이다.
이렇게 설계된 소프트웨어는 재 사용이 많아지고, 수정이 최소화 되기 때문에 결국 유지 보수가 용이해진다.
객체 지향 설계의 5대 원칙
- SRP(Single Responsibility Principle) : 단일 책임의 원칙
- OCP(Open Closed Principle) : 개방 폐쇄의 원칙
- LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
- ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
- DIP(Dependency Inversion Principle) : 의존 역전 원칙
[ SRP(Single Responsibility Principle) : 단일 책임의 원칙 ]
어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다 - 로버트 C. 마틴
클래스에 역할과 책임을 너무 많이 부여하지 마라
한 클래스는 하나의 책임만 가져야 한다
클래스를 설계할 때 경계를 확실히 정하고 추상화를 통해 경계 안에서 필요한 속성과 메서드를 선택하여 설계해야 한다
[ OCP(Open Closed Principle) : 개방 폐쇄의 원칙 ]
소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다
- 로버트 C. 마틴
자신의 확장에는 열려있고 주변의 변화에는 닫혀 있어야 한다
[ LSP(Liskov Substitution Principle) : 리스코프 치환 원칙 ]
서브타입은 언제나 자신의 기반타입으로 교체할 수 있어야 한다 - 로버트 C. 마틴
하위 클래스의 인스턴스는 상위 객체 참조 변수에 대입해 상위 클래스 인스턴스 역할에 문제가 없어야 한다(올바른 상속관계 설정)
객체 지향은 인간이 실세계를 보면서 느끼고 논리적으로 이해한 것과 똑같이 프로그래밍 하는게 목적이기 때문에 논리적으로 맞아 떨어져야 하는것이 기본이다
ISP(Interface Segregation Principle) : 인터페이스 분리 원칙 ]
클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다 - 로버트 C. 마틴
상황과 관련 있는 메서드만 제공 할 것
DIP(Depndency Inversion Principle) : 의존 역전 원칙
고차원 모듈은 저차원 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화 된 것에 의존해야 한다
추상화 된 것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상화 된 것에 의존해야 한다
자주 변경되는 구체 클래스에 의존하지 마라 - 로버트 C. 마틴
자주 변경되는 클래스에 의존하지 않아야 한다
추상 클래스나 상위 클래스는 하위 클래스에게 의존적이 되어서는 안된다
참조
https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)
https://limkydev.tistory.com/77
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!