본문 바로가기

개발공부

객체 지향 설계 - SOLID(1)

  SOLID란 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 앞글자만 따서 소개한 것이다. SRP, OCP, LSP, ISP, DIP를 포함하고 있다.

1. SRP(단일 책임 원칙)

  SRP는 한 클래스가 하나의 책임만을 가져야 한다는 원칙이다. Clean Code 책을 참고했을 때 하나의 책임이란 클래스를 수정해야 할 이유가 한 가지일 때라고 한다.

 

  1) SRP 위배되는 코드

     - 클래스를 수정해야 할 경우가 2가지 이상
     - Component 관리에 대한 정보를 변경할 때 수정

     - Version 정보에 대해 변경할 때 수정

 

public class SuperDashboard{
    // Component 관리
    public Component getLastFocusedComponent()
    public void setLastFocused(Component lastFocused)
    // Version 정보 
    public int getMajorVersionNumber()
    public int getMinorVersionNumber()
    public int getBuildNumber()
}

 

 

  2) SRP를 적용한 코드

     - Component 관리와 Version 정보에 대한 클래스 분리를 통해 SRP 적용

 

public class DashbordComponent{
    public Component getLastFocusedComponent()
    public void setLastFocused(Component lastFocused)
}

public class DashbordVersion{
    public int getMajorVersionNumber()
    public int getMinorVersionNumber()
    public int getBuildNumber()
}

 

2. OCP(개방 폐쇠 원칙)

  OCP는 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다는 원칙이다. 클래스의 경우 기능 확장은 자유로우나 멤버 변수나 메서드의 수정은 최소화 할 수 있도록 작성되어져야 한다.

 

  1) OCP 위배되는 코드

     - 기능 확장과 수정을 할 때 클래스를 수정해야 하는 경우
     - 기능을 확장할 때마다 Sql 클래스는 수정
     - create, select 등 메서드에 대해 변경할 때 Sql 클래스가 수정

 

public class Sql {
    public Sql(String table, Column[] columns);
    create(string table, Colums[] columns)
    select(string table, Colums[] columns);
}

 

 

  2) OCP를 적용한 코드

     - Sql를 추상화 클래스로 만들고 crate, select 등의 기능을 하위 클래스로 분리하여 OCP 적용

     - 이후 각 기능이 변경되면 해당 기능을 가진 클래스만 수정 (변경에 닫힘)

     - 기능이 추가되면 새로운 클래스를 만들어 확장 가능 (확장에 열림)

 

abstract public class Sql {
    public Sql(String table, Column[] columns);
    abstract public String generate();
}

public class CreateSql extends Sql {
    public CreateSql(string table, Column[] columns)
    @Override public String generate()
}

public class SelectSql extends Sql{
    public SelectSql(String, table, Column[] columns)
    @Override public String generate()
}



 다음 장에서는 SOLID의 LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 관계 역전 원칙)에 대한 간단한 정의와 예제를 다룰 것이다.