본문 바로가기
OOP/<오브젝트>, 조영호

10장 상속과 코드 재사용

by 민휘 2024. 1. 29.

10장 읽으면서 이야기 나눈 내용

  • Phone을 개선하는 과정을 보면서 작가님의 사고 흐름을 따라갈 수 있었음. 멋지다. 근데 과연 내가 할 수 있을까..? → 돌아가는 코드를 짜고 시간을 내서 이렇게 리팩토링하면 좋을 것 같은데요. 근데 리팩토링을 하더라도 기존 코드가 덜 깨지게 깨끗한 구조를 미리 만들어두면 좋을 듯.
  • 금요일에 부동산 프로젝트하면서 재사용코드가 너무 많아서 괴로웠음. 파싱해온 데이터 속성 값에 따라서 다 다른 파서를 만들어서 문자열만 다르고 나머지 코드 다 복붙함. 심지어 파싱해서 반환하는 클래스도 동일함. 어떻게 개선할 수 있을까요? → 달라지는 부분만 생성자로 받아서 하나의 클래스로 합치는건 어떨까요? 아님 동일한 메시지를 가진 인터페이스를 뽑아서 추상 클래스로 구현을 추가하고 하위 클래스에서 구체적인 주택의 타입을 나타내도 좋을 것 같아요.
  • 여행 프로젝트는 파싱하고 바로 DTO를 만드는 부분에서 세터를 사용했던게 마음에 걸린다. 파싱하다가 중간에 오류나면 그 DTO는 불완전한 상태로 시스템에 존재하게 되는 것 아닌가? 차라리 값을 로컬 변수로 받아두고 생성자로 초기화하는 방법이 더 좋을 것 같다. 불변인 상태의 클래스를 만들고 싶으신거군요. 오사용 방지하려면 그게 좋은 선택일 것 같음.

 

중복 코드가 해로운 이유

  • 코드를 작성한 동료를 의심하게 만듦
  • 변경을 어렵게 만든다. 모든 중복 코드는 함께 변경되야하고, 식별하기도 어렵다.
  • 변경에 취약하며 버그 발생 가능성을 높인다. 코드 변경 속도는 낮아진다. DRY하게 유지해야 한다.

 

상속을 위한 경고

  • 자식 클래스의 메소드 안에서 super 참조를 이용해 부모 클래스의 메소드를 직접 호출할 경우, 두 클래스는 강하게 결합된다. super 호출을 제거할 수 있는 방법을 찾아 결합도를 제거하라.
  • 상속받은 부모 클래스이 메소드가 자식 클래스의 내부 구조에 대한 규칙을 깨트릴 수 있다.
  • 자식 클래스가 부모 클래스의 메서드를 사용하는 방법에 자식 클래스가 결합될 수 있다.
  • 클래스를 상속하면 결합도로 인해 자식 클래스와 부모 클래스의 구현을 영원히 변경하지 않거나, 자식 클래스와 부모 클래스를 동시에 변경하거나 둘 중 하나를 선택할 수 밖에 없다.
  • 상속은 캡슐화를 깨뜨리므로 대부분의 경우 우아한 해결방법이 아니다. 더 좋은 방법은 합성이다.

 

상속으로 인한 결합도 해결하기 → 추상화!

  • 하위 클래스의 두 메서드의 유사한 코드를 메서드로 추출한다. 달라지는 부분을 퍼블릭 인터페이스로 추출한다.
  • 동일한 코드와 퍼블릭 인터페이스를 상위 클래스로 올린다.