개요
Java를 공부하고, Spring을 사용하면서 지속적으로 듣는 얘기가 SOLID 원칙이다.
프로그램을 설계하는 과정에서 SOLID 원칙을 지키면서 개발을 진행해야 한다고 다들 언급해주시길래 이번에 공부하고자 포스팅을 한다.
SOLID 원칙
SOLID란 객체 지향 프로그래밍을 하면서 지켜야하는 5대 원칙으로 유지보수의 용이성, 유연하고 쉬운 확장 등 소프트웨어를 만드는 것에 있어 효율적으로 프로그래밍을 할 수 있게 해준다.
SOLID 원칙은 5가지로 이루어져 있는데, 각각 SRP, OCP, LSP, ISP, DIP가 있는데 이를 하나씩 살펴보려고 한다.
1. 단일 책임 원칙 (SRP, Single Responsibility Principle)
- 클래스는 단 한 개의 책임을 가져야 한다.
- 클래스를 변경하는 이유는 단 하나여야 한다.
- 이를 지키지 않으면, 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향을 미칠 수 있다.
여기서 책임의 의미가 모호한데 책임은 기능, 동작이라고 생각한다.
가령, A라는 클래스에 메소드 B가 있고 B의 결과를 기반으로 하는 C 메소드를 호출하고, C를 기반으로 D를 호출한다고 하면 B를 수정하는 경우 C, D까지 수정해야 할 수도 있어 매우 비효율적이라는 것이다.
그래서 한 클래스 내에서 결과를 기반으로 연결지어 메소드를 만들지 말고, 비슷한 기능을 하는 것 끼리 묶어서 연관성을 줄이자는 의미로 이해했다.
2. 개방-폐쇄 원칙 (OCP, Open-Closed Principle)
- 확장에는 열려있어야 하고, 변경에는 닫혀 있어야 한다.
- 즉, 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야 한다.
- 이를 지키지 않으면 instanceof 와 같은 연산자를 사용하거나, 다운 캐스팅 발생
제일 많이 들었던 원칙으로 Java에서 추상화와 상속으로 이를 구현할 수 있다.
이를 통해 기존 코드를 수정하지 않고 기능을 확장할 수 있도록 하여 유연성을 높이는 것이 목적이다.
3. 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)
- 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 한다. (상위 -> 하위로 치환해도 정상 동작해야함)
- 상속관계에서 일반화 관계(IS-A)가 성립해야 한다.
- 상속관계가 아닌 클래스들을 상속관계로 설정한다면 원칙을 위배하는 행위이다.
4. 인터페이스 분리 원칙 (ISP, Interface Segregation Principle)
- 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다.
- 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 한다. (1개의 통상적인 인터페이스가 아닌 여러 개의 세부적인 인터페이스)
- 인터페이스는 해당 인터페이스를 사용하는 클라이언트를 기준으로 잘게 분리되어야 한다.
5. 의존 역전 원칙(DIP, Dependency Inversion Principle)
- 의존 관계를 맺을 때, 변하기 쉬운 것보다는 변하기 어려운 것에 의존해야 한다. (추상적인 것에 의존)
'Dev > Java' 카테고리의 다른 글
[Java] enum 매핑한 값 DB에 문자열로 저장하기 (0) | 2023.07.06 |
---|---|
[Java] Java와 JVM (1) | 2023.06.05 |
[Java] 클래스 메소드와 인스턴스 메소드 (0) | 2023.06.04 |
[Java] 이차원 배열을 정렬하는 법 (0) | 2023.05.29 |
[Java] 추상 클래스와 인터페이스 (0) | 2023.05.26 |