객체지향프로그래밍

[SOLID 원칙] 3. Liskov Substitution Principle 리스코프 치환 원칙

개발새발 2022. 1. 9. 20:46
반응형

Liskov Substitution Principle 리스코프 치환 원칙

정의 : Derived class는 Base class로 반드시 대체 될 수 있어야 한다.

 

예를 들어 아래와 같은 관계의 클래스가 있을 때 

Base myBase = new Derived();
myBase.funcA();
myBase.funcB();
myBase.funcC();
myBase.funcD();

 

 

리스코프 치환 원칙을 위반한 예

 

Base로 치환된 new Derived가 코드가 문제 없이 모든 메소드를 호출할 수 있어야 한다.

위의 코드가 안되는 경우가 있을까? 아마 java나 c++에서는 컴파일 에러를 발생시키기 때문에 코드 실행이 안되는 경우는 없을 것이다.

그러나 논리적으로 안되게 하는 방법이 있는데 그 예는 java.util.Date와 java.sql.Date에서 찾을 수 있다.

 

java.sql.Date는 java.util.Date를 상속해서 구현되었지만 java.util.Date에 있는 메소드 getDate를 사용할 수 없다(Deprecated)



이러한 경우 LSP원칙을 위반한 경우이다. LSP원칙을 위반하게 되면 아래와 같은 부작용이 발생하는데

LSP원칙이 깨짐으로써 OCP까지 위반하게 된다.

void printDate(java.util.Date myDate) {
	if(myDate instance of(java.sql.Date))
    	throw exception;
    ...

}
반응형