들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 리팩토링 41. 슈퍼클래스 추출하기(Extract Superclass) 슈퍼 클래스 추출하기 두 개 이상의 거대한 클래스가 있고, 상속 구조를 만들 수 있다면 슈퍼 클래스를 추출하면서 클래스의 크기를 줄일 수 있음. 방법 두 개의 클래스에서 비슷한 것들이 보인다면 상속을 적용하고, 슈퍼클래스로 'Pull Up Field' / 'Pull Up Method'를 사용한다. 슈퍼 클래스의 대안으로는 '클래스 추출하기'를 적용해 '위임'을 사용할 수도 있다. 접근 먼저 간단히 상속을 적용한다. 만약 상속 구조가 적절하지 않거나 필요하다면 '슈퍼클래스를 위임으로 교체하기'를 적용한다. 각 클래스에 공통이 되는 부분이 많고, 클래스 자체가 꽤 ..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 20. 거대한 클래스 (Large Class) 거대한 클래스 어떤 클래스가 너무 많은 일을 하다보면 필드도 많아지고, 중복 코드도 보이기 시작한다. 클라이언트들이 거대한 클래스가 제공하는 기능을 각각 일부만 사용한다면, 각각의 세부 기능을 별도의 클래스로 분리할 수 있다. 리팩토링 방법 '클래스 추출하기'를 사용해 관련있는 필드를 한 곳으로 모을 수 있다. 상속 구조를 만들 수 있다면 '슈퍼 클래스 추출하기' 또는 '타입 코드를 서브클래스로 교체하기'를 적용할 수 있다. 클래스 내부에 산재하는 중복 코드는 '메서드 추출'하여 제거할 수 있다. 거대한 클래스의 문제는 다음과 같다. 클래스의 책임이 많아지면 필드가 많아진다. 필드..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 냄새 19. 내부자 거래 (Insider Trading) '내부자 거래' 냄새는 다음 코드 형태를 의미한다. 어떤 모듈이 다른 모듈의 내부 정보를 지나치게 많이 알고 있는 상태. 이것은 모듈이 강하게 결합되어 있는 것을 의미함. 리팩토링 방법 적절한 모듈로 '함수 옮기기'와 '필드 옮기기'를 사용해 결합도를 낮출 수 있다. (참조하는 필드 기준) 여러 모듈이 자주 사용하는 공통적인 기능은 새로운 모듈을 만들어 잘 관리하거나, '위임 숨기기'를 사용해 특정 모듈의 중재자처럼 사용할 수도 있다. 상속으로 인한 결합도를 줄일 때는 '슈퍼클래스 또는 서브클래스를 위임으로 교체하기'를 사용할 수 있다. 코드로 살펴보기 CheckIn 클래스를..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 리팩토링 40. 서브클래스를 위임으로 바꾸기 (Replace Subclass With Delegate) 어떤 객체의 행동이 카테고리에 따라 바뀐다면, 보통 상속을 사용해서 일반적인 로직은 슈퍼클래스에 두고 특이한 케이스에 해당하는 로직을 서브클래스를 사용해 표현한다. 하지만 대부분의 프로그래밍 언어에서 상속은 오직 한번만 사용할 수 있다. 만약 어떤 객체를 두 가지 이상의 카테고리로 구분해야 한다면? 위임을 사용하면 얼마든지 여러가지 이유로 여러 다른 객체로 위임을 할 수 있다. 슈퍼클래스가 바뀌면 모든 서브클래스에 영향을 줄 수 있다. 따라서 슈퍼클래스를 변경할 때 서브 클래스까지 신경써야한다. 만약 서브클래스가 전혀 다른 모듈에..
들어가기 전 이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 리팩토링 39. 슈퍼클래스를 위임으로 바꾸기 (Replace Superclass with Delegate) 객체지향에서 '상속'은 기존의 기능을 재사용하는 쉬우면서 강력한 방법이지만, 때로는 적절하지 않은 경우도 있다. 서브클래스는 슈퍼클래스의 모든 기능을 지원해야 한다. Stack이라는 자료구조를 만들 때, List를 상속받는 것이 좋을까? 다 지원하는 것은 맞지 않다. 따라서 Stack / List는 상속 구조에 어울리지 않음. 서브 클래스는 슈퍼클래스 자리를 대체하더라도 잘 동작해야 한다. 리스코프 치환 원칙 서브클래스는 슈퍼클래스의 변경에 취약하다. 그렇다면 상속을 사용하지 않는 것이 좋은가? 상속은 적절한 경우에 사용하다면..