개발노트

SOLID 객체지향 5가지 원칙 본문

Computer Science/Software Enginerring

SOLID 객체지향 5가지 원칙

개발자? 2023. 4. 24. 22:37

Robert C. Martin's Software design principles(SOLID)

Robejt C. Martin은 5가지 Software design principles을 정의하였고 앞글자를 따서 SOLID라고 부른다.

 

  • SRP Single Responsibility Principle : 하나의 클래스는 하나의 책임만 한다
  • OCP Open-Closed Principle : 클래스는 확장엔 열려있고 변경에는 닫혀있다
  • LSP Liskov Substitution Principle : 부모가 하는 동작은 자식도 다 할 수 있어야 함. 부모의 역할을 자식이 대체 가능 (기반 클래스의 메소드는 파생 클래스 객체의 상세를 알지 않고서도 사용될 수 있어야 한다.)
  • ISP Interface Segregation Principle : 인터페이스 쪼개기, 클라이언트가 사용하지 않는 메소드에 의존하지 않아야 한다. 
  • DIP Dependency Inversion Principle : 좀 더 추상적, 일반적인 클래스에 의존하자

1. SRP Single Responsibility Principle

A class should have one, and only one, reason to change
클래스는 오직 하나의 이유로 수정이 되어야 한다는 것을 의미한다.

 

리팩토링 적용 기법

  • Extract Class
  • Extract Superclass

2. OCP Open-Closed Principle

Software entities (classes, modules, functions, etc) should be open for extension but closed for modification
자신의 확장에는 열려있고 주변의 변화에는 닫혀 있어야 하는 것을 의미한다.

기존 코드를 변경하지 않으면서 = close

기능을 추가할 수 있도록 = open

설계되어야 한다

 

리팩토링 적용 기법

  • 상속(is-a)
  • 컴포지션(has-a)
  • 전략패턴

Example | OCP 적용 전

 

더보기

Code

public class File_Main {
    public static void main(String[] args) {
        File file = new File();
        FileStorage fileStorage = new FileStorage();
        fileStorage.saveToOracle(file);
    }
}

class File{
    public String name;
}

class FileStorage{
    public void saveToOracle(File file){
        System.out.println("Oracle 에 파일 저장");
    }
    public void saveToMySQL(File file){
        System.out.println("MySQL 에 파일 저장");
    }
}

Example | OCP 적용 후

더보기

Code

public class File_Main {
    public static void main(String[] args) {
        File file = new File();
        FileStorage fileStorage = new Oracle();
        fileStorage.save(file);
    }
}
class File{
    public String name;
}

abstract class FileStorage{
    abstract void save(File file);
}
class Oracle extends FileStorage{

    @Override
    void save(File file) {
        System.out.println("Oracle 에 저장");
    }
}

class MySQL extends FileStorage{

    @Override
    void save(File file) {
        System.out.println("MySQL 에 저장");
    }
}

 

 

3. LSP Liskov Substitution Principle

subtypes must be substitutable for their base types
base 클래스에서 파생된 클래스는 base 클래스를 대체해서 사용할 수 있어야한다

 

4. ISP Interface Segregation Principle

Clients should not be forced to depend on methods they do not use
사용하지 않는 메소드에 의존하면 안된다

 

리팩토링 적용 기법

인터페이스를 쪼개서 내가 사용하지 않는 것을 구현하는 비효율성 줄인다

Java 에서 다중 상속은 안되지만, 다중 인터페이스 상속은 가능하다.

 

5. DIP Dependency Inversion Principle

high-level modules should not depend on low-level modules. Both should depend on abstractions
자신(high level module)보다 변하기 쉬운 모듈(low level modeul)에 의존해서는 안된다

 

리팩토링 적용 기법

의존성을 인터페이스에 두는 것

 

 

✅ DIP vs. OCP 차이점

DIP 가 OCP 를 포함하는 개념이라 볼 수 있다.

DIP : 인터페이스를 둬서 강한 의존성을 낮추는 것에 포커스

OCP : 확장성을 고려하여 기능 추가에 모듈 변경을 최소화

 

반응형
Comments