객체지향 설계 5원칙 - SOLID
SRP(Single Responsibility Principle): 단일 책임 원칙
OCP(Open Closed Priciple): 개방 폐쇄 원칙
LSP(Listov Substitution Priciple): 리스코프 치환 원칙
ISP(Interface Segregation Principle): 인터페이스 분리 원칙
DIP(Dependency Inversion Principle): 의존 역전 원칙
단일 책임 원칙 (Single Responsiblity Principle)
함수나 클래스, 리액트의 컴포넌트 등은 한 가지 일만 수행해야 합니다.
하나의 클래스가 너무 많은 일을 하는 것은 좋은 코드가 아닙니다.
각각을 분리해서 각 파일의 양을 줄이고 재사용할 수 있도록 분리해 주는 것이 단일 책임 원칙을 따르는 것입니다.
개방 폐쇄 원칙 (Open Closed Principle)
소프트 웨어 엔티티는 확장을 위해 열려 있어야 하지만 수정을 위해 닫혀야 합니다.
즉, 소스 코드를 수정하지 않고 확장할 수 있습니다.
개방 폐쇄 원칙을 무시한다면 객체지향의 장점인 유연성, 재사용성, 유지보수성 등을 얻을 수 없게됩니다.
JDBC가 개방 폐쇄 원칙의 가장 좋은 예입니다.
데이터베이스가 MySQL에서 오라클로 바뀌더라도 Connection을 설정하는 부분만 변경해주면 됩니다.
즉, 자바 애플리케이션은 데이터베이스라고 하는 주변의 변화에 닫혀 있는 것입니다.
데이터베이스를 교체한다는 것은 데이터베이스가 자신의 확장에는 열려 있다는 것입니다.
리스코프 치환 원칙 (Liskov Principle)
서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다. - 로버트 C.마틴
- 하위 클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류다.
- 구현 클래스 is able to 인터페이스: 구현 분류는 인터페이스할 수 있어야 한다.
위의 두 문장을 잘 지키고 있다면 이미 리스코프 치환 원칙을 잘 지키고 있다고 할 수 있습니다.
하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 합니다.
리스코프 치환 원칙 위배
- 아버지 - 딸(계층도/조직도)
리프코프 치환 원칙 만족
- 동물 - 펭귄 구조(분류도)
인터페이스 분리 원칙 (ISP)
클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안 된다. - 로버트 C.마틴
자신이 사용하지 않는 기능(인터페이스)에는 영향을 받지 말아야 합니다.
단일 책임 원칙(SRP)에서는 하나의 역할(책임)만 하도록 다수의 클래스로 분할하였습니다
단일 책임 원칙(SRP)과 인터페이스 분할 원칙(ISP)은 같은 문제에 대한 두 가지 다른 해결책이라고 볼 수 있습니다.
하지만 특별한 경우가 아니라면 단일 책임 원칙을 적용하는 것이 더 좋은 해결책이라고 할 수 있습니다.
- 상위 클래스는 풍성할수록 좋다.
- 풍성할수록 하위 클래스에게 많은 기능을 확장시켜주는 것이고, 형변환, 코드 중복을 줄여줍니다.
- 인터페이스 내에 메소드는 최소한 일수록 좋다.
- 인터페이스는 하위 클래스에게 구현을 강제하도록 하는 역할입니다. 즉, 최소한의 기능만 제공하면서 하나의 역할에 집중하라는 뜻입니다.
의존성 역전 원칙 (Dependency Inversion Principle)
고차원 모듈은 저차원 모듈에 의존하면 안 된다.
추상화된 것은 구체적인 것에 의존하면 안 된다.
구체적인 것이 추상화된 것에 의존해야 한다.
자주 변경되는 구체(Concrete) 클래스에 의존하지 마라 - 로버트 C.마틴 -
자동차가 타이어에 의존하면 어떻게 될까요? 자동차 타이어는 자주 바뀌게 되는 것 중 하나입니다.
이렇게 자주 바뀌는 것에 의존하면 자동차는 영향을 받게 되어 있습니다.
즉, 자동차 자신보다 더 자주 변하는 스노우타이어에 의존하기에 좋지 않음을 알 수 있습니다.
자동차가 구체적인 타이어가 아닌 추상화된 타이어 인터페이스에만 의존하게 함으로써 타이어가 변경되어도 자동차가 영향을 받지 않습니다.
이처럼 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나,
상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 것이 의존 역전 원칙입니다.
상위 클래스일수록, 인터페이스일수록, 추상 클래스일수록 변하지 않을 가능성이 높기에
하위 클래스나 구체 클래스가 아닌 상위 클래스, 인터페이스, 추상 클래스를 통해 의존하라는 것이 바로 의존 역전 원칙입니다.
참조
'Study > 웹기초' 카테고리의 다른 글
응집도 vs 결합도 (0) | 2022.10.05 |
---|---|
객체 지향의 3가지 특징 - 캡슐화, 상속, 다형성 (1) | 2022.10.05 |
캡슐화(encapsulation) (0) | 2022.09.22 |
관심사의 분리(SoC) (0) | 2022.09.22 |
이벤트루프와 태스크 큐, 마이크로태스크 큐 (0) | 2022.09.20 |