SOLID란 좋은 객체지향 소프트웨어 설계를 위한 5가지 원칙이다. 5가지 원칙은 다음과 같다.
단일 책임 원칙(single responsibility principle)이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. 클래스가 제공하는 모든 기능은 이 책임과 주의 깊게 부합해야 한다. [위키백과]
개방-폐쇄 원칙(OCP, Open-Closed Principle)은 '소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다'는 프로그래밍 원칙이다. [위키백과]
가장 중요시 되는 원칙.
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- 참조: [JAVA] 다형성이란?
- Taxi의 차량이 확장되어도 확장된 차량 소스코드만 새로이 생기는 것이지 TaxiDriver 입장에서 기존 코드에는 변경이 없다.
- 하지만 실질적으로 Main 함수에 인스턴스를 초기화하는 부분에서 다른 차량의 인스턴스로 교체 해주어야 함으로 변경이 일어남. OCP 원칙을 위반한 것.
- 분명 다형성을 사용했지만 원칙을 재대로 지킬 수 없음.
- 이를 해결 하기 위해선 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요함.
- 그 역할을 스프링과 같은 프레임워크에서 가능하게끔 만들어 줌. (Dependency Injection과 같은..)
컴퓨터 프로그램에서 자료형 S가 자료형 T의 하위형이라면 필요한 프로그램의 속성(정확성, 수행하는 업무 등)의 변경 없이 자료형 T의 객체를 자료형 S의 객체로 교체(치환)할 수 있어야 한다는 원칙이다. [위키백과]
인터페이스 분리 원칙은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다. 인터페이스 분리 원칙은 큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리시킴으로써 클라이언트들이 꼭 필요한 메서드들만 이용할 수 있게 한다. 이와 같은 작은 단위들을 역할 인터페이스라고도 부른다. 인터페이스 분리 원칙을 통해 시스템의 내부 의존성을 약화시켜 리팩토링, 수정, 재배포를 쉽게 할 수 있다. [위키백과]
의존관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 이 원칙은 다음과 같은 내용을 담고 있다.
첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.
이 원칙은 '상위와 하위 객체 모두가 동일한 추상화에 의존해야 한다'는 객체 지향적 설계의 대원칙을 제공한다. [위키백과]
- 참조: [JAVA] 다형성이란?
- TaxiDriver(클라이언트)는 Taxi라는 인터페이스에만 의존하면 되지, 그 Taxi가 어떤 차인지, 아반떼인지 소나타인지 그랜저인지의 구현체에 대해서는 중요하지 않음.
- TaxiDriver는 아반떼만 운전을 해보았기 때문에 아반떼만을 Taxi로 사용 할 수 있어서는 안된다는 것임.
- TaxiDriver는 만약 아반떼가 고장 났을 경우 언제든지 다른 차량으로 교체하여 운전 할 수 있어야 함.
- 키보드와 같은 입력장치도 마찬가지, 키보드가 고장 났을 경우 언제든지 다른 키보드로 교체할 수 있어야 함.
- 하지만 실질적으로 Main 함수에 인스턴스를 초기화하는 부분에서 다른 차량의 인스턴스로 교체 해주어야 함으로 이는 Taxi 인터페이스와 Avente, Sonata, Grandeur의 구현체에 모두 의존하고 있는 것임.(추상화에도 의존하고 구체화에도 의존) 즉 DIP를 위반함.
- 분명 다형성을 사용했지만 원칙을 재대로 지킬 수 없음.
- 이를 해결 하기 위해선 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요함.
- 그 역할을 스프링과 같은 프레임워크에서 가능하게끔 만들어 줌. (Dependency Injection과 같은..)
좋은 글 감사합니다. :)