DoULikeJava
151
2021-10-14 01:43:46 작성 2021-10-14 01:45:42 수정됨
5
205

리스코프 치환 원칙에 대하여 제가 이해한 것이 맞는지 봐주실 수 있나요?


리스코프 치환 원칙을 풀어서 설명해보면

A를 상속받은 하위 개념인 B가 프로그램 상에서 A를 대체해도 프로그램의 정확성과 수행하는 업무에 변화가 없어야 한다는 것인데요.

즉 B로부터 얻을 수 있는 행위가 A로부터 얻을 수 있는 행위와 성격이 같아야 하는 것인데, 이 부분에서 살짝 제가 이해를 애매하게 한 부분이 있어서 여쭈고 싶습니다.

유튜브에서 어떤 분이 설명하는 것을 보니

정사각형과 직사각형은 상속관계로 두어서는 안 되며 그 이유가 한 변을 2 배로 늘리는 함수를 만들 경우 정사각형은 면적이 4배로 늘어나고 직사각형은 면적이 2배로 늘어나기 때문이라고 예시를 들어주셨습니다.

프로그램상에서 면적이 2배로 늘어나는 것을 기대했는데 4배로 늘어나는 행위를 해버리면 프로그램이 잘못 수행되는 결과를 초래하므로 그렇구나 대략 이해는 했습니다.

그런데 이 행위에 대해서 '기대'한다는 부분이 조금 기준이 애매한듯 합니다.

만약 위의 예에서 프로그램이 기대하는 결과가 면적이 2배로 늘어나는 것이 아니라 단지 늘어나는 것 뿐이라고 한다면 프로그램이 돌아가지 않을 이유는 없으니까요. 오히려 한 변을 2배로 늘리면 반드시 면적이 2배로 늘어나는 함수를 구현해야 한다면 자바에 오버라이딩 기능이 왜 있는 것일까요? 다형성의 이점이 비단 자식들의 추가된 행위에 있는 것 뿐만이 아니라, 부모의 행위를 자식들이 재해석 해서 수행함에 있는 부분도 있다고 생각합니다. 지금까지는 그 기준을 최소한 반환 타입을 맞추면 되는게 아닐까. 왜냐하면 나머지는 철학적인 기준이니까... 라고 생각했는데 리스코프 치환 법칙을 보다보니 다시 애매한 부분이 마음에 걸립니다.

부모의 함수를 완전히 똑같이 상속하지 않는다면 자식으로부터 기대되는 행위는 엄밀한 의미에서 프로그램이 바라는 바와 다를 수 있게 됩니다. 그래서 리스코프 치환원칙이란 프로그램의 '기대'라는 다소 철학적인 논란의 여지가 있는 애매한 기준에 맞는 상속이 보장되도록 설계를 해야한다는 것이라 결론을 내렸는데 아마 이건 아닐 듯 하여... ... 선배님들의 고견을 듣고싶습니다.

0
  • 답변 5

  • 엡실론
    2k
    2021-10-14 03:05:15

    원래 프로그램 설계, 객체지향설계라는게, 다소 철학적인, 논란의 여지가 있는, 애매한 기준으로 만들어지는 것입니다.

    객체 지향 프로그래밍이라는 것 자체가 코드를 쉽게 이해하고 쉽게 쓰기 위해서 만들어졌습니다. 쉽게 이해한다는 것, 쉽게 쓴다는 것은 객관적인 기준이 없죠. 모두 주관적이고, 애매한 기준입니다. 따라서 설계에 객관적으로 누구에게나 명확한 답은 없습니다.

    정사각형, 직사각형 예에서도 한변의 길이를 늘리는 것과 면적사이에 전혀 상관관계가 없다고 못 박아두고 설계를 할 수도 있을 겁니다. 하지만 그러기에는 사각형은 우리에게 너무나 친숙해서 많은 사람들이 실수할 여지가 많아지겠죠. 사각형이 아니고, 길이와 넓이가 아닌, 우리에게 덜 익숙해서 공통된 기대치가 없는 무언가였다면 저런식으로 설계할 가능성이 조금 더 있을 겁니다.  

  • 꿈의연봉1800
    318
    2021-10-14 03:27:10
    타입이 속성을 표현하지 못해서 그렇습니다
    자연스러운 생각이고 의외로 이런 허점을 허용하는 코드도 많습니다
  • 장독깨기
    3k
    2021-10-14 07:10:54

    네. 애매합니다. 정답이란게 있을 수도 없고..

    행위에 대해서 상속 보단 인터페이스를 권장하는 경우도 많구요.

    이게 또 케이스에 따라 다 다르니,.. 뭐 암튼 어렵습니다. :)

    애매할 경우 저는 주로 사용 케이스를 살펴보는 편인거 같습니다.

    예로 든 사각형은 굳이 리스코프 원칙을 따지지 않더라도,

    (사실 전 원칙을 잘 생각하지 않습니다. 어려워서요.ㅋ)

    상속 관계 보단 속성으로 둘 거 같습니다.


  • fender
    23k
    2021-10-14 07:43:04

    기본적으로는 그냥 객체지향 언어에서 A가 B를 상속하면 개념적으로 "A is a B" 관계가 성립한다는 의미로 이해해도 무방한 듯 합니다.

  • DoULikeJava
    151
    2021-10-14 13:46:38
    답변 모두 감사드립니다!
  • 로그인을 하시면 답변을 등록할 수 있습니다.