이번 포스팅에서는 solid의 3번째 원칙인 lsp에 대해서 알아보겠습니다!
LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
LSP에 대해서 설명하기에 앞서, 객체지향의 대해서 조금 이야기 해보겠습니다.
-객체지향에서의 상속은 조직도나 계층도로 표현되면 안됩니다.
- 조직도 같은 경우, 분명 다른 존재임에도 같은 기능을 요구할 수 있기 때문입니다.
- 따라서,객체지향은 분류도로 표현해야합니다.
이 이야기에 대해서는 밑에서 그림으로 좀 더 이야기 해보겠습니다.
- 서브타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 합니다.
- 하위 클래스의 인스턴스는 상위 클래스의 인스턴스 역할을 수행하는데 문제가 없어야 합니다.
위의 문장을 정리하면
- 하위클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류
- 구현 클래스 is a able of 인터페이스 - 구현 분류는 인터페이스 할 수 있아야 한다.
이렇게 정리할 수 있습니다.
위의 정리한 내용을 잘 적용한다면 LSP원칙은 잘 지켜진다고 할 수 있습니다.
간단한 정리는 끝났으니 그림을 통해서 좀 더 구체화 시켜보겠습니다!
- 위의 그림을 보면 너무 잘 만들어진 가족 조지도 인것을 알 수 있습니다.
- 하지만 여기서 객체지향스럽게 상속을 받을 수는 없습니다.
객체지향의 상속이라면
아버지 슬기 = new 딸();
이런식으로 딸의 객체를 생성할 수 있습니다. 그리고 현재 슬기라는 객체는 아버지의 행위를 할 수 있게 되었습니다....
상당히 논리적으로 이상한 상황입니다..
이번에는 다른 그림을 한번 보겠습니다!
위의 그림은 생물의 분류를 보여준 그림입니다.
이번에는 동물 심바 = new 사자();
이런 식으로 사자 객체를 생성했습니다. 그리고 현재 심바라는 사자 객체는 동물의 역할을 할 수 있습니다.
논리적으로 전혀 문제가 되지 않다고 생각이 드네요!!
너무 간단하지만 간단하게 코드를 준비해봤습니다 ㅎㅎ
아버지 클래스
package java8.objecstudy;
public class Father {
String name;
int age;
public void goManFittingRoom(){
String sb = "나 " +
this.name +
"! 남자 탈의실로 갑니다.";
System.out.println(sb);
}
}
딸 클래스
package java8.objecstudy;
public class Daughter extends Father{
}
실행 클래스
package java8.objecstudy;
public class Main {
public static void main(String[] args) {
Father 슬기 = new Daughter();
슬기.name = "슬기";
슬기.age = 29;
슬기.goManFittingRoom();
}
}
출력
동물 클래스
package java8.objecstudy;
public class Animal {
String name;
int age;
public void hunting(String huntedName){
String sb = huntedName +
"를 사냥한다!";
System.out.println(sb);
}
}
사자 클래스
package java8.objecstudy;
public class Lion extends Animal{
}
실행 클래스
package java8.objecstudy;
public class Main {
public static void main(String[] args) {
Animal 심바 = new Lion();
심바.hunting("토끼");
}
}
총 정리
먼저 보여드린 가족 조직도는 LSP 원칙을 잘 지키지 못했지만 생물 분류도는 LSP 원칙을 잘 지켰다고 볼 수 있습니다.
다음 포스팅에서는 solid의 4번째 원칙인 isp 원칙에 대해서 알아 보도록하겠습니다.
도움이 된 블로그
'객체지향' 카테고리의 다른 글
[객체지향의 사실과 오해] 1장 협력하는 객체들의 공동체 (0) | 2024.03.12 |
---|---|
캡슐화란 무엇일까? (0) | 2023.12.01 |
객체지향 설계란? - 2. OCP (1) | 2021.12.19 |
객체지향 설계란? - 1. SRP (solid) (0) | 2021.12.01 |
객체지향 프로그래밍 이란 (0) | 2021.02.01 |
댓글