LSP : 리스코프 치환 원칙
"서브 타입은 언제든 자신의 기반 타입으로 교체할 수 있어야 한다. - 로버트 C 마틴"
객체 지향에서의 상속은 조직도나 계층도가 아닌 분류도가 되어야 한다. 객체 지향의 상속은 다음의 조건을 만족해야 한다.
하위클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류다
구현 클래스 is able to 인터페이스 - 구현 분류는 인터페이스 할 수 있어야 한다.
위 두개의 문장대로 구현된 프로그램 이라면 이미 리스코프 치환 원칙을 잘 지키고 있다고 할 수 있다. 하지만 위 문장대로 구현되지 않은 코드가 존재할 수 있는데 바로 상속이 조직도나 계층도 형태로 구축된 경우다. 아버지를 상위 클래스로 하는 딸이라는 하위 클래스가 있다. 바로 전형적인 계층도 형태이며, 객체 지향의 상속을 잘못 적용한 예다.
아버지 춘향이 = new 딸();
이름이 춘향이라는 것은 좋지만 아빠의 역할을 맡기고 있다. 춘향이는 아버지형의 객체 참조 변수이기에 아버지 객체가 가진 행위(메서드)를 할 수 있어야 하는데 춘향이에게 아버지의 어떤 역할을 시킬 수 있을까 ?
동물 클래스와 이를 상속하는 팽귄 클래스가 있다고 해보면, 즉 분류도 형태인 경우를 살펴보면 아래와 같다.
동물 뽀로로 = new 펭귄();
논리적인 흠이 없다. 팽귄 한마리 이름은 뽀로로이고, 동물의 행위(메서드)를 잇게하는데 전혀 이상함이 없다.
아버지 - 딸 구조(계층도/조직도)는 리스코프 치환 원칙을 위배하고 있는 것이고, 동물 - 펭귄 구조(분류도)는 리스코프 치환 원칙을 만족하는 것이다.
로버트 C 마틴의 결론은 "하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다."
출처 - 스프링 입문을 위한 자바 객체 지향의 원리와 이해
'자바 디자인 패턴' 카테고리의 다른 글
자바 객체 지향의 원리 SOLID - DIP : 의존 역전 원칙 (3) | 2018.10.12 |
---|---|
자바 객체 지향의 원리 SOLID - ISP : 인터페이스 분리 원칙 (1) | 2018.10.12 |
자바 객체 지향의 원리 SOLID - OCP : 개방 폐쇄 원칙 (0) | 2018.10.11 |
자바 객체 지향의 원리 SOLID - SRP : 단일 책임 원칙 (0) | 2018.10.11 |
자바 객체 지향의 원리 SOLID란 무엇인가? (0) | 2018.10.11 |