본문으로 바로가기
dobidugi
목록으로
강의

조합 메소드로 run 메소드 리팩토링하기

6분
목차

게임 클래스의 복잡한 run 메소드를 단일 추상화 수준 원칙에 따라 조합 메소드로 리팩토링하는 실전 과정. 가독성·중복 제거·의존성 고립을 위한 메소드 추출 기법과, 추출한 메소드를 적절한 클래스로 옮기는 책임의 이동까지 다룬다.

1. 리팩토링 대상: run 메소드

📝 NOTE 조합 메소드 동일한 추상화 수준의 코드들로만 구성되어, 각 단계가 문장처럼 읽히는 메소드.

2. 리팩토링 절차: 주석 → 메소드 추출

리팩토링의 첫 단계는 비슷한 목적의 코드를 묶고 그 위에 주석을 다는 것.

2-1. 코드를 목적별로 묶고 주석 달기

run 메소드는 세 덩어리로 구분된다.

위치하는 일주석
상단환영 문구·방 위치·명령어 목록 출력 (게임 소개)환영 문구 출력
중간루프 돌며 입력 받고 파싱하고 명령어 실행 (플레이 플로우)GamePlay
하단게임 종료 문구 출력 (한 줄이지만 의도 차이가 큼)작별 문구 출력

💡 TIP 주석만 떼어 읽으면 메소드가 하는 일이 한눈에 보인다: “run은 환영 문구를 출력하고, 게임 플레이를 실행하고, 작별 문구를 출력한다.” 코드 길이와 무관하게 실행 단계를 동일한 추상화 수준에서 설명한다.

2-2. 주석을 메소드 이름으로 변환

📌 IMPORTANT 좋은 메소드 이름 = 호출하는 클라이언트의 의도를 표현하는 이름. 이미 달아둔 주석이 곧 클라이언트(run)의 의도이므로, 주석을 그대로 메소드 이름으로 바꾼다.

3. 재귀적 적용: welcome도 조합 메소드로

추출한 메소드도 다시 조합 메소드로 만들 수 있다. welcome은 세 정보를 출력하지만 무엇을 출력하는지 드러나지 않는다.

4. 언제까지 추출하는가? — 한 가지 작업 / 한 가지 이유

📌 IMPORTANT 메소드가 **오직 한 가지 작업(= 클라이언트가 달성하려는 한 가지 목적)**만 수행할 때까지 추출한다.

4-1. 변경 이유와 응집도

📝 NOTE 응집도

  • 여러 이유로 변경되는 메소드 → 응집도 낮음
  • 한 가지 이유로만 변경되는 메소드 → 응집도 높음

5. 재사용의 이점: look / help 명령어 추가

응집도 높은 작은 메소드는 여러 곳에서 재사용 가능하다.

6. play 메소드 리팩토링

play는 여전히 길고 복잡하다. 지난 시간의 세 가지 목적으로 메소드를 추출한다.

6-1. 가독성 향상을 위한 추출

6-2. 중복 제거를 위한 추출

6-3. tryMove로 실행 플로우 통합

6-4. 의존성 고립을 위한 추출

📝 NOTE 의존성 고립 외부(콘솔·키보드 등)에 의존하는 저수준 코드를 별도 메소드로 분리해, 고수준 게임 로직에서 격리한다.

💡 TIP 여기서 더 추출하면 과도하게 세분화된다. 메소드 추출은 여기까지. 이후는 클래스 수준에서 개선.

7. 다음 단계: 책임의 이동 (클래스 수준 개선)

📝 NOTE 책임의 이동 추출한 메소드를 적절한 클래스로 옮기는 것. 한 클래스에서 다른 클래스로 메소드를 이동시키는 작업을 객체지향에서 책임의 이동이라 부른다.

핵심 요약



이전 글
메서드 추출 리팩토링
다음 글
참조 객체와 값 객체 - 작은 클래스 만들기