[CS] SOLID 원칙 - 1. 정의
최근 업데이트 날짜:
객체 지향 프로그래밍에서 기본이 되는 5가지 원칙이 있다. 각 원칙의 앞자를 따와서 SOLID 원칙이라고 부르는 이 원칙은 프로그램의 유지보수성, 확장성, 재사용성을 향상시키기 위해 만들어졌다.
오늘은 이 SOLID 원칙에 대해서 간단하게 정리해보려고 한다.
SOLID 원칙
SOLID는 아래와 같이 다섯 가지 원칙으로 이루어져 있다.
SRP (Single Responsibility Principle, 단일 책임 원칙)
SRP(Single Responsibility Principle, 단일 책임 원칙): 하나의 클래스는 하나의 책임만 가져야 한다.
여기서 책임은 기능이라고 생각하면 된다. 고로 한 클래스는 하나의 기능만 가져야 한다는 말이다. SRP 원칙을 적용하면 응집도는 높이고 결합도는 낮출 수 있다.
SRP 원칙을 어기고 여러가지 기능을 하는 클래스가 있다고 생각해보자. 이 경우에 클래스의 기능들 간의 결합도가 높아지게 되고, 한 기능의 수정이 다른 기능에도 영향을 끼쳐 문제가 발생할 수 있다.
OCP (Open/Closed Principle, 개방-폐쇄 원칙)
OCP (Open/Closed Principle, 개방-폐쇄 원칙): 소프트웨어 요소(클래스, 함수 등)는 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.
여기서 확장은 기능의 확장을 의미하고 변경은 기존 코드의 변경을 의미한다. 결국 이를 다시 말하면 기능은 확장되어야 하지만 이때 기존 코드의 변경이 있으면 안 된다는 말이다.
OCP 원칙을 적용하기 위해서는 인터페이스를 활용하면 된다. 인터페이스를 통해 추상화 해두고 변경이 필요한 부분은 상속을 통해 구현하면, 기존 코드를 수정하지 않고도 새로운 기능을 추가할 수 있게 된다.
LSP (Liskov Substitution Principle, 리스코프 치환 원칙)
LSP (Liskov Substitution Principle, 리스코프 치환 원칙): 상위 타입의 객체는 하위 타입의 객체로 치환 가능해야 한다.
이 말은 곧 상위 타입에서 제공하는 기능( 메소드, 속성)들을 하위 타입에서도 전부 제공해야한다는 말이다.
LSP 원칙을 지키기 위해서는 설계를 할 때 하위 타입이 될 타입들의 공통된 요소들만 상위 타입에 정의해야한다. 그리고 나머지 공통되지 않는 요소들은 각 하위 타입에 구현한다. 이렇게 하면 상위 타입의 객체를 하위 타입의 객체로 변경해도 정상적으로 작동하게 된다.
ISP (Interface Segregation Principle, 인터페이스 분리 원칙)
ISP (Interface Segregation Principle, 인터페이스 분리 원칙): 이용하지 않는 메소드에 의존하지 않도록 인터페이스를 분리해야 한다.
만약 클라이언트가 필요하지 않는 메소드를 인터페이스가 가지고 있다면 이는 불필요한 의존성이 생긴 것이다. 이런 경우에는 클라이언트가 사용하지 않는 메소드의 변경에도 해당 클라이언트가 영향을 받게 된다.
따라서 ISP 원칙을 적용하여 인터페이스를 잘 분리해야한다.
DIP (Dependency Inversion Principle, 의존성 역전 원칙)
DIP (Dependency Inversion Principle, 의존성 역전 원칙): 프로그래머는 추상화에 의존해야하며, 구체화에 의존해서는 안 된다.
이는 추상화된 것은 구체적인 것에 의존하면 안 되며, 구체적인 것이 추상화된 것에 의존해야 한다라고 표현할 수도 있다.
DIP 원칙을 적용하면 모든 모듈은 상위 모듈에 의존하고 하위 모듈에는 의존하지 않는다. 이렇게 되면 하위 모듈이 변경되더라도 해당 모듈의 상위 모듈은 영향을 받지 않아서 유지보수성과 확정성이 향상된다.
내 생각
현업에서 개발을 하면서 자연스럽게 유지보수가 원활한 아키텍처에 대한 니즈가 생겼다. 만들면 끝이었던 학부생 시절과 다르게 현업에서는 출시 후에도 지속적으로 새로운 기능이 추가되며 서비스가 확장되기 때문이다.
처음에는 주니어 혼자 무작정 아키텍처를 깔끔하게 설계하려고 하니 당연히 뭘 어떻게 해야할지 몰랐다. 그래서 팀원들과 클린 아키텍처 스터디도 진행하고 이를 계기로 클린 아키텍처를 위한 여러 시도를 하고 있다. 그 중에서도 SOLID 원칙은 OOP에서 가장 기본이 되는 원칙인만큼 많은 도움이 되었다고 생각한다.
그리고 앞으로는 CS에 대한 내용도 정리를 해보려고 한다. SOLID 원칙 같은 경우에도 공부한 건 작년인데 까먹어서 이 참에 정리했다ㅎ...
댓글남기기