SOLID 원칙
SOLID 원칙이란?
SOLID 원칙
은 객체 지향 프로그래밍에서 코드의 유지보수성과 확장성을 높이기 위한 다섯 가지 기본 원칙을 의미한다. 이 원칙들은 Robert C. Martin(일명 Uncle Bob)에 의해 제안되었으며, 잘 설계된 소프트웨어 시스템을 구축하는 데 중요한 가이드라인을 제공한다. SOLID는 다음 다섯 가지 원칙의 약자이다: 단일 책임 원칙(Single Responsibility Principle), 개방-폐쇄 원칙(Open/Closed Principle), 리스코프 치환 원칙(Liskov Substitution Principle), 인터페이스 분리 원칙(Interface Segregation Principle), 의존 역전 원칙(Dependency Inversion Principle).
1. 단일 책임 원칙 (Single Responsibility Principle, SRP)
정의
클래스는 단 하나의 책임만 가져야 하며, 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어야 한다.
예시 코드
public class Order {
private Long id;
private String description;
// getter와 setter
}
public class OrderRepository {
public void save(Order order) {
// 데이터베이스 저장 로직
}
public Order findById(Long id) {
// 데이터베이스 조회 로직
return new Order();
}
}
여기서 Order
클래스는 주문에 대한 데이터만 가지고 있으며, 데이터베이스 작업은 OrderRepository
클래스가 담당한다.
2. 개방-폐쇄 원칙 (Open/Closed Principle, OCP)
정의
소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 열려 있어야 하고, 수정에는 닫혀 있어야 한다.
예시 코드
public interface Shape {
double area();
}
public class Circle implements Shape {
private double radius;
public double area() {
return Math.PI * radius * radius;
}
}
public class Rectangle implements Shape {
private double width;
private double height;
public double area() {
return width * height;
}
}
여기서 Shape
인터페이스를 구현한 Circle
과 Rectangle
클래스는 새로운 도형 클래스를 추가하더라도 기존 코드를 수정할 필요가 없다.
3. 리스코프 치환 원칙 (Liskov Substitution Principle, LSP)
정의
서브타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.
예시 코드
public class Bird {
public void fly() {
// 나는 로직
}
}
public class Sparrow extends Bird {
// 참새에 대한 추가 행동
}
여기서 Sparrow
클래스는 Bird
클래스의 모든 기능을 포함하고 있으며, Bird
타입으로 대체되어도 문제 없이 동작한다.
4. 인터페이스 분리 원칙 (Interface Segregation Principle, ISP)
정의
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
예시 코드
public interface Printer {
void print(Document d);
}
public interface Scanner {
void scan(Document d);
}
public class MultiFunctionPrinter implements Printer, Scanner {
public void print(Document d) {
// 인쇄 로직
}
public void scan(Document d) {
// 스캔 로직
}
}
여기서 Printer
와 Scanner
인터페이스는 각각의 클라이언트에 맞게 분리되어 있다.
5. 의존 역전 원칙 (Dependency Inversion Principle, DIP)
정의
고수준 모듈은 저수준 모듈에 의존해서는 안 된다. 둘 다 추상화에 의존해야 한다.
예시 코드
public interface Repository {
void save(Object obj);
}
public class DatabaseRepository implements Repository {
public void save(Object obj) {
// 데이터베이스에 저장 로직
}
}
public class Service {
private Repository repository;
public Service(Repository repository) {
this.repository = repository;
}
public void saveObject(Object obj) {
repository.save(obj);
}
}
여기서 Service
클래스는 Repository
인터페이스에 의존하고, 구체적인 구현인 DatabaseRepository
클래스에 의존하지 않는다.
마치며
SOLID 원칙
은 소프트웨어 설계에서 코드의 유지보수성과 확장성을 높이기 위한 중요한 가이드라인이다. 단일 책임 원칙(SRP)은 각 클래스가 하나의 책임만을 가지도록 하고, 개방-폐쇄 원칙(OCP)은 소프트웨어 엔티티가 확장에는 열려 있고 수정에는 닫혀 있도록 한다. 리스코프 치환 원칙(LSP)은 서브타입이 기반 타입으로 교체될 수 있도록 하고, 인터페이스 분리 원칙(ISP)은 특정 클라이언트를 위한 인터페이스를 분리하며, 의존 역전 원칙(DIP)은 고수준 모듈이 저수준 모듈에 의존하지 않도록 한다. 이 원칙들을 통해 더욱 견고하고 유연한 소프트웨어 시스템을 구축할 수 있다.
'Computer Science' 카테고리의 다른 글
HTTP와 HTTPS의 차이점을 알아보자 👏🏻 (0) | 2024.09.26 |
---|---|
객체지향 프로그래밍과 절차지향 프로그래밍: 무엇이 더 좋을까? (0) | 2024.07.26 |
객체지향 패러다임 이해하기: OOP의 기본 개념과 원칙 (0) | 2024.07.26 |