반응형
좋은 객체 지향 설계의 5가지 원칙(SOLID)
- SRP : 단일 책임 원칙(Single Responsibility Principle)
- OCP : 개방-폐쇄 원칙(Open-Closed Principle)
- LSP : 리스코프 치환 원칙(Liskov Substitution Principle)
- ISP : 인터페이스 분리 법칙(Interface Segregation Principle)
- DIP : 의존관계 역전 원칙(Dependency Inversion Principle)
단일 책임 원칙(SRP)
- 한 클래스는 하나의 책임만 가져야 한다.
- 하나의 책임이란?
- 책임이 클 수 있고 작을 수도 있다.
- 문맥과 상황에 따라 책임이 다름
- 중요한 기준은 '변경'
- 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것
개방 폐쇄 원칙(OCP)
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- 즉, 기능을 확장해야 할 때 기존 코드를 수정하는 것이 아닌 새로운 구현 클래스를 만들어 실행
- 인터페이스를 구현한 새로운 구현 클래스로 새로운 기능을 구현
OCP의 문제점
- 구현 객체를 변경하려면 클라이언트의 코드를 변경해야 한다.
ex) 자동차 - 운전자
Car라는 interface의 구현 객체가 K3 였다가 K5로 변경하는 경우
기존 코드
Car car = new K3();
수정 코드
Car car = new K5(); - 다형성을 사용했지만 OCP 원칙이 깨짐(코드의 변경)
리스코프 치환 원칙(LSP)
- 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서
하위 타입의 인스턴스로 변경할 수 있어야 한다. - ex)
자동차 인터페이스에 있는 엑셀이라는 기능은 앞으로 속도를 늘리며
자동차를 움직일 수 있게 해주는 기능이다.
이 기능을 바꿔서 엑셀을 밟으면 뒤로 가게 만드는 경우
컴파일 단계에서는 오류가 발생하지 않는다.
(엑셀의 기능을 위와 같이 바꿔도 운전자는 엑셀을 밟을 수는 있다.)
하지만 이 경우 구현하고자 했던 본래의 기능과는 멀어지게 되고,
이러한 상황을 '프로그램의 정확성이 깨졌다.'고 표현한다. - 즉 하위 클래스는 인터페이스 규약을 전부 지켜야 한다는 것을 의미
인터페이스 분리 원칙(ISP)
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다는 것을 의미
- ex)
자동차 인터페이스 : 운전 인터페이스 / 정비 인터페이스로 분리
사용자 클라이언트 : 운전 클라이언트 / 정비 클라이언트로 분리 - 이렇게 인터페이스를 분리하면 정비 인터페이스가 변해도
운전자 클라이언트에 영향을 주지 않는다. - 즉 인터페이스가 명확해지고 대체 가능성이 높아짐
의존관계 역전 원칙(DIP)
- 프로그래머는 '추상화'에 의존해야지, '구체화'에 의존하면 안된다는 뜻
- 즉 구현 클래스가 아닌 인터페이스에 의존해야 한다는 것을 의미한다.
- 클라이언트가 구현 클래스를 직접 선택하는 경우
클라이언트는 인터페이스에 의존
BUT, 동시에 구현 클래스에도 의존하게 된다. - ex)
앞서 언급한 운전자가 자동차의 구현 클래스를 선택하는 예시를 보자
Car car = new K3();
위와 같은 클래스에서 운전자는 'Car'인터페이스에 의존하고 있지만,
구현 클래스인 K3를 직접 선택해서 객체를 생성하고 있기 때문에
동시에 구현 클래스에도 의존하게 된다. - 위와 같은 상황은 DIP를 위반한 것이다.
정리하자면
- 좋은 객체 지향의 핵심은 다형성을 활용하는 것
- 하지만 위의 몇 예시와 같이 다형성만으로는 OCP와 DIP를 지킬 수 없다.
- OCP와 DIP도 지키면서 다형성을 활요하기 위해서는 스프링이 필요하다.
출처 : 인프런 김영한님 스프링 강의
반응형
'내가 공부하려고 올리는 > 스프링' 카테고리의 다른 글
싱글톤 컨테이너 (0) | 2022.02.02 |
---|---|
스프링 컨테이너와 스프링 빈 (0) | 2022.02.02 |
관심사의 분리(IoC, DI 컨테이너) (0) | 2022.02.02 |
객체 지향 설계와 스프링 (0) | 2022.02.01 |
좋은 객체 지향 애플리케이션과 다형성 (0) | 2022.02.01 |
댓글