SOLID - 객체지향 프로그래밍 5가지 설계 원칙

객체지향 프로그래밍의 5가지 설계 원칙, SOLID

SOLIDSRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 역전 원칙)의 앞 글자들을 따서 만들어졌다. SOLID 원칙을 지키면 시간이 지나도 변경이 용이하고, 유지보수와 확장이 쉬운 소프트웨어를 개발하는데 도움이 된다.

SRP, 단일책임 원칙

SRP는 Single Responsibility Principle의 약자로 모듈이 변경되는 이유는 단 한 가지여야 한다이다. 해당 모듈이 여러 대상, 액터들에 대해 책임을 가져선 안되고 오직 하나의 액터에 대해 책임을 져야 한다는 의미이다.

이 단일책임원칙을 지킨다면 변경이 필요할 때 수정할 대상이 명확해진다는 장점이 있다. 그리고 이 장점은 시스템이 커질수록 극대화된다.

OCP, 개방폐쇄원칙

OCP는 Open-Closed Principle의 약자로 확장에 대해 열려있고 수정에 대해서는 닫아야한다라는 원칙이다.

  • 확장에 대해 열려있다 요구사항이 변경될 때 새로운 동작을 추가해 기능을 확장할 수 있다.
  • 수정에 대해 닫혀있다 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다

개방 폐쇄 원칙을 지키기 위해서는 추상화에 의존해야한다. 추상화란 ‘핵심적인 부분을 남기고 불필요한 부분을 제거해 복잡한 것을 간단히한다’이며 추상화를 통해 변하지 않는 부분만 남겨 기능을 구체화하고 확장시키며, 변하는 부분을 생략해 추상화함으로 변경이 필요한 경우에 생략된 부분을 수정해 개방-폐쇄의 원칙을 지킬 수 있다.

LSP, 리스코프 치환 원칙

LSP는 Liskov Substitution Principle의 약자로 하위 타입은 상위 타입을 대체할 수 있어야 한다를 의미한다. 즉, 해당 객체를 사용하는 클라이언트는 상위 타입에서 하위 타입으로 변경되어도 차이점을 인식하지 못한 채 상위 타입의 퍼블릭 인터페이스를 통해 서브 클래스를 사용할 수 있어야 한다는 것이다.

자식 클래스가 부모 클래스를 대체하기 위해서는 부모 클래스에 대한 클라이언트의 가정을 준수해야한다. 즉, 대체 가능성을 결정하는 것은 해당 객체를 이용하는 클라이언트다.

ISP, 인터페이스 분리 원칙

ISP는 Interface segregation principle의 약자로 목적과 관심이 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리해줄 필요가 있다를 말한다. 즉, 인터페이스 분리 원칙은 클라이언트의 목적과 용도에 맞는 인터페이스를 제공하라와 같다. 인터페이스 분리 원칙을 준수한다면 모든 클라이언트가 자신의 관심에 맞는 퍼블릭 인터페이스만을 접근해 불필요한 간섭을 최소화 시킬 수 있다.

인터페이스 분리 원칙을 지킨다는 건 어떤 구현체에 부가 기능이 필요하다면 이 인터페이스를 구현하는 다른 인터페이스를 만들어서 해결한다는 것이다.

읽기/쓰기 구현 클래스가 있고 어떤 클라이언트는 읽기 작업만을 원한다면 읽기 인터페이스를 따로 만들어 제공해주는 것이다.

DIP, 의존 역전 원칙

DIP는 Dependency Inversion Principle의 약자이며 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되며, 저수준 모듈이 고수준 모듈에 의존해야 한다를 의미한다. OOP(객체 지향 프로그래밍)에서는 객체들 사이에 메세지를 주고 받기 위해 의존성이 생기는데, 올바른 의존 관계에 대한 원칙이라고 생각하면 된다.

  • 고수준 모듈 입/출력으로부터 먼 추상화된 모듈
  • 저수준 모듈 입/출력으로부터 가까운(HTTP, DB, Cache) 구현 모듈

의존 역전 원칙이란 비즈니스와 관련된 부분이 세부 사항에는 의존하지 않는 설계 원칙을 의미한다.

의존 역전 원칙에서 의존성이 역전되는 시점은 컴파일 시점이다.

SOLID가 이야기하는 핵심은 결국 추상화와 다형성으로 구체 클래스에 의존하지 않고 추상 클래스에 의존해 유연하고 확장가능한 어플리케이션을 만드는 것이 목적이라고 볼 수 있다.

댓글남기기