2 분 소요

image

SOLID란

  • SOLID란 객체지향설계를할 때 지켜야하는 5가지 개발 원칙입니다.
  1. 단일 책임 원칙(Single Responsibility Principle - SRP)
  2. 개방 폐쇄 원칙(Open Closed Principle - OCP)
  3. 리스코프치환원칙(Liskov Substitution Principle - LSP)
  4. 인터페이스 분리 원칙(Interface Segregation Principle - ISP)
  5. 의존 역전 원칙(Dependency Inversion Principle - DIP)
  • 위의 5가지 원칙을 통칭 SOLID라고 합니다.

SOLID 원칙을 지키면 좋은이유?

  • SOLID 원칙은 꼭 지켜야할 필요도, 정해져있는 기준도 없습니다. 그런데 왜 SOLID 원칙을 따라야한다고 할까요?

좋은 소프트웨어란 어떤 변화에 잘 대응할 수 있고 적용할 수 있어야합니다.

  • 따라서 좋은 소프트웨어를 만들기위해선 좋은 설계가 밑받침 되어야합니다.
  • SOLID 원칙을 잘 적용한다면 코드를 확장 및 유지보수가 쉬워질뿐더러 불필요한 복잡성을 제거하여 개발의 생산성을 향상시킬 수 있습니다.

단일 책임 원칙(SRP)

image

  • 단일 책임 원칙은 이름 그대로 클래스(객체)는 오직 하나의 책임(기능)만 가져야한다는 원칙입니다.

  • 한 클래스(객체)가 맡은 책임(기능)이 A,B,C… 여러가지가 있다고 가정한다면, 나중에 A라는 기능을 수정하거나 변경해야할 때 단순히 A만 수정해야 하는것이 아닌 A와 연관된 B와 연관된 C와 연관된… 와 같은 연쇄적인 작용을 극복하기 어렵기 때문에 필요한 원칙입니다.

  • 따라서 단일 책임 원칙의 목적은 프로그램의 유지보수성을 높이기 위한 설계 기법입니다.

  • 여기서 책임의 기준은 프로그램에따라, 개발자에따라 달라질 수 있으며 그 기준을 잘 정해야 좋은 설계를 할 수 있습니다.

개방 폐쇄 원칙(OCP)

image

  • 개방 폐쇄 원칙이란 ‘확장에 대해서는 열려(Open) 있어야 하고, 수정에 대해서는 닫혀(Closed) 있어야 함을 뜻합니다.

  • 다시말해 새로운 변경사항이 있을 때 유연하게 코드를 추가하여 그 기능을 확장할 수는 있지만 객체에 대한 직접적인 수정은 제한하도록 하는것입니다.

  • 그래서 개방 폐쇄 원칙은 ‘추상화’의 사용을 통한 관계를 구축하는것이 좋다를 의미합니다.

리스코프 치환 원칙(LSP)

image

  • 리스코프 치환 원칙은 이 원칙을 만든 사람의 이름을 따온것입니다.

  • 리스코프 치환 원칙은 ‘자식’은 언제나 ‘부모’로 대체 가능해야한다는 것인데, 상속을 할 때 지켜야하는 원칙을 말합니다.

  • 자동차라는 부모 클래스를 만들어 우회전,좌회전 메소드를 만들었다고 한다면 택시, 버스 클래스는 만들 수 있지만 기차를 만들어선 안된다는 말입니다. 기차는 좌회전 우회전을 할 수 없기 때문입니다.

  • 따라서 리스코프 치환 원칙은 부모 메서드의 오버라이딩을 잘 따져가며 의도대로 동작하도록 해야합니다.

인터페이스 분리 원칙(ISP)

image

  • 인터페이스 분리 원칙은 인터페이스를 각각 사용처에 맞게 잘 분리해야한다는 원칙입니다.

  • 인터페이스 분리 원칙은 인터페이스의 단일 책임을 강조하는것으로 클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하는것이 그 목표입니다.

  • 주의해야하는것은 한번 분리된 인터페이스는 나중에 변경사항이 생겨 또 인터페이스들을 분리하는 행위는 하지말아야 한다는 것입니다.

의존 역전 원칙(DIP)

  • 의존 역전 원칙은 인터페이스를 사용할 때 작은 단위로 나눠서 사용하라는 원칙입니다.

  • 예를 들어 아래처럼 UnotStats 인터페이스라는것이 있을 때

public interface IUnitStats
{
    public float health { get; set; }
    public int defence { get; set; }
    public void getDamaged { get; set; }
    public void goForward { get; set; }
    public float moveSpeed { get; set; }
    public int strength { get; set; }
    public int dexterity { get; set; }
    ...
}
  • 한번에 모든것을 넣지말고, 이동 인터페이스, 데미지 인터페이스, 스탯 인터페이스 등으로 나누어 이를 조합하는 식으로 코드를 발전시켜야 한다는것입니다.

image

  • 이런식으로 인터페이스를 나눠놨다면 아래와 같이 여러가지 상태의 유닛을 쉽게 구현할 수 있습니다.

image

  • 따라서 의존 역전 원칙은 코드간의 결합도를 낮추고 수정이 용이하게 해주는 역할을 합니다.

솔리드 원칙 참고 유튜브링크 솔리드 원칙 참고 블로그링크 이미지 출처

태그: ,

카테고리:

업데이트:

댓글남기기