본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



LSP : 리스코프 치환 원칙


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


객체 지향에서의 상속은 조직도나 계층도가 아닌 분류도가 되어야 한다. 객체 지향의 상속은 다음의 조건을 만족해야 한다.


하위클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류다

구현 클래스 is able to 인터페이스 - 구현 분류는 인터페이스 할 수 있어야 한다.


위 두개의 문장대로 구현된 프로그램 이라면 이미 리스코프 치환 원칙을 잘 지키고 있다고 할 수 있다. 하지만 위 문장대로 구현되지 않은 코드가 존재할 수 있는데 바로 상속이 조직도나 계층도 형태로 구축된 경우다. 아버지를 상위 클래스로 하는 딸이라는 하위 클래스가 있다. 바로 전형적인 계층도 형태이며, 객체 지향의 상속을 잘못 적용한 예다.



아버지 춘향이 = new 딸();


이름이 춘향이라는 것은 좋지만 아빠의 역할을 맡기고 있다. 춘향이는 아버지형의 객체 참조 변수이기에 아버지 객체가 가진 행위(메서드)를 할 수 있어야 하는데 춘향이에게 아버지의 어떤 역할을 시킬 수 있을까 ?


동물 클래스와 이를 상속하는 팽귄 클래스가 있다고 해보면, 즉 분류도 형태인 경우를 살펴보면 아래와 같다.



동물 뽀로로 = new 펭귄();


논리적인 흠이 없다. 팽귄 한마리 이름은 뽀로로이고, 동물의 행위(메서드)를 잇게하는데 전혀 이상함이 없다.


아버지 - 딸 구조(계층도/조직도)는 리스코프 치환 원칙을 위배하고 있는 것이고, 동물 - 펭귄 구조(분류도)는 리스코프 치환 원칙을 만족하는 것이다.


로버트 C 마틴의 결론은 "하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다."


출처 - 스프링 입문을 위한 자바 객체 지향의 원리와 이해