SOLID : 객체 지향 프로그래밍 5대 원칙
포스트
취소

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의 코드 변경 없이 쉽게 대체가 가능해집니다.

결론

이러한 원칙들은 코드의 품질과 유지 보수성을 높이기 위한 지침으로 활용될 수 있습니다. 객체 지향 설계의 핵심 개념을 이해하고 활용함으로써 더 나은 소프트웨어를 만들 수 있습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.