반응형

 

SOLID전에 한번 체크하고 넘어가는 의존 개념 

간단히 말해서 의존한다는 것은 그냥 알기만 하면 다 의존한다고 생각하면 편하다.

 

Public class MemberService{

       private MemberRepository memberRepository = new MemoryMemberRepository();

}

라는 코드가 있을때 MemberService 클래스는 MemberRepository,MemoryMemberRepository에 의존하게 된다

 

 

SOLID 의   정의

클린코드로 유명한 로버트 마틴님이 좋은 객체 지향 설계의 5가지 원칙을 정리

-> 소프트웨어 설계의 특정 측면에 초점을 맞추고 확장 가능한 코드를 촉진하는 것을 목표로 한다 -> 결국 효율적이다.

 

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

 

클래스에는 단일 책임 또는 목적이 있어야한다.

서로 다른 책임을 별개의 클래스로 분리하면 더 나은 코드 구성 , 모듈성 및 재사용성을 얻을 수 있다.

 -> 변경을 했을때 하나의 클래스만 고쳐도 된다면 SRP원칙을 잘 따른것. 

 


2.OCP 개방 - 폐쇠 원칙

확장에는 개방되어야 하지만 수정에는 폐쇠되어야 한다고 명시한다.

기존 코드는 수정하지 않고도 시스템의 동작을 확장할 수 있어야한다.

->추상화, 인터페이스 및 다형성을 사용하여 상속 또는 구성을 통해 새로운 기능을 추가한다.

 


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

 

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

파생 클래스는 예기치 않은 동작을 일으키지 않고 기본 클래스를 대체할 수 있어야한다.

컴파일의 성공유무를 넘어서는 이야기

-> 엑셀을 밟았을때 앞으로 가라는 기능, 만약 뒤로 가게 구현한다면 LSP 위반이 된다.

 


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

 

특정 클라이언트를 위한 인터페이스 여러개가 하나로 묶여있는 범용 인터페이스 하나 보다 낫다.

클라이언트의 요구에 맞게 더 작고 더 집중된 인터페이스를 만들어 

변경의 영향을 최소화하고 더 나은 모듈성과 구성 요소 간 분리를 달성할 수 있다.

--> 자동차 인터페이스  -> 운전인터페이스 , 정비 인터페이스로 분리한다.

 

이때 정비에 문제가 생기면 정비 인터페이스만 수정하면 되기에 인터페이스가 명확해지고 대체 가능성이 높아지게 된다. 

 


5.DIP 의존관계 역전 원칙 Dependency inversion principle

 

역활에 의존하게 해야한다.

클라이언트가 인터페이스가에 의존해야 유연하게 구현체를 변경할 수 있다.

만약 구현체에 의존하게 된다면 변경이 아주 어려워진다.

--> 구체적인 구현 대신 추상화(인터페이스 또는 추상 클래스)에 의존함으로써 기존의 종속성 흐름을 발전시키고

보다 유연한 테스트 가능한 코드를 얻을수 있다.

 


 

SOLID의 정리



객체 지향의 핵심은 다형성이다.

하지만 다형성 만으로는 쉽게 부품을 갈아 끼우듯이 개발할 수 없다.

다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 함께 변경된다.

다형성만으로는 OCP,DIP를 지킬 수 없다.

결국 SOLID의 장점

 

시간이 지남에 따라 유지관리, 리팩터링 및 확장이 더 쉬운 소프트웨어를 만들 수 있다.

--> 결합을 줄이고 응집력을 높이며 우수한 소프트웨어 설계 관행을 촉진하는데 도움을 받는다.

 

반응형

+ Recent posts