해결된 질문
작성
·
16
1
6-4 캡슐화에서 서브타입이 슈퍼타입을 대체할 수 있는 것이 SOLID 원칙 중 리스코프 치환원칙이라고 하셨는데 제가 알고있는 리스코프 치환원칙은 서브타입은 슈퍼타입을 대체 할 수 있어야 하고 슈퍼타입에서의 행위를 서브타입에서도 동일한 결과값이 예상될 수 있어야한다로 알고있습니다!
e.g) Collection의 add 메소드는 어떤 서브타입이여도 "추가"한다는 행위가 되어야한다
"서브타입이 슈퍼타입을 대체할 수 있다" 도 리스코프치환원칙의 특징이 맞지만 해당 원칙이 전하려는 주된 내용은 행위의 같은 예상 결과값으로 보여서요! 어떻게 생각하시는 지 궁금합니다!
답변 2
0
이석운님 안녕하세요.
좋은 질문 남겨주셔서 감사합니다.
리스코프 치환 원칙의 의미에 대해서 잘 알고 계시네요. 🙂
강의에서도 이석운님의 의견과 유사하게 설명하고 있습니다.
강의의 6분 41초 부분을 보시면 "이렇게 클라이언트 입장에서 서브 타입이 슈퍼 타입을 대체할 수 있도록 설계하는 원칙을 리스코프 치환원칙이라고 부릅니다"라고 설명하고 있어요.
리스코프 치환 원칙의 핵심은 어떤 클래스가 다른 클래스의 서브타입인지 여부를 판단하기 위해서는 두 클래스만 봐서는 안되고, 이 클래스들을 사용하는 클라이언트의 관점에서행동이 호환 가능한지 여부를 살펴봐야한다는 것을 의미합니다.
말씀하신 예에 따르면 Collection 인터페이스의 add 오퍼레이션이 있고, Collection 인터페이스륵 구현한 어떤 클래스 AnyCollection에 add 메서드를 오버라이딩 했다고 해볼게요.
이 때 AnyCollection 클래스가 Collection 인터페이스의 서브타입(서브클래스가 아니라)이 되려면 Collection 인터페이스 대신 AnyCollection 인스턴스가 전달되더라도 Collection을 사용하는 기존 코드가 오류 없이 정상적으로 실행되어야만 리스코프 치환 원칙을 만족한다고 말할 수 있습니다.
리스코프 치환 원칙의 의미와 리스코프 치환 원칙을 만족시키는 설계를 만들기 위한 가이드라인은 제가 만든 다른 강의인 "오브젝트 - 설계원칙편(https://inf.run/Hr6j7)"에서 깊이 있게 다루고 있습니다.
강의를 통해 알고 계신 내용을 한번 복습해 보시는 것도 좋을것 같아요. 🙂
답변이 되었는지 모르겠네요.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 이석운님.
리스코프 치환 원칙(Liskov Substitution Principle, LSP)은 객체 지향 설계에서 매우 중요한 원칙 중 하나로, 서브타입이 슈퍼타입을 대체할 수 있어야 한다는 개념을 포함합니다. 이 원칙은 하위 클래스가 상위 클래스 대신 사용할 수 있도록 설계되어야 한다는 것을 강조하며, 하위 클래스는 상위 클래스가 예상하는 대로 동작해야 한다는 것을 의미합니다.
이를 자세히 풀어 설명하면, LSP는 하위 클래스가 상위 클래스의 계약을 준수해야 함을 의미합니다. 계약이란, 메소드가 받아들이는 입력, 반환하는 출력, 수행하는 작업 등을 포함한 스펙을 의미하며, 서브타입에서 메소드의 행동이 상위 타입과 호환성 있게 유지되어야 한다는 것입니다.
이러한 호환성이 유지되지 않는 경우, 프로그램에서 예기치 않은 오류가 발생할 수 있습니다. 예를 들어, Collection 인터페이스의 add()
메소드는 모든 서브타입에서 아이템을 추가하는 기능을 수행해야 하며, 이 기능이 모든 서브타입에서 동일하게 작동해서 사용자에게 예측 가능한 결과를 보여주어야 합니다.
관련하여 더 깊이 있는 이해를 위해 “SOLID 객체지향 설계 원칙 가이드 - 리스코프 치환 원칙”에서 강사님께서 설명하신 내용을 참고하시면 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.