본문 바로가기
객체지향

객체지향 설계란? - 3. LSP

by 근즈리얼 2022. 1. 16.
728x90

이번 포스팅에서는 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 원칙에 대해서 알아 보도록하겠습니다.

 

도움이 된 블로그

https://ktko.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5%EC%9D%98-%EC%9B%90%EB%A6%AC-SOLID-LSP-%EB%A6%AC%EC%8A%A4%EC%BD%94%ED%94%84-%EC%B9%98%ED%99%98-%EC%9B%90%EC%B9%99

 

자바 객체 지향의 원리 SOLID - LSP : 리스코프 치환 원칙

LSP : 리스코프 치환 원칙 "서브 타입은 언제든 자신의 기반 타입으로 교체할 수 있어야 한다. - 로버트 C 마틴" 객체 지향에서의 상속은 조직도나 계층도가 아닌 분류도가 되어야 한다. 객체 지

ktko.tistory.com

 

728x90

댓글