
SRP (단일 책임의 원칙 : Single Responsiblity Principle)
(1). 정의
- 작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어 있어야 한다. 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.
- SRP 원리 적용 시 책임 영역이 확실해져서 한 책임의 변경에서 다른 책임의
변경으로의 연쇄 작용으로부터 자유로울 수 있다.
(2). 적용방법
- 리팩토링 (Refactoring) : 항상 코드와 객체들의 책임을 최상으로 유지하고 분배한다.
- 여러 원인에 의한 변경 (Divergent Change) : 만약 각각의 클래스들이 유사하고 비슷한 책임을 중복해서 갖고 있다면 각각의 클래스들의 공유되는 요소를 부모 클래스로 정의하여 부모 클래스에 위임하는 기 그로 인해 유사한 책임들은 부모에게 명백히 위임하고 다른 책임들은 각자에게 정의할 수 있다.
- 산탄총 수술 (Shotgun Surgery) : 산발적으로 여러 곳에 분포된 책임들을 한 곳에 모으면서 설계를 깨끗하게 한다. 응집성을 높이는 작업
(3). 적용 사례
- 적용 전

- 적용 후

OCP (개방폐쇄의 원칙 : Open Close Principle)
(1). 정의
- 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고,
변경에는 닫혀있어야 한다는 원리
변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화 해야 한다는 의미로, 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야 하며,
기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다.
중요 메커니즘: 추상화, 다형성
(2). 적용방법
- 변경(확장)될 것과 변하지 않을 것을 엄격히 구분한다.
- 두 모듈이 만나는 지점에 인터페이스를 정의한다.
- 구현에 의존하기보다 정의한 인터페이스에 의존하도록 코드를 작성한다.
(3). 적용 사례
- 적용 전

- 적용 후

LAP (리스코브 치환의 원칙 : The Liskov Substitution Principle)
(1). 정의
- 서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다.
즉, 서브 타입은 언제나 기반 타입과 호환될 수 있어야 한다.
- 서브 타입은 기반 타입이 약속한 규약(interface)을 지켜야 한다.
- 서브 클래스는 확장에 대한 인터페이스를 준수해야 한다.
(2). 적용방법
- 똑같은 연산을 제공하지만, 이들을 약간씩 다르게 한다면 공통의 인터페이스를 만들고 두리 이를 구현한다. (인터페이스 상속)
- 공통된 연산이 없다면 완전 별개인 2개의 클래스를 만든다.
(3). 적용사례
컬렉션 프레임워크
- 적용 전

- 적용 후

ISP (인터페이스 분리의 원칙 : Interface Segregation Principle)
(1). 정의
- 하나의 일반적이고 공통적인 인터페이스보다는, 여러 개의 구체적인 인터페이스가 낫다.
- SRP가 클래스의 단일 책임을 강조하다면 ISP는 인터페이스의 단일 책임을 강조한다.
(2). 적용방법
- 클래스 인터페이스를 통한 분리
클래스의 상속을 이용하여 인터페이스를 나눌 수 있다. 인터페이스를 상속받는 순간 인터페이스에 예속되어 제공하는 서비스의 성격이 제한된다.
- 객체 인터페이스를 통한 분리
위임을 이용하여 인터페이스를 나눌 수 있다.
만약 다른 클래스의 기능을 사용해야 하지만 기능을 변경하고 싶지 않다면, 상속 대신 위임을 사용한다.
DIP (의존성 역전의 원칙 : Dependency Inversion Principle)
(1). 정의
- 구체적이며 변동성이 큰 코드는 절대로 언급하지 말아야 한다.
- 유연성이 극대화된 시스템은 소스 코드 의존성이 Abstraction에 의존한다.
- 의존 관계의 역전이란 구조적 디자인에서 발생하던 하위 레벨 모듈의 변경이 상위 레벨 모듈의 변경을 요구하는 위계 관계를 끊는 의미의 역전이다.
- 실제 사용 관계는 바뀌지 않으며, 추상을 매개로 메시지를 주고 받음으로써 관계를 최대한 느슨하게 만드는 원칙이다.
- 즉, 인터페이스의 변동성을 낮춰야 한다. 변동성이 큰 구현체에 의존하는 일을 피해야 하고, 안정된 추상 인터페이스를 선호해야 한다.