[객체 지향 프로그래밍 및 설계의 5가지 기본 원칙] - SOILD 원칙
- SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 역전 원칙)
- 코드 확장 및 유지 보수가 더 쉬워지며, 불필요한 복잡성을 제거해 리팩토링에 소요되는 시간을 감소시킴으로써 프로젝트 개발의 생산성을 높일 수 있습니다.
1. 단일 책임 원칙 (Single Responsiblity Principle)
• 하나의 클래스(객체)는 단 하나의 책임만 가져야 한다는 원칙입니다. 여기 '책임'은 '기능'을 의미합니다.
• 이는 클래스(객체)가 변경되는 이유는 한 가지여야 한다는 것와 같습니다.
• 즉, 하나의 클래스(객체)는 하나의 기능을 담당하여 하나의 책임을 수행하는데 집중될 수 있도록 클래스를 분리하여 설계하라는 의미입니다.
이때 객체지향 설계의 핵심인 높은 응집도(하나의 책임을 명확히 정의하고 관련 기능을 잘 묶는 것)와 낮은 결합도(다른 클래스와의 의존성을 최소화하는 것)를 고려하여 분리하여야 합니다.
• SRP의 궁극적인 목적은 프로그램의 유지보수성 향상입니다.
• 너무 많은 책임 분리로 책임이 파편화되어있는 경우 '산탄총 수술(Shotgun Surgery)'로 다시 응집력을 높여줍니다.
2. 개방 - 폐쇄 원칙 (Open - Closed Principle)
• 확장에는 열려있고 수정에는 닫혀있어야 한다는 원칙입니다.
• 즉, 새로운 변경 사항이 발생했을 때 유연하게 코드를 추가함으로써 쉽게 기능을 확장할 수 있게 확장에 대해서 개방적(Open)이고 객체를 직접적으로 수정하는 것은 제한하는 수정에 대해서는 폐쇄적(Closed)으로 설계되어야 한다는 의미입니다.
• OCP는 추상화를 통한 관계 구축을 권장함으로써, 궁극적으로 다형성과 확장을 가능케 하는 객체지향의 장점인 유연성, 재사용성, 유지보수성 등을 활용할 수 있습니다.
• OCP의 대표적인 예시가 Java의 데이터베이스 인터페이스인 JDBC입니다.
3. 리스코프 치환 원칙 (Liskov Substitution Principle)
• 서브 타입은 언제나 기반(부모) 타입으로 교체할 수 있어야 한다는 원칙입니다.
• 즉, 부모 클래스 자리에 자식 클래스를 사용해도 코드의 원래 의도대로 잘 작동해야 한다는 의미입니다.
• LSP의 궁극적인 목적은 다형성을 통한 확장성 획득입니다.
• LCP의 대표적인 예시가 Java의 Collection 인터페이스입니다.
4. 인터페이스 분리 원칙 (Interface Segregation Principle)
• 인터페이스를 클라이언트의 목적과 용도에 적절하게 분리하여, 목적과 용도에 적합한 인터페이스 만을 제공하여야 한다는 원칙입니다.
• 이를 위해서 이미 구성한 인터페이스는 변경하지 않습니다.
이후 수정사항이 발생하여도 별도의 인터페이스를 생성하여 해당 인터페이스를 주입받도록 구현하지, 인터페이스를 분리하지 않습니다.
• SRP이 클래스의 단일 책임을 강조한다면, ISP는 인터페이스의 단일 책임을 강조하는 것입니다.
• 즉, SRP의 목표가 클래스 분리를 통하여 이루어진다면 ISP는 인터페이스 분리를 통하여 설계하는 원칙입니다.
5. 의존 역전 원칙 (Dependency Inversion Principle)
• 어떤 클래스를 참조해야 하는 상황이면 그 클래스를 직접 참조하는 것이 아니라 그 상위 요소를 참조하라는 원칙입니다.
• 즉, 구체적인 구현 클래스에 의존하지 말고 인터페이스나 추상 클래스에 의존하라는 의미입니다.
• 구체적인 하위 모듈에 클라이언트가 의존하게 되면, 하위 모듈에 변화가 있을 때마다 클라이언트나 상위 모듈의 코드를 수정해야 되는 문제가 발생합니다.
'✏ Study > Java' 카테고리의 다른 글
| [계산기 만들기] SOLID 원칙 (0) | 2024.09.09 |
|---|