숏컷 코드
BaseWeapon 자리에 자식 무기 넣었는데
-> 예외 규칙이 늘어남
-> 계약이 깨진 것문법과 예시
LSP는 상속 가능성보다 호출부 의미 보존이 핵심이다
부모 타입을 기대하는 코드가 자식 타입으로 바뀌어도 같은 의미로 동작해야 LSP가 지켜집니다. 문제는 자식이 부모 계약을 몰래 강화하거나 약화할 때 생깁니다.
예를 들어 Use()는 항상 소비 가능하다고 약속된 무기인데, 어떤 자식만 특정 씬에서만 동작하거나 예외를 던지면 호출부는 부모 타입을 더 믿을 수 없게 됩니다.
게임 코드에서는 "특수 규칙 많은 자식"이 LSP를 자주 깨뜨린다
비행 적, 보스 무기, 특수 NPC 같은 자식이 등장할수록 부모 타입 계약이 흐려집니다. 이때 자식이 지나치게 많은 예외를 품으면 상속보다 조합이나 별도 전략이 더 나을 수 있습니다.
문제 신호
- BaseQuestReward는 항상 지급 가능해야 하는데
- OnlineReward만 서버 연결 없으면 실패
호출부 영향
- 부모 타입만 보고는 성공 여부를 예측 못 함LSP 위반은 보통 잘못된 상속 또는 너무 넓은 부모 계약에서 나온다
상속이 틀렸거나, 부모 인터페이스가 실제 공통분모보다 넓은 경우가 많습니다. 이때는 상속을 유지하기보다 계약을 더 작게 나누거나 공통 흐름만 남기고 특수 행동은 전략으로 빼는 편이 안전합니다.
가장 빠른 점검법은 "호출부에 if 분기가 생기는가"다
부모 타입을 받는 쪽이 "이게 자식 A면 이렇게, 자식 B면 저렇게"를 다시 분기하기 시작하면 이미 치환 가능성이 약해진 경우가 많습니다. 호출부 예외 처리가 늘어나는 순간 상속보다 계약 재설계나 조합이 더 나은지 의심해 볼 만합니다.
LSP를 볼 때 핵심
| 상황 | 적합한 선택 |
|---|---|
| 자식이 부모 메서드의 의미를 그대로 지킬 때 | 상속 유지 가능 |
| 자식이 특정 조건에서만 동작하거나 예외 규칙이 많을 때 | 상속 재검토 |
| 공통 계약이 너무 넓어 일부 자식이 구현을 억지로 비틀 때 | 계약 축소 또는 인터페이스 분리 |
| 특수 행동만 다르고 공통 흐름은 유지될 때 | 전략/조합 검토 |
특이 케이스와 주의할 점
흔한 실패는 "코드 재사용"만 보고 상속을 선택하는 것입니다. 재사용은 되더라도 호출부 계약이 깨지면 구조는 약해집니다. 자식이 부모 자리에 들어가도 의미가 유지되는지부터 확인하세요.
실패 예시
- BaseSaveTarget.Save()는 항상 즉시 저장된다고 가정
- CloudSaveTarget은 비동기 대기와 실패 재시도가 필요
결과
- 부모 호출부가 자식 규칙을 감당 못 함
- 계약 자체를 다시 설계해야 함참고 링크
1 sources