리스코프 치환원칙에 대해 질문드립니다!
6-4 캡슐화에서 서브타입이 슈퍼타입을 대체할 수 있는 것이 SOLID 원칙 중 리스코프 치환원칙이라고 하셨는데 제가 알고있는 리스코프 치환원칙은 서브타입은 슈퍼타입을 대체 할 수 있어야 하고 슈퍼타입에서의 행위를 서브타입에서도 동일한 결과값이 예상될 수 있어야한다로 알고있습니다!
e.g) Collection의 add 메소드는 어떤 서브타입이여도 "추가"한다는 행위가 되어야한다
"서브타입이 슈퍼타입을 대체할 수 있다" 도 리스코프치환원칙의 특징이 맞지만 해당 원칙이 전하려는 주된 내용은 행위의 같은 예상 결과값으로 보여서요! 어떻게 생각하시는 지 궁금합니다!
回答 2
3
이석운님 안녕하세요.
좋은 질문 남겨주셔서 감사합니다.
리스코프 치환 원칙의 의미에 대해서 잘 알고 계시네요. 🙂
강의에서도 이석운님의 의견과 유사하게 설명하고 있습니다.
강의의 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 객체지향 설계 원칙 가이드 - 리스코프 치환 원칙”에서 강사님께서 설명하신 내용을 참고하시면 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
자료 한번에 다운로드 받을 수 있게 좀 해주세요.
1
61
2
이 강의만 자료가 ppt네요.
1
95
1
DiscountPolicy의 구현체에 관련 질문 드려요!
1
61
2
강의 자료 관련 질문입니다! (2-4. 절차에서 객체로)
1
86
2
도메인 관련 질문이 있습니다!
1
113
2
영화, 상영, 예매 도메인 관계에 대한 질문
1
88
2
[오타제보] 6-4. 캡슐화
2
48
2
책임주도 설계 적용에 대한 간단한 질문 남겨드립니다.
1
111
2
객체지향 설계에서 메서드를 설계할 때 궁금한 점이 있습니다.
2
73
2
도메인 모델을 잘 정의하기 위해서 어떻게 해야할까요?
1
113
2
getter 사용에 대한 질문입니다.
1
56
2
6-1. 변경과 설계 마지막 추상화 관련 질문 입니다.
1
59
3
객체 지향 설계 원칙에 대한 질문입니다
1
52
2
[5-1] Screening과 Movie의 의존관계에 대한 궁금증 질문입니다.
1
60
2
2-2. 변경과 의존성 / 데이터 내부 변경 시 setter가 변경의 여파를 흡수하는 방식은 어떤가요?
2
72
2
[5-1] DiscountPolicy의 getDiscountAmount 추상 메서드 관련 질문입니다,
1
59
2
2-4. 절차에서 객체로 / 도메인 구조를 따라 클래스 구조 변경 부분
1
82
2
질문 있습니다!
1
64
2
[강의 자료 오타 제보]
1
67
2
간접 참조에 대한 질문
1
136
2
3-1 강의 질문입니다.
1
108
2
책 두권 다 읽어봐야 할까요?
1
196
2
(질문 글) Movie와 Customer의 위치
1
93
2
(오타 제보) 2-3 문서 내 문구 수정 제안
1
79
2

