SOLID는 객체지향 프로그래밍의 다섯 가지 설계 원칙을 나타내며, 그 내용은 다음과 같습니다.
1. SRP (Single Responsibility Principle, 단일 책임 원칙)
- 클래스는 단 하나의 책임만을 가져야 합니다.즉, 하나의 클래스는 하나의 기능에만 집중해야 합니다.
- 단일 책임 원칙을 제대로 지키면 변경이 필요할 때 수정할 대상이 명확해집니다. 이러한 단일 책임 원칙의 장점은 시스템이 커질수록 극대화되는데, 시스템 규모의 확장으로 서로 많은 의존성을 갖는 상황에서 변경 요청이 오면 단 1가지만 수정하면 되기 때문입니다.
2. OCP (Open-Closed Principle, 개방-폐쇄 원칙)
- 확장에는 열려있고 수정에는 닫혀있어야 합니다. 즉, 기존 코드를 수정하지 않고 새 기능을 추가할 수 있어야 합니다.
- '확장에 열려 있다' : 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션 기능을 확장할 수 있다.
- '수정에 닫혀 있다' : 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다.
3. LSP (Liskov Substitution Principle, 리스코프 치환 원칙)
- 하위 타입은 상위 타입을 대체할 수 있어야 합니다. 즉, 하위 클래스는 상위 클래스의 동작 규칙을 따라야 합니다.
- 이는 클라이언트와 객체 사이에는 계약이 존재하고 이를 준수해야 한다는 원칙이므로 계약에 따른 설계(design by contract)라고 표현할 수있습니다.
4. ISP (Interface Segregation Principle, 인터페이스 분리 원칙)
- 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공해야 합니다.
- 이를 준수함으로써 모든 클라이언트가 자신의 관심에 맞는 퍼블릭 인터페이스만을 접근하여 불필요한 간섭을 최소화할 수 있습니다.
- 예를 들어, 읽기/쓰기 작업을 지원하는 구현 클래스에 대해 특정 클라이언트가 읽기 작업만을 필요로 한다면 별도의 읽기 인터페이스를 만들어 제공해주는 것입니다.
5. DIP (Dependency Inversion Principle, 의존 역전 원칙)
- 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 합니다.
- 고수준 모듈 : 입력과 출력으로부터 먼(비즈니스와 관련된) 추상화된 모듈
- 저수준 모듈 : 입력과 출력에 가까운(HTTP, DB, 캐시 등과 관련된) 구현 모듈
- 객체지향 프로그래밍에서는 객체들 사이에 메시지를 주고 받기 위한 의존성이 생기는데, 해당 원칙은 올바른 의존 관계를 세우기 위한 원칙입니다.
- 의존성 역전 원칙을 준수하는 가장 일반적인 방법은 의존성 주입(Dependency Injection)을 이용하는 것입니다. 이를 통해 고수준 모듈은 직접 저수준 모듈을 생성하거나 관리하지 않고, 외부에서 이들을 제공받을 수 있습니다.
- 결국 비즈니스와 관련된 부분이 세부사항에 의존해선 안됨을 의미합니다.
정리하면 SOLID 원칙의 핵심은 추상화와 다형성으로, 구체 클래스에 의존하지 않고 추상 클래스에 의존함으로써 읽기 쉽고 확장도 쉬운 소프트웨어를 개발하는 것입니다.
Q. 객체지향 프로그래밍의 SOLID 원칙에 대해 간략히 설명해주세요.
SOLID 원칙은 객체지향 프로그래밍의 5가지 설계 원칙을 나타냅니다.
첫째 원칙인 단일 책임 원칙은 클래스가 단 하나의 책임만을 져야한다는 것으로, 클래스 간의 의존성을 낮춰 변경이 필요할 때 수정할 대상이 명확해집니다.
둘째 원칙인 개발-폐쇄 원칙은 변화에 열려 있고, 수정엔 닫혀 있어야 함을 의미하는데, 이는 기존 코드를 수정하지 않고도 새로운 기능을 확장/개발할 수 있어야 함을 의미합니다.
셋째 원칙인 리스코프 치환 원칙은 하위 타입은 상위 타입을 대체할 수 있어야 함을 뜻하며, 이는 하위 클래스가 상위 클래스의 동작 규칙(계약)을 따라야 한다는 것입니다.
넷째 원칙인 인터페이스 분리 원칙은 클라이언트의 목적 및 요구에 적합한 인터페이스만을 제공해야 함을 의미합니다.
마지막 원칙은 의존성 역전 원칙은 비즈니스 로직 같은 고수준 모듈이 HTTP 및 DB 같은 저수준 모듈에 의존해서는 안된다는 원칙입니다.
참고 출처
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 인터페이스와 추상 클래스의 차이 (1) | 2024.02.01 |
---|---|
[Java] 클래스, 객체, 인스턴스의 차이 (0) | 2024.01.29 |
[Java] OOP의 4가지 특징 (0) | 2024.01.23 |
[Java] 자바 접근 제어자의 유형과 특징 (0) | 2024.01.22 |
[Java] String vs. StringBuilder vs. StringBuffer 차이 (0) | 2024.01.18 |