바바라 리스코프가 정의한 하위 타입
- S 타입의 객체 o1에 대응하는 T타입 객체 o2가 있다. →
o1: S, o2: T
- T 타입을 이용해 정의한 모든 프로그램 P에서o2 → o1
치환하더라도 P의 행위가 변하지 않는다면,
S는 T의 하위 타입이다.
1) 상속을 사용하도록 가이드하기 - LSP 준수 설계
⇒ LSP 준수 설계
2) 정사각형/직사각형 문제 - LSP 위반!
⇒ LSP 위반 설계
public class Rectangle {
private int width;
private int height;
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getArea() {
return width * height;
}
}
public class Square extends Rectangle {
@Override
public void setWidth(int width) {
super.setWidth(width);
super.setHeight(width);
}
@Override
public void setHeight(int height) {
super.setWidth(height);
super.setHeight(height);
}
}
Rectangle square = new Square();
square.setWidth(5);
square.setHeight(2);
assert(square.getArea() == 10);
⇒ 직사각형, 정사각형 상속 관계를 끊고 상속관계 재정의
⇒ getArea 메서드를 자식 클래스로 옮기는 방법 등이 필요
상황
purplecab.com/driver/Bob
/pickupAddress/24 Maple St.
/pickupTime/153
/destination/ORD
이 예제에서 말하고자 하는 것
URI | Dispatch Format |
---|---|
Acme.com | /pickupAddress/%s/pickupTime/%s/dest/%s |
. | /pickupAddress/%s/pickupTime/%s/destination/%s |
User1: op1
, User2: op2
, User3: op3
⇒ 인터페이스 분리 원칙 위반
⇒ 인터페이스 분리 원칙 준수
public interface MultifunctionService {
void copy();
void fax(Address from, Address to);
void print();
}
public class CopyMachine implements MultifunctionService {
@Override
public void copy() {
System.out.println("### 복사 ###");
}
@Override
public void fax(Address from, Address to) {
// 사용하지 않는 인터페이스가 변경되어도 함께 수정이 일어난다.
}
@Override
public print() {
// 사용하지 않는 인터페이스가 변경되어도 함께 수정이 일어난다.
}
}
multinfunction
인터페이스에서 fax()나 print()에 대해서 리턴 타입이 변경된다면, 이와 전혀 상관없는 CopyMachine 클래스도 같이 수정해줘야 하는 문제가 발생한다.public interface Print{
void print();
}
public interface Copy {
void copy();
}
public interface Fax {
void fax(Address from, Address to);
}
public class copyMachine implements Copy {
@Override
void copy() {
System.out.println("### 복사 ###");
}
}
Print, Copy, Fax 인터페이스로 분리
⇒ copyMachine
과 관계없다면 print(), fax()가 변경되어도 재컴파일/배포하지 않아도 됨
⇒ 인터페이스 분리 원칙 준수
import, include
선언문으로 인해 코드 의존성 발생,비-final, 비-private, 인스턴스 변수
에 대해서는 동적 바인딩을 수행하기 때문호출할 정확한 메서드를 런타임에 결정하는 것
(정적 바인딩 → 컴파일링시에 결정)
⇒ 따라서 ISP는 언어 종류에 따라 영향받는 정도가 다름
S → F → D
의존 관계