스터디
객체지향 5원칙(SOLID) 본문
< 객체지향 5원칙(SOLID) >
> SOLID란 객체지향 설계에서 지켜줘야 할 5개의 소프트웨어 개발 원칙(SRP, OCP, LSP, ISP, DIP)을 말한다.
SOLID 객체지향 원칙을 적용하면 코드를 확장하고 유지보수 관리가더 쉬워지며, 불필요한 복잡성을 제거해 리팩토링에 소요되는 시간을 줄임으로써 프로젝트 개발의 생산성을 높일 수 있다.
> 단일 책임 원칙 - SRP(Single Responsibility Principle)
- 단일 책임 원칙은 클래스(객체)는 단 하나의 책임만 가져야 한다는 원칙이다.
- 여기서 '책임'이라는 의미는 하나의 '기능 담당'으로 보면 된다.
- 만일 하나의 클래스에 기능(책임)이 여러 개 있다면 기능 변경(수정)이 일어났을 때 수정해야 할 코드가 많아진다.
- SRP 원칙을 적용하면 다른 클래스들이 서로 영향을 미치는 연쇄 작용을 줄일 수 있다.
- 즉, 응집도(cohesion)는 높이고 결합도(coupling)는 낮출 수 있다.
- 최종적으로 단일 책임 원칙의 목적은 프로그램의 유지보수성을 높이기 위한 설계 기법이다.
> 개방 폐쇄 원칙 - OCP(Open Closed Principle)
- 개방 폐쇄 원칙은 클래스는 '확장에는 열려있어야 하며, 수정에는 닫혀있어야 한다'를 뜻한다.
- 기능 추가 요청이 오면 클래스를 확장을 통해 손쉽게 구현하면서, 확장에 따른 클래스 수정은 최소화하도록 프로그램을 작성해야 하는 설계 기법이다.
- 요구 사항의 변경이나 추가 사항이 발생하더라도 기존 구성 요소는 수정이 일어나지 말아야 하며, 쉽게 확장이 가능하여 재사용할 수 있어야 한다는 뜻이다.
- 확장에 열려있다. - 새로운 변경 사항이 발생했을 때 유연하게 코드를 추가함으로써 큰 힘을 들이지 않고 애플리케이션의 기능을 확장할 수 있다.
- 변경에 닫혀있다. - 새로운 변경 사항이 발생했을 때 객체를 직접적으로 수정을 제한한다.
- 추상화 사용을 통한 관계 구축을 권장하는 것을 의미한다.
- 즉, 다형성과 확장을 가능케 하는 객체지향의 장점을 극대화하는 기본적인 설계 원칙이다.
> 리스코프 치환 원칙 - LSP(Liskov Substitution Principle)
- 리스코프 치환 원칙은 서브 타입은 언제나 기반(부모) 타입으로 교체할 수 있어야 한다는 원칙이다.
- 부모 클래스를 가리키는 포인터에 해당 클래스를 상속하는 자식 클래스를 할당하더라도 모든 기능이 정상적으로 작동해야 하며, 자식 클래스의 상세 내부를 부모 클래스는 알 필요가 없다는 것을 의미한다.
- 한마디로 부모 클래스를 상속한 자식 클래스는 부모 클래스의 역할을 정확히 해내야 한다는 뜻이다.
- 다형성 원리를 이용하기 위한 원칙 개념이다.
- 다형성의 특징을 이용하기 위해 상위 클래스 타입으로 객체를 선언하여 하위 클래스의 인스턴스를 받으면, 업캐스팅된 상태에서 부모의 메서드를 사용해도 동작이 의도대로 흘러가야 하는 것을 의미한다.
- LSP 원칙은 결국 상속의 과정 중 메소드의 재정의가 필요하다면, 현재 자식 클래스가 부모 클래스의 기존 메소드의 의미를 해치지 않는지 신중히 고민하고 올바르게 상속하라는 의미이다.
- 왜냐하면 부모 클래스와 동일한 수준의 선행 조건을 기대하고 사용하는 프로그램 코드에서 예상치 못한 문제를 일으킬 수 있기 때문이다.
> 인터페이스 분리 원칙 - ISP(Interface Segregation Principle)
- 인터페이스 분리 원칙은 인터페이스를 각각 사용에 맞게끔 잘게 분리해야 한다는 설계 원칙이다.
- SRP 원칙이 클래스의 단일 책임을 강조한다면, ISP는 인터페이스의 단일 책임을 강조하는 것으로 보면 된다.
- 즉, SRP 원칙의 목표는 클래스 분리를 통하여 이루어진다면, ISP 원칙은 인터페이스 분리를 통해 설계하는 원칙이다.
- ISP 원칙은 인터페이스를 사용하는 클라이언트를 기준으로 분리함으로써, 클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하는 것이 목표이다.
- 다만 ISP 원칙의 주의해야 할 점은 한 번 인터페이스를 분리하여 구성해놓고 나중에 무언가 수정 사항이 생겨서 또 인터페이스들을 분리하는 행위를 가하지 말아야 한다.
(인터페이스는 한 번 구성하였으면 웬만해선 변하면 안 되는 정책 개념) - 인터페이스는 제약 없이 자유롭게 다중 상속(구현)이 가능하기 때문에, 분리할 수 있으면 분리하여 각 클래스 용도에 맞게 implements 하라는 설계 원칙이라고 이해하면 된다.
> 의존 역전 원칙 - DIP(Dependency Inversion Principle)
- 의존 역전 원칙은 어떤 클래스를 참조해서 사용해야 하는 상황이 생긴다면, 그 클래스를 직접 참조하는 것이 아니라 그 대상의 상위 요소(추상 클래스 or 인터페이스)로 참조하라는 원칙이다.
- 클래스 사이에는 의존 관계가 존재하기 마련인데 의존 관계가 존재하되, 구체적인 클래스에 의존하지 말고 최대한 추상화한 클래스(인터페이스)에 의존하라는 뜻이다.
- 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는, 변화하기 어려운 것과 거의 변화가 없는 것에 의존하라는 것이다.
- 의존 역전 원칙의 지향점은각 클래스 간의 결합도(coupling)을 낮추는것이다.
'백엔드' 카테고리의 다른 글
HTTP Method (0) | 2023.04.06 |
---|---|
객체와 인스턴스 차이 (0) | 2023.04.05 |
JavaScript enum (1) | 2023.04.04 |
JavaScript REST API (0) | 2023.04.04 |
JavaScript 네이밍 컨벤션 (1) | 2023.04.04 |