안녕하세요
오늘은 좋은 객체지향 설계의 5원칙에 대해서 알아보겠습니다.
SOLID는 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 역전 원칙)의 앞글자를 따서 만들어졌습니다.
SOLID는 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어 기억술로 소개한 것이다. (*두문자어 기억술 낱말의 머리글자를 모아서 만들어 기억하기 쉽게 하는 것)
SOLID원칙이 필요하고 중요시되는 이유는 프로그래머가 기획자의 요구사항대로 개발을 진행하거나 또는 개발이 완료되고 프로그램을 적용하고 운영을 하고 있었을 때 기획자 또는 프로그램을 사용하는 현업이 추가적인 기능을 요구하던가 기존 기능을 다른 기능으로 바꾸어 달라고 하였을 때 더 편하고 유연하게 개발을 진행하고 프로그램이 안정적으로 돌아가게 만들기 위해 꼭 필요한 원칙이라고 생각합니다.
각각의 원칙에 대한 설명으로는
1. SRP(단일 책임 원칙) : 한 클래스는 하나의 책임만 가져야 한다.
> 하나의 클래스는 하나의 역할만 수행하여야 한다는 이야기로 간단한 예시로는 로그인을 관리하는 클래스에서 화면을 검색하는 역할까지 수행한다면 해당 원칙을 위반할 거라고 생각할 수 있습니다. 하지만 하나의 책임이라는 말은 모호
하기 때문에 변경이 있을 때 수정범위를 최소화할 수 있도록 만드는 원칙이라고 김영한(인프런 강사)님께서 말씀해 주셨습니다. 범위를 너무 작게 하면 기능이 너무 작게 쪼개지고 또 너무 크게 하면 책임이 너무 많아지게 되어 적절한 책임을 가지도록 클래스를 만드는 게 중요합니다.
클라이언트 객체는 실행만 하는 책임만 담당
2. OCP(개방-폐쇄 원칙) : 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
> 소프트 웨어 요소를 새롭게 확장해도 사용 영역의 변경은 닫혀 있어야 합니다. 다형성을 사용하고 DIP를 지키면 OCP 원칙을 지킬 가능성이 열립니다.
3. LSP(리스코프 치환 원칙) : 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
> 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 합니다. 다형성을 지원하기 위한 원칙으로 인터페이스를 구 현한 구현체를 믿고 사용하기 위해서는 이 원칙이 필요합니다. ex) 자동차 인터페이스는 액셀은 앞으로 가야 하는데 뒤로 가게 구현하면 LSP 위반, 느리더라도 앞으로 가야 합니다.
4. ISP(인터페이스 분리 원칙) : 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
> 인터페이스를 여러 개로 나눠야 인터페이스가 명확해지고, 다체 가능성이 높아집니다.
5. DIP(의존 역전 원칙) : 프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안된다." 의존성 주입을 통해 원칙을 따를 수 있음
> Impl에서 추상화 인터페이스만을 의존해야 하는데 구체화 구현 클래스를 의존하면 안 됩니다.
이를 해결하기 위해서는 의존 관계 주입을 해주는 클래스를 만들어 의존성을 주입해 준다면 Impl은 추상화 인터페이 스만을 의존할 수 있습니다.
저는 지금 it 쪽에서 일을 하고 있고 제가 개발하거나 운영을 하는 과제를 변경해 달라는 요청을 많이 받고 있는데 SOLID를 몰랐을 당시에는 주먹 구구식으로 당장의 기능을 구현하기 위해 코딩을 하여 변경요청에 유연하게 대응하지 못하고 소스를 전부 고치는 수준에 수정까지 가본 적이 있습니다. 하지만 만약 제가 처음부터 SOLID원칙에 준수하여 개발을 하였다면 변경요청에도 많은 시간을 쓰지 않고 수정이 가능했을 거라고 생각합니다. 앞으로 회사에서 일을 하거나 혼자서 공부를 할 때에도 SOLID원칙을 최대한 지키기 위해 노력하며 코딩을 해야겠다고 생각을 했습니다.
-출처 및 참고
https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)