# 객체지향 5대원칙(SOLID 원칙)이란
자바에서 유지보수와 확장이 쉬운 소프트웨어를 만들기 위한 원칙으로
SRP(Single Responsibility Principle 단일 책임 원칙) ,
OCP(Open-Closed Principle 개방-폐쇄 원칙),
LSP(Liskov Substitution Principle 리스코프 치환 원칙),
ISP(Interface Segregation Principle 인터페이스 분리 원칙),
DIP(Dependency Inversion Principle 의존 역전 원칙)이 있다.
각 원칙의 앞 글자를 따서 SOLID원칙이라고 한다.
1. SRP(Single Responsibility Principle 단일 책임 원칙)
- 소프트웨어의 설계부품(클래스, 함수 등)은 단 하나의 책임만을 가져야 한다.
여기서 말하는 책임이란 '기능'을 의미한다. 클래스와 함수가 비대해지거나 결합도가 높지 않도록(높은 응집도와 낮은 결합도) 설계함으로서 유지보수에 대한 비용이 낮아지도록 한다.
2. OCP(Open-Closed Principle 개방-폐쇄 원칙)
- 기존 코드 변경에는 CLOSE, 추가나 확자에는 OPEN
설계를 할 때 '변경되는 것이 무엇인지'를 고려하는 것이다. 자주 변경되지 않을 내용은 수정에 영향받지 않도록, 자주 변경될 내용은 수정이 쉽도록 설계하는 것이다. 이를 위해 자주 사용되는 문법이 인터페이스이다. OCP에 만족하는 설계는 변경에 유연하므로 유지보수 비용이 낮아지고 코드 가독성이 높아진다.
3. LSP(Liskov Substitution Principle 리스코프 치환 원칙)
- 자식 클래스는 부모 클래스에서 가능한 행위를 수행할 수 있어야 한다.
MIT 컴퓨터 사이언스 교수인 리스코프에 제안한 설계원칙이다. 부모 클래스와 자식 클래스 사이의 행위에는 일관성이 있어야 한다는 원칙이며, 이는 객체 지향 프로그래밍에서 부모 클래스의 인스턴스 대신에 자식 클래스의 인스턴스를 사용해도 문제가 없어야 한다는 것이다.
상속 관계에서는 일반화 관계가 성립해야한다.
예를 들자면, 조류 클래스와 독수리 클래스가 있고, 독수리 클래스는 조류 클래스를 상속받는다고 가정해보자.
(1) 조류는 날개를 가지고 있다.
(2) 조류의 다리는 두개이다.
(3) 조류는 날 수 있다.
일관성을 확인하는 방법은 단어를 교체해보는 것이다.
(1) 독수리는 날개를 가지고 있다.
(2) 독수리의 다리는 두개이다.
(3) 독수리는 날 수 있다.
조류대신 독수리를 넣어보면 오류없이 일관성이 있음을 확인할 수 있다.
그러나 오리를 넣어보면 (3)문장이 어색하다.
(1) 오리는 날개를 가지고 있다.
(2) 오리의 다리는 두개이다.
(3) 오리는 날 수 있다. ------------>어색함
조류 클래스는 LSP를 만족하지 않게 되므로 (3)문장을 수정해 일반화 관계가 성립하도록 해야한다.
4. Interface Segregation Principle (인터페이스 분리 원칙)
- 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다. 즉, 한 클래스가 한 개의 일반적인 인터페이스보다는, 여러 개의 구체적인 인터페이스가 낫다.
스마트폰을 예로 들어보자.
스마트폰을 통해 전화, 웹서핑, 사진 촬영 등 다양한 기능을 사용할 수 있다. 그런데 전화를 할 때에는 웹서핑, 사진촬영 등 다른 기능은 사용하지 않는다. 따라서 전화기능과 웹서핑 기능 사진 촬영 기능은 각각 독립된 인터페이스로 구현하여, 서로에게 영향을 받지 않도록 설계해야 한다. 이렇게 설계된 소프트웨어는 인터페이스 분리 원칙을 통해 시스템의 내부 의존성을 약화시켜 리팩토링, 수정, 재배포를 쉽게 할 수 있다.
5. Dependency Inversion Principle (의존 역전 원칙)
- 의존 관계를 맺을 때, 변화하기 쉬운것(구체적인것) 보단 변화하기 어려운 것(추상적인것)에 의존해야 한다
변화하기 쉬운것이란 구체적인 클래스를 의미하고, 변화하기 어려운 것은 추상클래스나 인터페이스를 의미한다. DIP를 만족하는 것은 의존 관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상클래스와 관계를 맺는것을 의미한다. DIP를 만족하면 '의존성 주입'을 활용해 유연한 설계를 할 수 있다.
#Reference
JAVA 객체 지향 디자인 패턴(정인상/채홍석 지음, 한빛미디어, 2014)
'개발 공부 > Java' 카테고리의 다른 글
Optional 클래스란? (0) | 2021.01.21 |
---|