Sam Story

객체지향 프로그래밍 SOLID 원칙 본문

개발지식

객체지향 프로그래밍 SOLID 원칙

Sam H 2024. 9. 24. 17:24

지난번 포스팅 했던 객체지향 프로그래밍에 이어서

객체지향 프로그래밍의 5가지 원칙 SOLID 원칙에 대해 포스팅 하려한다.

 

 

SOLID 원칙 이란?

 

SOLID란 객체 지향 프로그래밍을 하면서 지켜야하는 5대 원칙으로 

각각 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), 

DIP(의존 역전 원칙), ISP(인터페이스 분리 원칙)의 앞글자를 따서 만들어졌다.

 SOLID 원칙을 철저히 지키면 시간이 지나도 변경이 용이하고, 

유지보수와 확장이 쉬운 소프트웨어를 개발하는데 도움이 되는 것으로 알려져있다.

 

1. 단일 책임의 원칙 (SRP)

단일 책임 원칙은 클래스(객체)는 단 하나의 책임만 가져야 한다는 원칙이다.

여기서 책임은 하나의 기능을 담당한다로 보면 된다.

 

즉 하나의 클래스는 하나의 기능을 담당하여 하나의 책임을 수행하는데

집중되도록 클래스를 따로따로 여러개 설계하라는 원칙이다.

 

만일 하나의 클래스에 기능이 여러개 있다면 수정할 내용이 생겼을 때

수정해야할 코드가 많아지고 복잡해지는 경우가 생긴다.

 

따라서 단일 책임의 원칙을 따르면,

어떠한 클래스에 기능을 수정 하더라도

다른 클래스나 기능에 영향을 주지 않게 된다.

 

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

 

2. 개방-폐쇄 원칙 (OCP)

개방-폐쇄 원칙은 클래스는 확장에 열려있어야 하며, 수정에는 닫혀있어야 한다를 뜻한다.

 

기능 추가 요청이 오면 클래스를 확장을 통해 쉽게 구현하면서,

확장에 따른 클래스 수정은 최소화 하도록 프로그램을 작성해야 하는 설계 기법이다.

 

즉 새로운 변경 사항이 생기면 유연하게 추가가 가능하면서

새로운 변경 사항이 발생했을 때 객체를 직접적으로 수정하는것을 제한한다는 원칙이다.

 

개방-폐쇄 원칙은 추상화 사용을 통한 관계 구축을 권장하는 원칙이다.

 

3. 리스코프 치환 원칙(LSP)

리스코프 치환 원칙은 서브타입은 언제나 기반(부모) 타입으로 교체할 수 있어야 한다는 원칙이다.

간단히 말하면 다형성 원리를 이용하기 위한 원칙이라고 보면된다.

 

리스코프 치환원칙은 다형성의 특징을 이용하기 위해 상위 클래스 타입으로 객체를 선언,

하위 클래스의 인스턴스를 받으면

부모의 메서드를 사용해도 동작이 의도대로 흘러가야 하는것을 의미한다.

 

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

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

단일 책임의 원칙이 클래스 단일 책임을 강조한다면,

인터페이스 분리원칙은 인터페이스의 단일 책임을 강조하는 것으로 보면 된다.

 

인터페이스 분리 원칙은 인터페이스를 사용하는 클라이언트를 기준으로 분리함으로써,

클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공하는 것이 목표이다.

 

다만 인터페이스 분리 원칙에서 주의해야 할점은 한번 인터페이스를 분리하여

구성해놓고 나중에 무언가 수정사항이 생겨서

추가로 인터페이스들을 분리하는 행위를 가하지 말아야 한다.

 

5. 의존 역전 원칙(DIP)

의존 역전 원칙은 어떤 Class를 참조해서 사용해야하는 상황이 생긴다면,

그 Class를 직접 참조하는 것이 아니라

그 대상의 상위요소 (추상 클래스 or 인터페이스)로 참조 하라는 원칙이다.

 

쉽게 이야기하면 구현 클래스에 의존하는것이 아닌 인터페이스에 의존하라는 뜻

 

의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는

변화하기 어려운것 혹은 거의 변화가 없는 것에 의존하라는 것이다.

 

오늘 포스팅은 5가지 원칙에 대해서 알아보았다.

다음 포스팅은 위 원칙들을 지키는 예제들을 만들어

좀 더 이해하기 쉽게 해보도록 하자

'개발지식' 카테고리의 다른 글

객체지향 프로그래밍  (5) 2024.09.23
REST,REST API  (0) 2024.08.21
엔진엑스 (NGINX)  (0) 2024.05.08
아파치 (Apache)  (1) 2024.05.01
동기 , 비동기 (Synchronous , Asynchronous)  (0) 2024.04.24