SOLID : 객체 지향 프로그래밍 5대 원칙
SOLID 원칙이란?
객체 지향 프로그래밍(OOP)에서는 코드의 유지 보수성, 재사용성, 그리고 확장성을 향상시키기 위한 핵심 원칙들이 있습니다. SOLID는 이 원칙들을 나타내는 약어로써, 아래와 같이 5가지 원칙을 포함하고 있습니다.
1. S - Single Responsibility Principle (SRP)
클래스는 단 하나의 책임만을 가져야 합니다.
예제:
1
2
3
4
5
public class Report {
public void generateReport() {
// Generate report logic
}
}
이 예제에서 Report
클래스는 보고서를 생성하는 단 하나의 책임만을 가집니다. 이 클래스에 다른 기능이 추가되면 SRP에 위배됩니다.
2. O - Open/Closed Principle (OCP)
소프트웨어 구성 요소는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 합니다.
예제:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface Shape {
double area();
}
public class Circle implements Shape {
public double radius;
public double area() {
return Math.PI * radius * radius;
}
}
public class Rectangle implements Shape {
public double width;
public double height;
public double area() {
return width * height;
}
}
새로운 도형을 추가하더라도 기존의 Shape
인터페이스와 해당 인터페이스를 구현하는 클래스들은 변경할 필요가 없습니다.
3. L - Liskov Substitution Principle (LSP)
자식 클래스는 부모 클래스의 자리를 바꿔 사용될 수 있어야 합니다.
자식 클래스가 부모 클래스의 기능을 오버라이드하거나 수정하지 않고, 부모 클래스가 예상하는 대로 동작해야 합니다.
4. I - Interface Segregation Principle (ISP)
클라이언트는 자신이 사용하지 않는 인터페이스의 영향을 받지 말아야 합니다.
예제:
1
2
3
4
5
6
7
public interface Worker {
void work();
}
public interface Eater {
void eat();
}
만약 어떤 동물이 일을 하지 않는다면, Eater
인터페이스만을 구현하면 되며 Worker
인터페이스의 영향을 받지 않아야 합니다.
5. D - Dependency Inversion Principle (DIP)
고수준의 모듈(비즈니스 로직을 담당하는 모듈)은 저수준의 모듈(구체적인 구현을 담당하는 모듈)에 직접 의존하면 안 됩니다. 대신, 둘 모두 추상화된 인터페이스나 추상 클래스에 의존해야 합니다. 이 원칙의 핵심은 “의존 관계를 맺을 때, 변화하기 쉬운 것이나 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존해야 한다”는 것입니다. 이를 통해, 시스템의 유연성과 확장성을 향상시킬 수 있습니다.
예제:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public interface Database {
void connect();
}
public class MySQLDatabase implements Database {
public void connect() {
// MySQL connection logic
}
}
public class Application {
private Database database;
public Application(Database database) {
this.database = database;
}
public void start() {
database.connect();
}
}
위의 예제에서 Application
클래스는 구체적인 MySQLDatabase
클래스 대신에 Database
라는 추상화된 인터페이스에 의존합니다. 이로 인해, 다른 종류의 데이터베이스로 변경하거나 수정해야 할 경우, Application
의 코드 변경 없이 쉽게 대체가 가능해집니다.
결론
이러한 원칙들은 코드의 품질과 유지 보수성을 높이기 위한 지침으로 활용될 수 있습니다. 객체 지향 설계의 핵심 개념을 이해하고 활용함으로써 더 나은 소프트웨어를 만들 수 있습니다.