☕️ 객체 지향 설계 5원칙 - SOLID
SOLID란 객체 지향 프로그래밍을 하면서 지켜야 하는 5대 원칙을 뜻한다. SOLID는 각 5가지 원칙의 앞 글자를 따서 부르는 이름으로 5가지 원칙은 다음과 같다.
- SRP(Single Responsibility Principle) - 단일 책임 원칙
- OCP(Open Closed Principle) - 개방 폐쇄 원칙
- LSP(Liskov Substitution Principle) - 리스코프 치환 원칙
- ISP(Interface Segregation Principle) - 인터페이스 분리 원칙
- DIP(Dependency Inversion Principle) - 의존 역전 원칙
SOLID 원칙을 철저히 지키면 시간이 지나도 변경이 용이하고, 유지보수와 확장이 쉬운 소프트웨어를 개발하는데 도움이 되는 것으로 알려져 있다.
☕️ SRP(Single Responsibility Principle) - 단일 책임 원칙
단일 책임의 원칙은 클래스(객체)는 단 하나의 책임만 가져야 한다는 원칙으로 하나의 클래스는 하나의 기능 담당하여 하나의 책임을 수행하는데 집중되도록 클래스를 따로따로 여러 개 설계하라는 원칙이다.
만일 하나의 클래스에 기능(책임)이 여러개 있다면 기능 변경(수정) 이 일어났을 때 수정해야 할 코드가 많아진다.
예를 들어 A를 고쳤더니 B를 수정해야 하고 또 C를 수정해야 하고, C를 수정했더니 다시 A로 돌아가서 수정해야 하는, 마치 책임이 순환되는 형태가 되어버린다.
따라서 SRP 원칙을 따름으로써 한 책임의 변경으로부터 다른 책임의 변경으로의 연쇄작용을 극복할 수 있게 된다.
최종적으로 단일 책임 원칙의 목적은 프로그램의 유지보수 성을 높이기 위한 설계 기법이다.
☕️ OCP(Open Closed Principle) - 개방 폐쇄 원칙
확장에 대해 열려있고 수정에 대해서는 닫혀있어야 한다는 원칙으로, 각각이 갖는 의미는 다음과 같다.
- "확장에 대해 열려 있다"
요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있다. - "수정에 대해 닫혀 있다"
기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다.
☕️ LSP(Liskov Substitution Principle) - 리스코프 치환 원칙
서브 타입은 언제나 기반(부모) 타입으로 교체할 수 있어야 한다는 원칙이다.
다형성의 특징을 이용하기 위해 상위 클래스 타입으로 객체를 선언하여 하위 클래스의 인스턴스를 받으면, 업캐스팅된 상태에서 부모의 메서드를 사용해도 동작이 의도대로 흘러가야 하는 것을 의미하는 것이다.
☕️ ISP(Interface Segregation Principle) - 인터페이스 분리 원칙
클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공하는 것이다. 큰 덩어리의 인터페이스들을 작은 단위들로 분리시키고, 꼭 필요한 메서드들만 사용하여 내부 의존성 관계를 느슨하게 한다.
☕️ DIP(Dependency Inversion Principle) - 의존 역전 원칙
의존 역전 원칙은 자식 또는 구체화된 클래스에 의존하면 안 된다는 뜻이다. 즉, '자신보다 변하기 쉬운 것에 의존하지 마라'는 원칙이다.
만약 의존 역전 원칙을 지키지 않으면 구체화된 클래스가 수정될 때마다 상위 클래스나 추상 클래스가 변화해야 한다. 만약 그 상위에 연관되어 있는 클래스가 있다면 거기까지 수정되어야 한다. 따라서 하위 클래스나 구체화된 클래스에 의존하는 설계는 좋은 설계가 될 수 없다.
References.
1. inpa - 객체 지향 설계의 5가지 원칙 - S.O.L.I.D
2. 장쫄깃 기술블로그 - [Java] 객체 지향 설계 5원칙 - SOLID
3. 망나니개발자 - [OOP] 객체지향 프로그래밍의 5가지 설계 원칙, 실무 코드로 살펴보는 SOLID
4. kimsangmin.log - 객체 지향 4가지 특징과 5가지 원칙
'Java' 카테고리의 다른 글
[Java] String, StringBuffer, StringBuilder 차이 (2) | 2023.04.16 |
---|---|
[Java] 클래스, 객체, 인스턴스 차이 (0) | 2023.04.12 |
[Java] 객체지향의 4대 특징 - 캡슐화, 추상화, 상속, 다형성 (0) | 2023.04.10 |
[Java] 자바란? (2) | 2023.04.09 |
[Java] 자바 개발환경 준비 - JDK 설치 및 환경변수 설정 (0) | 2023.02.06 |