LSP (Liskov Substitution Principle)
LSP, Liskov Substitution Principle<br />
(리스코프 치환 원칙)
일반화 관계에서 자식 클래스는 최소한 자신의 부모클래스에서 가능한 행위는 수행 할 수 있어야 한다.<br />
부모클래스와 자식클래스 사이에 행위가 일관성 있어야 한다.
<br />
#Before branch
<img alt="" src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/KEQQMN181224235521.JPG" style="width:140px" />
MinMax1은 MinMax를 상속받는다.
<br/>
<br/>
<br/>
MinMax.java
import java.util.ArrayList;
import java.util.Collections;
public class MinMax{
public ArrayList mimax(ArrayList a){
int minValue;
int maxValue;
ArrayList b;
minValue = Collections.min(a);
maxValue = Collections.max(a);
a.set(0, minValue);
a.set(a.size() - 1, maxValue);
b=a;
return b;
}
}
<br/>
MinMax는 배열에서 가장 큰값과, 가장 작은 값을 찾아서<br />
가장 작은 값은 0번째 순서에,<br />
가장 큰값은 마지막 순서에 넣는다.<br />
<br />
<br />
MinMax1.java
import java.util.ArrayList;
import java.util.Collections;
public class MinMax1 extends MinMax {
public ArrayList mimax(ArrayList a){
int minValue;
int maxValue;
ArrayList b;
minValue = Collections.min(a);
maxValue = Collections.min(a);
a.set(0, minValue);
a.set(a.size() - 1, maxValue);
b=a;
return b;
}
}
<br/>
<br />
MinMax1은 배열에서 가장 작은 값을 찾아<br />
0번째 순서에, 마지막 순서에 넣는다.
<br/>
위 프로그램은 LSP원칙을 위반함을 보여준다
<br />
LSP 원칙은 일반화 관계를 설명한다<br />
일반화 관계는 is kind of 관계이다.<br />
그렇다면 MinMax1 is kind of MinMax 관계는 성립한다고 할 수 있을까?<br />
LSP 원칙에 맞추어 행위의 일관성에 대해서 판단하여야 한다.<br />
<br />
부모 클래스의 객체를 자식 클래스의 객체가 대신 할 수 있는지 확인하여야 한다.
<br/>
그렇다면 MinMax1클래스의 객체는 MinMax클래스의 객체를 대신 할 수 있을까?<br />
MinMax 클래스에서 배열의 마지막 자리는 최댓값이 들어 가지만,<br />
MinMax1 클래스에서 배열의 마지막 자리는 최솟값이 들어간다.<br />
MinMax의 객체가 MinMax1의 객체를 대신 할 수는 없을 것이다.<br />
그러므로 행위에 일관성이 없으며 <br />
MinMax is kind of MinMax1관계는 성립 하지 않는다.
<br />
#After branch
<img alt="" src="https://static.podo-dev.com/blogs/images/2019/07/10/origin/32V27F181224235521.JPG" style="width:140px" />
MinMax2는 MinMax1을 상속 받는다.
위 프로그램은 LSP원칙을 위반하지 않음을 보여준다.
<br/>
<br/>
MinMax.java
import java.util.ArrayList;
import java.util.Collections;
public class MinMax{
public ArrayList mimax(ArrayList a){
int minValue;
int maxValue;
ArrayList b;
minValue = Collections.min(a);
maxValue = Collections.max(a);
a.set(0,minValue);
a.set(a.size()-1,maxValue);
b=a;
return b;
}
}
<br/>
MinMax는 배열에서 가장 큰값과, 가장 작은 값을 찾아서<br />
가장 작은 값은 0번째 순서에,<br />
가장 큰값은 마지막 순서에 넣는다.<br />
<br />
<br />
MinMax2.java
import java.util.ArrayList;
import java.util.Collections;
public class MinMax2 extends MinMax {
public ArrayList mimax(ArrayList a){
int minValue;
int maxValue;
ArrayList b;
Collections.sort(a);
b=a;
return b;
}
}
<br/>
MinMax2 클래스는 배열을 정렬한다.
위의 일반화 관계에서는 행위의 일관성이 있을까?<br />
MinMax 클래스에서 배열의 첫 자리에는 최솟값, 마지막 자리는 최댓값이 들어가고,<br />
MinMax2 클래스 또 한 정렬에 의해 배열의 첫 자리에, 최소값 가장 마지막 자리에 최댓값이 들어간다.<br />
MinMax2의 객체는 MinMax의 객체를 대신 할 수 있을 것이다. <br />
그러므로 행위의 일관성이 있으므로, MinMax2 is kind of MinMax 는 성립한다