SOLID 객체지향설계원칙
SOLID란
- SOLID란 객체지향설계를할 때 지켜야하는 5가지 개발 원칙입니다.
- 단일 책임 원칙(Single Responsibility Principle - SRP)
- 개방 폐쇄 원칙(Open Closed Principle - OCP)
- 리스코프치환원칙(Liskov Substitution Principle - LSP)
- 인터페이스 분리 원칙(Interface Segregation Principle - ISP)
- 의존 역전 원칙(Dependency Inversion Principle - DIP)
- 위의 5가지 원칙을 통칭 SOLID라고 합니다.
SOLID 원칙을 지키면 좋은이유?
- SOLID 원칙은 꼭 지켜야할 필요도, 정해져있는 기준도 없습니다. 그런데 왜 SOLID 원칙을 따라야한다고 할까요?
좋은 소프트웨어란 어떤 변화에 잘 대응할 수 있고 적용할 수 있어야합니다.
- 따라서 좋은 소프트웨어를 만들기위해선 좋은 설계가 밑받침 되어야합니다.
- SOLID 원칙을 잘 적용한다면 코드를 확장 및 유지보수가 쉬워질뿐더러 불필요한 복잡성을 제거하여 개발의 생산성을 향상시킬 수 있습니다.
단일 책임 원칙(SRP)
-
단일 책임 원칙은 이름 그대로 클래스(객체)는 오직 하나의 책임(기능)만 가져야한다는 원칙입니다.
-
한 클래스(객체)가 맡은 책임(기능)이 A,B,C… 여러가지가 있다고 가정한다면, 나중에 A라는 기능을 수정하거나 변경해야할 때 단순히 A만 수정해야 하는것이 아닌 A와 연관된 B와 연관된 C와 연관된… 와 같은 연쇄적인 작용을 극복하기 어렵기 때문에 필요한 원칙입니다.
-
따라서 단일 책임 원칙의 목적은 프로그램의 유지보수성을 높이기 위한 설계 기법입니다.
-
여기서 책임의 기준은 프로그램에따라, 개발자에따라 달라질 수 있으며 그 기준을 잘 정해야 좋은 설계를 할 수 있습니다.
개방 폐쇄 원칙(OCP)
-
개방 폐쇄 원칙이란 ‘확장에 대해서는 열려(Open) 있어야 하고, 수정에 대해서는 닫혀(Closed) 있어야 함을 뜻합니다.
-
다시말해 새로운 변경사항이 있을 때 유연하게 코드를 추가하여 그 기능을 확장할 수는 있지만 객체에 대한 직접적인 수정은 제한하도록 하는것입니다.
-
그래서 개방 폐쇄 원칙은 ‘추상화’의 사용을 통한 관계를 구축하는것이 좋다를 의미합니다.
리스코프 치환 원칙(LSP)
-
리스코프 치환 원칙은 이 원칙을 만든 사람의 이름을 따온것입니다.
-
리스코프 치환 원칙은 ‘자식’은 언제나 ‘부모’로 대체 가능해야한다는 것인데, 상속을 할 때 지켜야하는 원칙을 말합니다.
-
자동차라는 부모 클래스를 만들어 우회전,좌회전 메소드를 만들었다고 한다면 택시, 버스 클래스는 만들 수 있지만 기차를 만들어선 안된다는 말입니다. 기차는 좌회전 우회전을 할 수 없기 때문입니다.
-
따라서 리스코프 치환 원칙은 부모 메서드의 오버라이딩을 잘 따져가며 의도대로 동작하도록 해야합니다.
인터페이스 분리 원칙(ISP)
-
인터페이스 분리 원칙은 인터페이스를 각각 사용처에 맞게 잘 분리해야한다는 원칙입니다.
-
인터페이스 분리 원칙은 인터페이스의 단일 책임을 강조하는것으로 클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하는것이 그 목표입니다.
-
주의해야하는것은 한번 분리된 인터페이스는 나중에 변경사항이 생겨 또 인터페이스들을 분리하는 행위는 하지말아야 한다는 것입니다.
의존 역전 원칙(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; }
...
}
- 한번에 모든것을 넣지말고, 이동 인터페이스, 데미지 인터페이스, 스탯 인터페이스 등으로 나누어 이를 조합하는 식으로 코드를 발전시켜야 한다는것입니다.
- 이런식으로 인터페이스를 나눠놨다면 아래와 같이 여러가지 상태의 유닛을 쉽게 구현할 수 있습니다.
- 따라서 의존 역전 원칙은 코드간의 결합도를 낮추고 수정이 용이하게 해주는 역할을 합니다.
댓글남기기