개발/개발 공통

[객체 지향] SOLID 원칙에 대해서 알아보자

growing-dev 2023. 1. 14. 22:42

객체 지향을 공부하면서 SOLID 원칙을 빼놓을 수 없다. SOLID 원칙에 대해서 공부해 본다.

SOLID 로버트 마틴이 2000년대 초반에 명명한 객체지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 소개한 것이다. 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다. SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩터링 하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다. 

 

1. 단일 책임 원칙(SRP)

모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. 클래스가 제공하는 모든 기능은 이 책임과 주의 깊게 부합해야 한다.

 

변경되는 이유는 오직 하나여야 한다. 변경되는 이유가 두 개 이상이라면 클래스를 쪼개야 한다.

2. 개방-폐쇄 원칙(OCP)

소프트웨어 개발 작업에 이용된 많은 모듈 중에 하나에 수정을 가할 때 그 모듈을 이용하는 다른 모듈을 줄줄이 고쳐야 한다면, 이와 같은 프로그램은 수정하기가 어렵다. 개방-폐쇄 원칙은 시스템의 구조를 올바르게 재조직(리팩토링)하여 나중에 이와 같은 유형의 변경이 더 이상의 수정을 유발하지 않도록 하는 것이다. 개방-폐쇄 원칙이 잘 적용되면, 기능을 추가하거나 변경해야 할 때 이미 제대로 동작하고 있던 원래 코드를 변경하지 않아도, 기존의 코드에 새로운 코드를 추가함으로써 기능의 추가나 변경이 가능하다.

 

기존 코드의 수정 없이 혹은 가능한 최소한의 수정으로 기능을 추가할 수 있어야 한다.

3. 리스코프 치환 원칙(LSP)

 자료형 B가 자료형 A의 서브타입라면 필요한 프로그램의 속성(정확성, 수행하는 업무 등)의 변경 없이 자료형 B의 객체를 자료형 A의 객체로 교체(치환)할 수 있어야 한다는 원칙이다. 

 

상속을 활용할 때 신중해야 한다.

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

인터페이스 분리 원칙은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다. 인터페이스 분리 원칙은 큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리시킴으로써 클라이언트들이 꼭 필요한 메서드들만 이용할 수 있게 한다.

 

사용할 인터페이스만 오픈하고 나머지는 오픈하지 않는다.

5. 의존성 역전 원칙(DIP)

객체 지향 프로그래밍에서 의존관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 이 원칙은 다음과 같은 내용을 담고 있다.

첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.

둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.

이 원칙은 '상위와 하위 객체 모두가 동일한 추상화에 의존해야 한다'는 객체 지향적 설계의 대원칙을 제공한다.

서로 추상화(인터페이스)에 의존하고 중요하지 않은 것이나 자주 변경되는 것에 의존해서는 안된다.

 

 

결론

SOLID 원칙은 개발하면서 항상 마음에 품고 있어야 하는 설계 원칙이다. 5가지 원칙을 제대로 이해하고 자체적으로 해석한 다음 습관적으로 의식하면서 코드를 작성하고 수정해 나가야 할 것이다.

개인적으로는 의존성 역전 원칙이 이해하기 어려웠고 가장 지키기 어려웠던 것 같다. 아키텍처 업무를 하면서 가장 신경 썼던 원칙이기도 하다.

 

반응형