Today I Learned

리스코브 치환의 원칙_The Liskov Substitution Principle(SOLID 5원칙중 L)-TIL

jjjkh 2023. 8. 1. 20:17

! 정의 

이 원칙은 5가지 원칙 중에서 좀처럼 쉽게 이해 되지 않는 원칙의 하나로 LSP라는 이름에서는 도저치 원칙에 대한 내용을 추축할 수 없는 원칙이다. LSP를 한마디로 한다면 서브타입은 언제나 기반 타입으로 교체할 수 있어야 한다 라고 할 수 있다. 즉 서브 타입은 언제나 기반 타입과 호환될 수 있어야한다. 달리 말하면 서브타입은 기반 타입이 약속한 규약을 지켜야 한다. 상속은 구현상속이든 인터페이스 상속이든 궁극적으로는 다형성을 통한 확장성 획득을 목표로 합니다. LSP원리도 역시 서브 클래스가 확장에 대한 인터페이스를 준수 해야 함을 의미합니다. 다형성과 확장성을 극대화 하려면 하위 클래스를 사용하는 것보다는 상위 글래스를 사용하는 것이 더 좋다. 일반적으로 선언은 기반 클래스로 생성은 구체 클래스로 대입하는 방법을 사용하는데 생성 시점에서 구체 클래스를 노출시키기 꺼려질 경우 생성 부분을 Abstract Factory등의 패턴을 사용하여 유연성을 높일 수 있습니다. 상속을 통한 재사용은 기반 클래스와 서브 클래스 사이에 IS-A관계가 있을 경우로만 제한 되어야 한다. 그 외의 경우에는 합성을 이용한 재사용을 해야한다. 상속은 다형성과 따로 생각할 수 없다. 그리고 다형성으로 인한 확장 효과를 얻기 위해서는 서브 클래스가 기반 클래스와 클라이언트 간의 규약을 어겨서는 안된다. 결국 이 구조는 다형성을 통한 확장의 원이인 OCP를 제공하게 됩니다. 따라서 LSP는 OCP를 구성하는 구조가 된다. 객체지향 설계원리는 이렇게 서로가 서로를 이용하기도 하고 포함하기도 하는 특징이 있습니다. LSP는 규약을 준수하는 상속 구조를 제공하다. LSP를 바탕으로 OCP는 확장하는 부분에 다형성을 제공해 변화에 열려있는 프로그램을 만들수 있도록 한다.

 

!적용방법

1. 만약 구 개체가 똑같은 일을 한다면 둘을 하나의 클래스로 표현하고 이들을 구분할 수 있는 필드를 둡니다.

2. 똑같은 연산을 제공하지만, 이들을 약간씩 다르게 한다면 공통의 인터페이스를 만들고 둘이 이를 구현합니다.

3. 공통된 연산이 없다면 완전 별개인 2개의 클래스를 만듭니다.

4. 만약 두 개체가 하는 일에 추가적으로 무언가를 더 한다면 구현 상속을 사용합니다.