# [[Extract Method (함수 추출하기)]]

## 📌 Brief Summary
Extract Method(함수 추출하기)는 그룹화할 수 있는 코드 조각을 찾아 그 목적을 잘 설명하는 이름을 가진 독립된 메서드로 분리하는 가장 일반적인 리팩토링 기법입니다 [1, 2]. 이 기법은 주로 메서드가 너무 길거나, 코드의 의도를 파악하기 위해 주석이 필요한 경우에 사용됩니다 [2]. 복잡한 함수를 잘게 쪼개어 메서드 이름 자체가 문서 역할을 하도록 만들어 코드의 가독성과 테스트 용이성을 크게 높이는 것이 핵심 목적입니다 [1].

## 📖 Core Content
* **적용 시기 (When to apply):** 40줄을 초과하는 긴 메서드, 여러 곳에서 중복되는 로직, 또는 복잡성으로 인해 단위 테스트가 불가능한 코드를 발견했을 때 적용합니다 [1]. 또한 긴 메서드(Long Method)나 중복 코드(Duplicated Code)와 같은 코드 스멜을 해결하거나, 코드 블록에 주석을 달아야만 이해할 수 있을 때 주로 사용합니다 [2].
* **효과 및 장점 (Why it works):**
  * 메서드의 이름이 코드의 의도(How가 아닌 What)를 설명하는 문서 역할을 하여 코드 파악(Scannability)을 돕습니다 [1, 2].
  * 잘게 쪼개진 메서드는 다른 메서드에서 재사용될 확률을 높이고, 오버라이딩(Overriding)을 쉽게 만듭니다 [2].
  * 복잡했던 단위 테스트 과정을 직관적인 검증 과정으로 변환시켜 줍니다 [1].
  * 상위 수준의 메서드가 마치 일련의 주석을 읽는 것처럼 자연스럽게 읽히도록 합니다 [2].
* **실행 절차 (Steps/Mechanics):**
  1. 메서드의 의도를 설명하는 이름으로 새로운 메서드를 생성합니다 [1, 2].
  2. 추출할 코드를 원본 메서드에서 새 메서드로 복사합니다 [2].
  3. 추출된 코드 내에서 원본 메서드의 지역 변수 및 매개변수를 참조하는지 확인합니다 [2].
  4. 추출된 코드 내에서만 사용되는 임시 변수는 새 메서드 내의 임시 변수로 선언합니다 [2].
  5. 읽기 전용으로 사용되는 지역 변수는 새 메서드의 매개변수로 전달합니다 [2].
  6. 수정되는 지역 변수가 하나 있다면, 추출된 코드를 질의(Query) 함수로 취급하여 결과를 반환(return)받아 변수에 할당하도록 변수 스코프를 업데이트합니다 [1, 2].
  7. 원본 메서드의 추출된 코드 부분을 새 메서드 호출로 대체한 후 전체 테스트를 실행하여 동작 보존 여부를 검증합니다 [1, 2].

## ⚖️ Trade-offs & Caveats
* **지역 변수와 임시 변수 처리의 어려움:** Extract Method의 가장 큰 난관은 지역 변수, 특히 임시 변수(Temp)를 처리하는 것입니다 [2]. 매개변수와 임시 변수가 많은 코드를 무작정 추출하면, 새 메서드에 너무 많은 매개변수를 전달하게 되어 오히려 원래 코드보다 가독성이 떨어질 수 있습니다 [2]. 이러한 경우에는 '임시 변수를 질의 함수로 바꾸기(Replace Temp with Query)', '매개변수 객체 도입하기(Introduce Parameter Object)' 또는 '메서드를 메서드 객체로 대체하기(Replace Method with Method Object)'를 먼저 적용하여 매개변수와 변수를 줄이는 사전 작업이 필요할 수 있습니다 [2].
* **다중 반환 값 문제:** 추출하려는 코드가 두 개 이상의 지역 변수를 수정하여 반환해야 하는 경우 추출 작업이 매우 까다로워집니다 [2]. 이럴 때는 단일 값을 반환하도록 추출할 코드를 다르게 선택하거나, 각각을 별도의 메서드로 분리하는 것이 좋습니다 [2].
* **과도한 단편화(Over-fragmentation) 및 결합도:** 코드를 너무 얇게 쪼개면 로직이 사방으로 흩어져 전체 흐름을 파악하기 어려워질 수 있으므로 주의해야 합니다 [1]. 또한 지역 변수에 의존하는 추출된 메서드는 미묘한 결합(Subtle coupling)을 유발할 수 있으므로 변수 스코프를 주의 깊게 모니터링해야 합니다 [1].
* **이름 짓기의 제약:** 작게 쪼개진 메서드는 '좋은 이름'을 가질 때만 그 진가를 발휘합니다 [2]. 코드의 의도를 명확하게 드러내는 의미 있는 이름을 지을 수 없다면 해당 코드는 억지로 추출하지 않는 것이 낫습니다 [2].

---
*Last updated: 2026-05-03*