📜 제목으로 보기

  • 참고 유튜브 : https://www.youtube.com/watch?v=navJTjZlUGk
  • 정리본: https://github.com/LenKIM/object-book
  • 코드: https://github.com/eternity-oop/object
  • 책(목차) : https://wikibook.co.kr/object/

ch9. 리스코프 치환원칙 for 헐리우드 원칙(묻지말고 시켜)

  • 책 추천: 객체 지향과 디자인 패턴(최범균 저)
    • 오브젝트에서 배운 내용을 더 얇게 잘 정리함
    • 뜬그룸잡는 코드없이 실무적으로 잘 가르켜 준다고 함
  • 오브젝트 책 6장의 내용 나갈 것임
    • 디미터의 원칙(최소지식 = 아는 놈으로 직거래만 하자)
    • 헐리우드 원칙((걔는 계속 변하니까)묻지마(받아서 할려고하지마) 그냥 시켜)
  • 객체지향에 실패하는 이유:
    • 헐리우드원칙: 물어보기 때문에 실패한다 -> 최대한 시키려고 하자
    • 즉, 객체return을 요구하는 method()를 만들지말자. 받아서 뭐 하려고하는 주도권을 버리자.
      • 물어본다 = 받아서 처리한다 -> 변화시 필연적으로 나도 영향을 받는다.
      • 알아서 하라고 떤지자. 묻지마. 객체는 계속 변해. 니가 알고 있던 걔가 아니다.
  • 디미터, 헐리우드 2 원칙은 객체지향이라기 보다 수정에 강한 코드를 만들어낸다.
    • 이 2 원칙과 밀접한 관계를 가지는 것이 SOLID원칙 중 리스코프 치환, 개방폐쇄 2 원칙이다.
      • LSP, OCP를 지키려면, 헐리우드원칙을 사용할 수 밖에 없다.
    • 코드로 배워보자.

LSP

image-20220205201350648

  • 리스코프 치환 원칙: 자식 형으로 부모 형(자리에)을 안전하게 대치할 수 있다.
    • 지난번 공부
      • 부모CLASS형 자리에는 자식Class형을 집어넣어서 원칙을 지키는지 판단
        • ex> 생물-숨쉰다()다리로이동한다() -> 아메바
      • 그렇지 않을 땐, 부모class(추상층의) 메소드를 따로 빼내서 자식들의 공통점만 가지게 수정한다
      • 추상층을 어떻게 잘만들까? 어떻게 추상층이 함부러 나대지 않게 만들까?
    • 상속을 지원하므로 당연한 얘기 같지만, 그렇지 않다.
  1. 어떤 구상클래스들의 메소드가 공통이면 -> 공통메소드를 추상클래스(or인터페이스)로 뽑아낼 수 있다.
    • 이것을 추상화라 한다. image-20220205201824119
  2. 그런데 이런 것은 대부분 성급한 추상화다.
    • 예를들면, 공통인줄만 알았는데, 다른 구상클래스에는 존재 하지 않은 메소드c()로 바뀔 수 있기 때문이다. image-20220205201953384
  3. 대부분의 개발자들은 귀찮아서 fake c()를 만들어서, 강제로 공통메소드로 주입시킨다
    • 하지만 c()를 강제로 넣은 순간 리스코프 치환 원칙 위배이다. fake c()를 집어넣는 것 때문에 숨겨진 context 버그가 일어나기 때문 image-20220205202041293
  4. fake c()를 만들지말고, 일부공통인 메소드 c()를 구상하는 새로운 추상층을 만들고, 전체공통 a()b() 추상층을 따로 두어서 리스코프 치환 원칙을 만족시킨다.image-20220205202205658
  • 리스코프 치환 원칙은 위의 예처럼 스펙(공통메소드)가 줄어들 때 유용하다
    • 즉, 새로나온 녀석이 공통점이 줄어든체로 등장하면 굉장히 쓸모이다.
  • 그렇다면, 스펙(공통메소드)가 늘어나는 경우는 어떨까? image-20220205202729746
    • 공통점을 다 추상화된 상태인데? 리스코프 치환 원칙은 지킨 상태다.
      • 혼자 늘어난 d()는 어떻게 할까? image-20220205202804665
        • 이것이 바로 다운캐스팅을 일으키는 (=LSP을 위배시키는) 코드다.
          • 다운캐스팅을 쓰는 순간 OCP도 자동으로 망가진다.
        • 다운캐스팅없이는 늘어날때는 쉽지 않다.
        • 열심히 설계했는데도, instanceof 와 다운캐스팅이 넘쳐나는 이유이다.
      • 언어적인 수단으로 제네릭을 이용해서 이 문제를 해결한다.
        • 저번시간에는 형을 인식하는 제네릭
        • 이번에는 리스코프 치환 원칙이 확장형으로 일어날 때, 확장하여 다운캐스팅을 방지하는 제네릭을 공부할 것이다.

Generic for 확장형 LSP 해결

image-20220205203151229

  • 코드를 LSP를 시도하면서 삽질하고, 제네릭으로 바꿔보면서, OCP원칙을 지켜가는 과정을 재해석 해보자.

개발자의 세계

image-20220205203300192

  • 개발자는 IT회사내에서도 극히 희귀한 존재다.
    • 개발자를 도구로 바라본다. (생각을 주면 프로그램으로 바꿔줄거야)