Solid 객체지향설계원칙

무삭이의 개발일지·2023년 3월 30일
0

먼저 객체가 뭘까?

객체는 보고 만질 수 있는 모든 것. 즉, 사물과 같은 것들을 객체라고 부를 수 있다.
우리가 흔히 사용하는 말은 아니라서, 어렵게만 느껴지는 말인 거 같다.
그렇다면 객체지향이란 게 뭘까? 객체지향프로그래밍이라는 말을 자주 사용하는 것 같다.
🎯객체 지향 프로그래밍은 데이터(변수)와 절차(메서드)를 하나의 단위로 묶어 '객체'로 만들고,
그 객체를 하나 하나 조립해 나가는 설계 방식을 말한다. 보통 나는 '레고'라고 생각 하는 편이다.
레고를 조립하는 것이 마치 객체 지향 느낌이 나기 때문!! 물론 이 비유가 완전히 맞지는 않다.
왜냐면 비유를 들려면 레고 블록이 클래스가 되고, 인스턴스는 이 블록들이 조립해 만들어진 결과물을 말하기 때문이다.
클래스는 객체를 만들기 위한 일종의 설계도이고, 객체는 클래스를 기반으로 실제 생성되는 인스턴스기 때문에 이렇게 되어야한다. 이 비유는 단순히 개념을 이해하기 쉽게 설명한 것뿐 완전히 맞진 않다...

Solid란 무엇인가?

Solid란 로버트 마틴이 제시한 5가지 객체지향 설계원칙으로써 SRP, OCP, LSP, ISP, DIP 을 말한다.

하나 하나 알아보자!!
먼저 SRP란 단일 책임 원칙을 말한다. 단일 책임 원칙은 하나의 클래스는 하나의 책임만 가져야 한다는 것을 말한다. 주행, 정비, 감속 기능이 있는 자동차 클래스가 있다고 생각해보자.
이 자동차 클래스에서 이 기능들을 모두 가지고 있다면 그 상태는 SRP 원칙을 위반 하는 것이다. SRP를 지키기 위해선 자동차 클래스를 각각의 책임별로 분리 하는 것이 바람직하다. 주행, 정비, 감속 기능들을 각 각의 클래스를 만들어 오직 하나의 책임만을 가지도록 분리해야 한다.

OCP개방 폐쇄 원칙이다. 확장에는 열려 있어야 하고 수정에는 닫혀 있어야 한다. 개방 폐쇄 원칙은 기존의 코드를 변경하지 않고 새로운 기능을 추가할 수 있도록 설계 해야 한다는 것을 의미한다. 자동차 클래스를 수정하지 않고도 기능을 추가할 수 있는 방법을 생각해야 한다.
새로운 기능을 추가하기 위해 자동차 클래스를 상속하는 새로운 클래스를 만들어서 필요한 기능을 추가 하는 것이다.
이렇게 하면 기존의 자동차 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있다.

LSP리스코프 치환 원칙. 상위 클래스를 하위 클래스로 대체해도 기능에 문제 없어야 한다는 것을 의미한다. 자동차 클래스가 있다면, 현대 자동차중 소나타라는 차가 있어서 소나타 클래스가 있다고 치자. 소나타 클래스는 어차피 자동차이기 때문에 자동차 클래스와 동일한 메서드를 가지고 있어서 자동차 클래스의 자리를 대체할 수 있다는 것을 말한다. 이렇게 해야 유연하고 확장성 높은 설계가 가능해진다.

ISP인터페이스 분리 원칙. 인터페이스를 클라이언트에 특화된 작은 단위로 분리 해야 한다. 여기서 클라이언트에 특화된 작은 단위로 분리 해야 한다는 말은 클라이언트가 사용할 기능들을 인터페이스로 추상화해서 제공하고, 클라이언트가 필요로 하는 기능들만 사용할 수 있도록 인터페이스를 분리 하는 것.
만약 자동차 인터페이스가 있다면, 자동차 인터페이스를 구현하는 소나타 클래스에서는 자신이 필요한 메서드(기능)들을만을 사용하는 것이 좋다. 왜냐면 불필요한 메서드들에 의존할 필요가 없기 때문이다.

DIP의존 관계 역전 원칙. 추상화에 의존해야 하고, 구체화에는 의존하지 않아야 한다는 것을 의미한다. 이 말은 즉, 소나타 클래스가 자동차 인터페이스를 구현 하고 있는 그렌져 클래스의 객체를 직접 주입 받는 것이 아니라, 그렌져 클래스에서 구현한 인터페이스를 소나타 클래스에서 직접 주입 받아 사용 하는 것이 DIP 원칙을 지키는 방법이다. 그리고 이렇게 주입 하는 것을 "의존 관계 주입(DI)"라고 한다.

profile
No. Try not. Do or Do not. There is no try.

0개의 댓글