[객체지향] SOLID 원칙 (2/2)

SOLID 원칙

- 객체 지향 프로그래밍에서 좋은 설계와 유지보수 가능한 소프트웨어를 만들기 위한 다섯 가지 핵심 원칙을 제공한다.

- 소프트웨어 개발 과정에서 코드의 유연성, 재사용성, 유지보수성을 높이는 데 중요한 역할을 한다.

- SOLID는 각 원칙의 첫 글자를 따서 명명된 약어이다.

ISP (Interface Segregation Principle, 인터페이스 분리 원칙)

정의

- 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 말아야한다는 원칙이다.

목표

- 클라이언트가 자신이 필요로 하는 인터페이스만을 사용하도록 하여, 불필요한 의존성을 줄인다.

예시

public interface Workable {
    void work();
}

public interface Eatable {
    void eat();
}

public class Worker implements Workable {
    @Override
    public void work() { /* working logic */ }
}

public class Manager implements Workable, Eatable {
    @Override
    public void work() { /* managing logic */ }

    @Override
    public void eat() { /* eating logic */ }
}

DIP (Dependency Inversion Principle, 의존성 역전 원칙)

정의

- 고수준 모듈은 저수준 모듈에 의존해서는 안 되고, 두 모듈 모두 추상화에 의존해야 하며, 추상화는 세부 사항에 의존하지 않아야 한다는 원칙이다.

목표

- 고수준 모듈과 저수준 모듈 간의 의존성을 줄이고, 시스템의 유연성과 모듈 간의 결합도를 낮춘다.

예시

public interface Repository {
    void save();
}

public class SqlRepository implements Repository {
    @Override
    public void save() { /* SQL save logic */ }
}

public class FileRepository implements Repository {
    @Override
    public void save() { /* File save logic */ }
}

public class DataService {
    private Repository repository;

    public DataService(Repository repository) {
        this.repository = repository;
    }

    public void process() {
        repository.save();
    }
}

⊙ 참고 문헌

    1. 양세열, 「백엔드 취업 파트타임 스쿨 5기:Part 07. 스프링 프레임워크-Chapter 02. OOP와 스프링 프레임워크-03. OOP잘하는방법SOLID-004」, 제로베이스, 2024, https://zero-base.co.kr/
    2. 양세열, 「백엔드 취업 파트타임 스쿨 5기:Part 07. 스프링 프레임워크-Chapter 02. OOP와 스프링 프레임워크-03. OOP잘하는방법SOLID-005」, 제로베이스, 2024, https://zero-base.co.kr/
    3. ChatGPT, "SOLID 원칙"에 대한 답변, 2024년 09월 17일, https://chatgpt.com/
    4. Vlad Ungureanu, Interface Segregation Principle, Aug 14, 2019, https://medium.com/@learnstuff.io/interface-segregation-principle-dd885e59aec9
    5. Vlad Ungureanu, Dependency Inversion Principle, Sep 3, 2019, https://medium.com/@learnstuff.io/dependency-inversion-principle-aafa06af26b4