지식&개념

객체 지향 설계 SOLID 원칙

muyeon 2023. 12. 5. 11:58

SOLID 설계 원칙은 oop 의 4가지 특징(추상화, 상속, 다형성, 캡슐화)와 더불어, 객체 지향 프로그래밍의 면접 질문 중 하나이고, 디자인 패턴들이 SOLID 설계 원칙에 입각해 만들어 진 것이기에 표준화 작업에서부터 아키텍처 설계에 이르기까지 다양하게 적용되는 이의 근간에 되는 SOLID 원칙에 대해 알아볼 필요가 있다.

 

좋은 소프트웨어는 변화에 대응을 잘 하는 것을 말한다.

갑자기 고객사에 기획에 없는 추가적인 요청을 하면 비록 욕을 할지라도 결국 구현을 해야하는데, 이러한 변화에 큰 문제없이 잘 대응하기 위해서 소프트웨어 설계 근간이 좋아야 한다.

좋은 설계란 시스템에 새로운 요구사항이나 변경사항이 있을 때, 영향을 받는 범위가 적은 구조를 말한다. 

시스템에 예상치 못한 변경사항이 발생하더라도, 유연하게 대처하고 이후에 확장성이 있는 시스템 구조를 만들 수 있다.

즉, SOLID 객체 지향 원칙을 적용하면 코드를 확장하고 유지 보수 관리하기가 더 쉬워지며, 불필요한 복잡성을 제거해 리팩토링에 소요되는 시간을 줄임으로써 프로젝트 개발의 생산성을 높일 수 있다.


설계 원칙

 

객체지향 프로그래밍을 설계할 때는 SOLID 원칙을 지켜주어야 한다.

 

S : 단일 책임 원칙(SRP, Single Responsibility Principle)

O : 개방-폐쇄 원칙(OCP, Open Closed Principle)

L : 리스코프 치환 원칙(LSP, Liskov Substitution Principle)

I : 인터페이스 분리 원칙(ISP, Interface Segregation Principle)

D : 의존성 역전 원칙(DIP, Dependency Inversion Principle)

 


단일 책임 원칙(SRP)

 

단일 책임 원칙은 모든 클래스는 각각 하나의 책임만 가져야하는 원칙이다.

여기서 책임이라는 의미는 하나의 기능 담당으로 보면 된다.

예를 들어 A라는 로직이 존재한다면 어떠한 클래스는 A 에 관한 클래스여야 하고 이를 수정한다고 했을 때도 A와 관련된 수정이어야 한다.

하나의 클래스는 하나의 기능을 담당하여 하나의 책임을 수행하는데 집중되도록 클래스를 따로 여러개 설계하라는 원칙이다.

최종적으로 단일 책임 원칙의 목적은 프로그램의 유지보수 성을 높이기 위한 설계 기법이다.


개방-폐쇄 원칙(OCP)

 

개방-폐쇄 원칙은 유지 보수 사항이 생긴다면 코드를 쉽게 확장할 수 있도록 하고 수정할 때는 닫혀 있어야 하는 원칙이다.

즉, 기존의 코드는 잘 변경하지 않으면서도 확장은 쉽게 할 수 있어야 한다.

기능 추가 요청이 오면 클래스를 확장을 통해 손쉽게 구현하면서, 확장에 따른 클래스 수정은 최소화 하도록 프로그램을 작성해야 하는 설계 기법이다.

간단하게 OCP 원칙은 추상화 사용을 통한 관계 구축 권장을 의미하는 것이다.

다형성과 확장을 가능케 하는 객체지향의 장점을 극대화하는 기본적인 설계 원칙

 


리스코프 치환 원칙(LSP)

 

리스코프 치환 원칙은 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 하는 것을 의미한다.

클래스는 상속이 되기 마련이고 부모, 자식이라는 계층 관계가 만들어진다. 이떄 부모 객체에 자식 객체를 넣어도 시스템이 문제없이 돌아가게 만드는 것을 말한다.

즉, 민승 객체가 문열 객체의 자식 계층 일 때 민승 객체를 문열 객체와 바꿔도 문제가 없어야 하는 것을 말한다.

다형성 원리를 이용하기 위한 법칙

 


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

 

인터페이스 분리 원칙은 하나의 일반적인 인터페이스보다 구체적인 여러 개의 인터페이스를 만들어야 하는 원칙을 말한다.

인터페이스를 각각 사용에 맞게 끔 잘 분리해야한다는 설계 원칙

SRP 원칙이 클래스의 단일 책임을 강조한다면 ISP는 인터페이스의 단일 책임을 강조하는 것

인터페이스를 사용하는 클라이언트를 기준으로 분리함으로써, 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공하는 것이 목표

주의할 점은 한번 인터페이스를 분리하여 구성해놓고 나중에 무언가 수정사항이 생겨서 또 인터페이스들을 분리하는 행위를 가하지 말아야 한다.(인터페이스는 한번 구성하였으면 왠만해서는 변하면 안되는 정책 개념)

 

 


의존 역전 원칙(DIP)

 

의존 역전 원칙은 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것에 변화에 영향받지 않게 하는 원칙을 말한다.

예를 들어 타이어를 갈아 끼울 수 있는 틀을 만들어 놓은 후 다양한 타이어를 교체할 수 있어야 한다.

즉, 상위 계층은 하위 계층의 변화에 대한 구현으로부터 독립해야 한다.

어떤 Class 를 참조해서 사용해야하는 상황이 생긴다면, 그 Class 를 직접 참조하는 것이 아니라 그 대상의 상위 요소(추상 클래스 or 인터페이스)로 참조 하라는 원칙

쉽게말해 구현 클래스에 의존하지 말고 인터페이스에 의존하라는 뜻

의존 역전 원칙의 지향점은 각 클래스간의 결합도(coupling)을 낮추는 것이다.

 


참고링크

https://product.kyobobook.co.kr/detail/S000001834833?utm_source=google&utm_medium=cpc&utm_campaign=googleSearch&gad_source=1

 

면접을 위한 CS 전공지식 노트 | 주홍철 - 교보문고

면접을 위한 CS 전공지식 노트 | 디자인 패턴, 네트워크, 운영체제, 데이터베이스, 자료 구조, 개발자 면접과 포트폴리오까지! CS 전공지식 습득과 면접 대비, 이 책 한 권이면 충분하다! 개발자 면

product.kyobobook.co.kr

https://inpa.tistory.com/entry/OOP-%F0%9F%92%A0-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84%EC%9D%98-5%EA%B0%80%EC%A7%80-%EC%9B%90%EC%B9%99-SOLID

 

💠 객체 지향 설계의 5가지 원칙 - S.O.L.I.D

객체 지향 설계의 5원칙 S.O.L.I.D 모든 코드에서 LSP를 지키기에는 어려움. 리스코프 치환 원칙에 따르면 자식 클래스의 인스턴스가 부모 클래스의 인스턴스를 대신하더라도 의도에 맞게 작동되어

inpa.tistory.com