본문 바로가기
# 공부

객체 지향 설계의 5원칙 [ S.O.L.I.D ]

by 쁘레레레레레 2024. 9. 18.

늘 명심하고 또 명심하지만 가끔 잊어먹고 다시 상기시키게 되는 부분이 어딘가에 있기 마련이다.

하지만 이렇게 명심을 하다보면 자연스레 내 행동에서 나타나는 법이기도 하다.

 

이직준비에 앞서 하나하나 짚고 가본다.

 

SOLID원칙.

 

객체 지향 특징 ( 상속, 다형성, 추상화, 캡슐화 ) 와 함께 나오는 원칙이다.

 

마치 범죄자를 잡고 나오는 미란다 원칙 같다고나 할까..

 

SRP, OCP, LSP, ISP, DIP 가 있다.

 

이들을 SOLID 원칙이라고 한다.

 

자세히 알아보자.

 

SRP ( Single Resposibility Principle ) - 단일 책임 원칙

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

LSP ( Listov Substitution Principle ) - 리스코프 치환 원칙

ISP ( Interface Segregation Principle ) - 인터페이스 분리 원칙

DIP ( Dependency Inversion Principle ) - 의존 역전 원칙

 

여러 회사에 근무하며 여러 프로젝트를 겪다보면 정말 다양한 상황을 마주할 수 있다.

이러한 룰들을 익혀놓으면 소프트웨어 설계시 더 좋은 설계가 시스템에 녹아들도록 할 수 있다고 믿는다.

 

SRP ( Single Resposibility Principle ) - 단일 책임 원칙

: 클래스는 단 하나의 책임만 가져야 한다.

 

책임?  간단히 말해 역할, 기능이다.

 


아주 간단하고 단순한.. 마치 휴게소에서 팔법한 강아지 로봇 인형(?)을 만든다고 가정해보자.

이 강아지는 단순히 짖기만 하면 되는 인형이지만 벽을 타고 오르며 리모콘까지 가져와주는 기능은 필요 없다.

때문에, 이 강아지는 단순히 귀여운 외형에 짖기만 하면 된다.


 

만약 움직이고 명령을 듣는 기능이 필요하다면 여기서 클래스를 추가해 만들어야한다는 소리이다.

 

Bark 클래스를 만들어놓고 이상한 기능을 넣어두지 말라는 얘기다.

 

이러한 원칙은 프로그램의 유지보수 성을 높여준다.

 

 

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

: 확장엔 열려있어야하며, 수정엔 닫혀 있어야한다.

 

조금 더 풀어보자면, 어떠한 클래스에 기능 추가가 생길 때는 열려있다.

하지만 변경 사항이 생겼을 때, 닫혀있다. 

 

간단히 말하자면, '추상화'이다.

추상 클래스와 상속을 통해 클래스 관계 구축을 말하는 것.

 

LSP ( Listov Substitution Principle ) - 리스코프 치환 원칙

: 자식 클래스는 부모 클래스를 대체할 수 있다는 말이다.

약간의 설명을 붙여주자면,

동물 - 새 - 비둘기 / 동물 - 새 - 닭

다음과 같을 때, 똑같이 날 수 있다. 라는 조건이 붙어버리면 위배되는데

 

이를 위해 인터페이스로 (날 수 있음)을 분리해준 후 (새)라는 종류에 넣어버리자.

그리고 비둘기에만 (날 수 있음) 인터페이스를 붙여주면 둘 다 LSP조건에 만족한다.

 

근데 뭔가 와닿지 않는다. 뭔가 간지러운데 어디가 간지러운지 모르겠는 그런 느낌..

 

ISP ( Interface Segregation Principle ) - 인터페이스 분리 원칙

: 사용하지 않는 인터페이스는 구현하지 않는다. 여러개의 인터페이스를 잘 분리한다.

 

용도에 맞게 분리해서 제작 후 사용하라는 말이다.

단, 한번 분리되어 사용된 인터페이스는 또 분리하는 등의 수정 행위를 가하지 말아야한다.

 

DIP ( Dependency Inversion Principle ) - 의존 역전 원칙

: 구체적인 클래스를 직접 참조하기보다 인터페이스나 추상클래스와 관계를 맺어라.

이는 클래스간 결합도를 낮추기 위함이다.

 

 

이렇게 나열해서 보면, 리팩토링을 한번 공부해서 겪어본 입장이러 그런가, 코드스멜에서 보았던 내용들이 굉장히 많다. (카레에서 신맛이 난다면 상한거다. 라는 뜻이랑 같음 ㅎㅎ;;;)