본문 바로가기
코딩 교육 기관/코드스쿼드 백엔드 레벨2

2018.11.01 (목)

by 성건희 2018. 11. 11.
반응형

코드스쿼드 16일차


SOLID

  • 객체 지향의 5 원칙

  • 객체지향의 5원칙(SOLID)을 제대로 알면

    스프링 에서 Dependency Injection (DI) 가 왜 필요한지 동기 부여가 확실히 됨

 

SRP (단일 책임 원칙)

"어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다." - 로버트 C. 마틴

  • 클래스를 역할과 책임에 따라 분리해서 각각 하나의 역할과 책임만 갖게 해라.

 

OCP (개방 폐쇄 원칙)

"소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다." - 로버트 C. 마틴

  • 즉 , 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다. 는 의미

 

LSP (리스코프 치환 원칙)

"서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다." - 로버트 C. 마틴

객체 지향의 상속은 다음의 조건을 만족해야 한다.

  • 하위 클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류다.
  • 구현 클래스 is able to 인터페이스 - 구현 분류는 인터페이스 할 수 있어야 한다.

위 두 개의 문장대로 구현된 프로그램이면 이미 리스코프 치환 원칙을 잘 지키고 있다고 할 수 있다.

 

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

"클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다." - 로버트 C.마틴

  • SRP 와 ISP 는 같은 문제에 대한 두 가지 다른 해결책으로 볼 수 있다.

    따라서, 취향에 따라 선택할 수 있지만 특별한 경우가 아니라면 단일 책임 원칙(SRP)을 적용하는 것이 더 좋은 해결책이다.

 

DIP (의존 역전 원칙)

"고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."

"추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다."

"자주 변경되는 구체 클래스에 의존하지 마라" - 로버트 C. 마틴

 

위를 의역하면 다음과 같다.

"자신보다 변하기 쉬운 것에 의존하지 마라."

 

자동차와 스노우타이어의 예시를 들어보자.

 

자동차 -> 스노우타이어

계절과 날씨에 따라서 타이어는 자주 바꾸어 주어야 하는데, 위와 같이 의존 관계를 맺으면, 자동차 자신보다 더 자주 변하는 스노우타이어에 의존하게 되면서 부서지기 쉬운 나쁜 관계가 된다.

 

자동차 -> 타이어(interface)

위와 같이 자동차는 추상화된 타이어 인터페이스에만 의존하면서 스노우타이어에서 일반타이어, 광폭타이어.. 등으로 교체해도 자동차는 그 영향을 받지 않는 형태로 구성된다.

이처럼 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어서

변하기 쉬운 것의 변화에 영향받지 않게 하는 것이 의존 역전 원칙이다.

 

정리

• SRP(단일 책임 원칙): 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다. 

• OCP(개방 페쇄 원칙): 자신의 확장에는 열려 있고. 주변의 변화에 대해서는 닫혀 있어야 한다. 

• LSP(리스코프 치환 원칙): 서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다. 

• ISP(인터페이스 분리 원칙): 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다. 

• DIP(의존 역전 원칙): 자신보다 변하기 쉬운 것에 의존하지 마라.

 

로또 게임의 문제점

  • 테스트 하기가 어려움

 

  • 해결

    DIP 원칙을 적용

    로또를 생성하는 부분을 인터페이스로 만든다.


반응형

'코딩 교육 기관 > 코드스쿼드 백엔드 레벨2' 카테고리의 다른 글

2018.10.29 (월)  (2) 2018.11.11
2018.10.25 (목)  (0) 2018.11.11
2018.10.22 (월)  (0) 2018.11.11
2018.10.17 (수)  (0) 2018.11.11
2018.10.15 (월)  (0) 2018.11.11

댓글