LSP 가이드: 리스코프 치환 원칙은 왜 어려울까
Dev

LSP 가이드: 리스코프 치환 원칙은 왜 어려울까


SOLID 중에서 LSP, 리스코프 치환 원칙은 입문자에게 특히 추상적으로 느껴지는 경우가 많습니다. 하지만 실제로는 상속과 다형성을 사용할 때 아주 현실적인 문제를 다룹니다. “겉으로는 같은 타입처럼 보이는데, 실제로는 기대한 대로 동작하지 않는 상황”을 막기 위한 원칙입니다.

이 글에서는 아래 내용을 정리합니다.

  • LSP가 무엇인지
  • 왜 상속 구조에서 중요해지는지
  • 어떤 경우에 문제가 생기는지

핵심은 하위 타입은 문법상 상속만 하는 것이 아니라, 상위 타입이 약속한 기대를 깨뜨리지 않고 대체 가능해야 한다는 점입니다.

LSP란 무엇인가

아주 단순하게 말하면:

  • 하위 타입은 상위 타입 대신 들어가도 자연스럽게 동작해야 한다

는 원칙입니다.

즉, 어떤 코드는 상위 타입 기준으로 작성되어 있는데, 하위 타입을 넣었더니 예외가 나거나 의미가 바뀌면 문제가 생길 수 있습니다.

왜 중요한가

상속을 쓰는 가장 큰 이유 중 하나는 공통 규약 아래에서 다양한 구현을 다루기 위해서입니다. 그런데 하위 타입이 상위 타입의 계약을 깨면:

  • 다형성이 무너지고
  • 분기 처리가 늘어나며
  • 상속 구조가 오히려 위험해집니다

즉, 상속은 했는데 대체는 안 되는 상태가 되는 것입니다.

어떤 경우에 문제가 생길까

예를 들어 상위 타입은 “이 메서드는 항상 성공적으로 동작한다”는 기대를 주는데, 하위 타입은 특정 상황에서 전혀 다른 예외를 던지거나 동작을 제한하면 문제가 됩니다.

즉, 이름과 타입만 같은 것이 아니라:

  • 의미
  • 제약
  • 결과

가 크게 어긋나지 않아야 합니다.

왜 상속보다 조합이 자주 언급될까

LSP를 잘 지키기 어려운 상속 구조는 의외로 많습니다. 그래서 실무에서는 상속을 무리하게 늘리기보다, 조합으로 역할을 분리하는 편이 더 안전한 경우가 많습니다.

즉, LSP를 배우면 자연스럽게 “상속을 정말 써도 되는가”를 더 조심해서 보게 됩니다.

자주 하는 오해

1. 상속만 되면 LSP도 만족한다

문법상 상속과 의미상 대체 가능성은 다른 문제입니다.

2. 메서드 이름만 같으면 된다

실제 사용자가 기대하는 동작과 제약이 중요합니다.

3. LSP는 너무 이론적이라 실무와 멀다

실제로는 상속 구조가 왜 자꾸 깨지는지 설명해주는 꽤 현실적인 기준입니다.

FAQ

Q. 입문자는 LSP를 어떻게 감 잡으면 좋을까

상위 타입을 사용하는 코드가 하위 타입으로 바뀌어도 분기 없이 자연스럽게 동작하는지 생각해보면 좋습니다.

Q. LSP가 어렵다면 무엇을 먼저 봐야 하나

상속 관계가 정말 자연스러운지, 혹은 조합이 더 나은지 먼저 보는 것이 좋습니다.

Q. LSP를 안 지키면 어떤 일이 생기나

예상 못한 예외, 분기 증가, 다형성 붕괴 같은 문제가 생길 수 있습니다.

먼저 읽어볼 가이드

검색 유입이 많은 핵심 글부터 이어서 보세요.