Java
[Java] 객체지향 5원칙 SOLID
Woogie
2022. 5. 24. 01:24
📌 객체지향 설계 5원칙 SOLID
- 객체지향을 설계할 때는 5가지 원칙이 존재한다. 이 원칙은 시간이 지나도 유지 보수와 확장이 쉬운 소프트웨어를 만드는데 이 원칙들을 적용할 수 있다.
1. SPR (단일 책임 원칙)
2. OCP (개방-폐쇄 원칙)
3. LSP (리스코프 치환 원칙)
4. DIP (의존 역전 원칙)
5. ISP (인터페이스 분리 원칙)
- 응집도와 결합도
- 좋은 소프트웨어 설계를 위해서는 결합도 (coupling)는 낮추고 응집도 (cohesion)는 높여야 한다.
- 결합도란?
- 모듈 (클래스) 간의 상호 의존 정도를 나타내는 지표로써 결합도가 낮으면 모듈 간의 상호 의존성이 줄어들어서 객체의 재사용 및 유지보수가 유리하다.
- 응집도란?
- 하나의 모듈 내부에 존재하는 구성 요소들의 기능적 관련성으로 응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져, 재사용 및 유지보수가 용이하다.
- SPR (Single Responsibility Principle) 단일 책임 원칙
- 어떠한 클래스를 변경해야 하는 이유는 한 가지뿐 이어야 한다.
- 소프트웨어의 설계 부품 (클래스, 메소드 등) 은 단 하나의 책임만을 가져야 한다.
- SPR을 지켜야 하는 이유는 응집도와 결합도 관점에서 접근하면 된다.
- OCP (Open Closed Principle) 개방 폐쇄 원칙
- 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야 한다.
- 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
- 상위 클래스 또는 인터페이스를 중간에 둠으로써, 자신은 변화에 대해서는 폐쇄적이지만, 인터페이스는 외부의 변화에 대해서 확장을 개방해 줄 수 있다.
- 이러한 부분은 JDBC와 Mybatis, Hibernate 등 Java에서는 Stream(Input, Out)에서 찾아볼 수 있다.
- LSP (Liskov Subsitution Principle) 리스 코프 치환 원칙
- 자식 클래스는 부모 클래스에게 가능한 행위를 수행할 수 있어야 한다.
- 서브 타입은 언제나 자신의 기반 (상위) 타입으로 교체할 수 있어야 한다.
- 이 원칙은 리스 코프 교수가 제안한 설계 원칙으로 부모 클래스와 자식 클래스 사이의 행위에는 일관성이 있어야 한다는 원칙이다. 객체 지향 프로그래밍에서 부모 클래스의 인스턴스 대신 자식 클래스의 인스턴스를 사용해도 문제가 없다.
- ISP (Interface Segregation Principle) 인터페이스 분리 원칙
- 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다. 하나의 일반적인 인터페이스보다는, 여러 개의 구체적인 인터페이스가 낫다.
- 클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안 된다.
- 프로젝트 요구 사항과 설계에 따라서 SRP / ISP를 선택한다.
- 이 원칙은 결국 자신이 사용하지 않는 기능에는 영향을 받지 말아야 한다는 의미이다. 이 원칙은 인터페이스를 클라이언트에 특화되도록 분리시키는 설계 원칙이라고 할 수 있다.
- DIP (Dependency Inversion Priniple) 의존 역전 원칙
- 의존 관계를 맺을 때, 변화하기 쉬운 것보단 변화하기 어려운 것에 의존해야 한다는 원칙이다.
- 자신보다 변하기 쉬운 것에 의존하지 말아야 한다.
- 변화하기 쉬운 것이란 구체적인 것을 뜻하고, 변화하기 어려운 것이란 추상적인 것을 의미한다. 객체 지향적인 관점에서 볼 때, 변화하기 쉬운 것은 구체화된 클래스를 의미하고, 변화하기 어려운 것은 추상 클래스나 인터페이스를 의미한다. 즉, DIP를 만족한다는 것은 의존 관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺는 것을 의미한다.