호비시의 끄적끄적

SOLID ? 본문

취준

SOLID ?

호비시 2022. 6. 30. 20:47

SOLID란?

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

한 문장으로 정리하자면 객체 지향 프로그래밍 설계의 5가지 기본 원칙이다.

 

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

소프트웨어의 설계 부품(클래스, 함수 등)은 단 하나의 책임만을 가져야 한다.
한 클래스가 할 수 있는 기능, 역할은 하나만 가지고 있어야 한다는 원칙이다.
기능이 많아지면, 내부의 함수끼리 강한 결합이 발생할 가능성이 높기 때문에 유지보수하기 힘들다. 프로그램 변경에 영향을 받는 부분을 적게하기 위해 필요하다. 이를 지키면 응집도는 높고 결합도는 낮은 프로그램을 만들 수 있다.

 

OCP(Open Close Principle) : 개방 폐쇄의 원칙

클래스는 확장에는 열려있고, 변경에는 닫혀 있어야 한다

  • 확장에 대해서 열려있다 : 코드 동작을 확장할 수 있다.
  • 수정에 대해서 닫혀있다 : 코드 동작을 확장하더라도 그 밖의 코드는 전혀 영향을 받지 않는다.

기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계하는 위한 원칙이다.
이를 적용하기 위해서 interface를 자주 사용한다. 역할을 정의한 상위 interface에 method의 이름만 정의를 해놓고, 이 interface를 상속받은 class에서 method의 구현을 한다. 역할을 정의한 A 클래스를 사용해서 코드를 작성하고 구현을 한 B 클래스로 정의내려 사용한다면, 구현한 B클래스는 계속 변하더라도 A클래스가 들어간 로직은 변하지 않는다. 이런 추상화를 통해 변하는 것들은 숨기고, 변하지 않는 것들에 의존하게 되면 기존 코드 및 클래스들을 수정하지 않은 채로 애플리케이션을 확장할 수 있다.

 

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

하위 타입은 언제나 상위 타입으로 교체할 수 있어야 한다
쉽게 설명하면 부모가 동작하는 기능은 자식도 동일하게 동작해야 한다는 것이다.
당연한 말이지만, 좀처럼 지켜지지 않는 원칙이다. 대부분 부모 클래스의 method를 override 하면서 문제가 발생한다. 부모클래스의 기존 메소드를 자식 클래스가 수정하면서 문제가 생긴다. LSP를 지키는 가장 간단한 방법은 상속을 하되 override를 안하는 것이다. 물론 이것만으로 문제가 해결되진 않는다. 상속할 때 override 가 필요하다면, 부모클래스의 method가 하는 역할을 충실히 수행하게 기능을 추가하면 된다.

 

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

자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다
바꿔 말하면, 하나의 큰 인터페이스보다는 여러개의 작은 인터페이스를 구현하는 것이 낫다라고도 할 수 있다.
SRP가 클래스의 단일책임을 말한다면, ISP는 인터페이스의 단일책임을 말한다. 인터페이스를 크게 구현하지 말고, 작은 인터페이스를 여러개 구현하여, 꼭 필요한 인터페이스만 상속 받아야 한다는 원칙이다.

 

DIP(Dependency Inversion Principle) : 의존 관계 역전의 원칙

의존 관계를 맺을 때, 변화하기 쉬운 것 보다 변화하기 어려운 것에 의존해야 한다
변화하기 쉬운것은 구체적인 것을 말하고, 변화하기 어려운 것은 추상적인 것을 의미한다. DIP를 만족하기 위해선, 의존관계를 맺을 때 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺어야 한다.

 

https://mangkyu.tistory.com/194

https://jaeyeong951.medium.com/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-5%EC%9B%90%EC%B9%99-solid-ac7d4d660f4d

https://dev-momo.tistory.com/entry/SOLID-%EC%9B%90%EC%B9%99

'취준' 카테고리의 다른 글

취업 후기  (1) 2022.08.03
Dead Lock ?  (0) 2022.07.06
Process 와 Thread  (0) 2022.06.27
TCP / UDP  (1) 2022.06.24
REST API란?  (0) 2022.06.19
Comments