Files
2nd/10_Wiki/Topics/Architecture/Duplicated Code (중복 코드).md
T

19 lines
3.6 KiB
Markdown

# [[Duplicated Code (중복 코드)]]
## 📌 Brief Summary
중복 코드는 동일한 코드 구조가 두 곳 이상에 반복되어 나타나는 현상으로, 가장 대표적이고 해결이 시급한 코드 스멜(Code Smell) 중 하나로 꼽힌다 [1]. 기능이나 규칙 변경 시 여러 곳을 빠짐없이 찾아 동일하게 수정해야 하므로 소프트웨어 유지보수 비용을 증가시키고 버그 발생 위험을 높인다 [2, 3]. 이를 해결하기 위해 메서드 추출, 클래스 추출 등의 기법으로 중복을 제거하여 단일 진실 공급원(Single Source of Truth)을 확보하고 시스템의 설계를 개선한다 [1, 4].
## 📖 Core 소스 Content
* **중복 코드의 위치에 따른 리팩토링 기법**:
* **동일한 클래스 내 두 메서드의 중복**: '메서드 추출(Extract Method)'을 사용하여 공통 코드를 새로운 메서드로 분리하고, 원래 있던 두 곳에서 이 메서드를 호출하도록 수정한다 [1].
* **동일한 부모를 가진 하위 클래스 간의 중복**: '메서드 추출'을 적용한 뒤 '필드 올리기(Pull Up Field)'나 '메서드 올리기(Pull Up Method)'를 통해 부모 클래스로 중복 코드를 이동시킨다 [1, 5]. 코드가 비슷하지만 완전히 같지는 않다면, 차이점을 분리한 뒤 '템플릿 메서드 형성(Form Template Method)'을 사용하거나 알고리즘 자체가 다르다면 '알고리즘 전환(Substitute Algorithm)'을 적용할 수 있다 [1, 4].
* **관련 없는 두 클래스 간의 중복**: '클래스 추출(Extract Class)'을 통해 새로운 컴포넌트를 만들어 두 클래스 모두에서 이를 참조하게 하거나, 해당 메서드가 논리적으로 속해야 할 제3의 클래스로 이동시킨다 [4].
* **조건문 내의 중복**: 조건문의 모든 분기(Branch)에서 동일한 코드가 반복 실행된다면, '조건부 중복 구문 통합(Consolidate Duplicate Conditional Fragments)'을 통해 해당 코드를 조건문 밖으로 빼낸다 [6, 7].
* **중복 제거의 핵심 목적**: 중복을 제거한다고 해서 프로그램의 실행 속도나 성능이 크게 향상되는 것은 아니지만, 향후 코드를 수정할 때 단 한 곳만 변경하면 되도록 구조를 개선하는 훌륭한 설계의 핵심이 된다 [2].
## ⚖️ Trade-offs & Caveats
* **잘못된 추상화의 위험성 (Wrong Abstraction)**: 두 코드가 겉보기에 같아 보여도 실제로는 전혀 다른 개념이나 추상화를 나타내는 우연한 중복일 수 있다 [8]. 잘못된 추상화를 억지로 적용하면 이후 새로운 요구사항이 생길 때마다 불필요한 부울(boolean) 매개변수나 if 문을 추가하여 코드를 복잡하게 구부려야 한다 [9]. 따라서 성급하게 리팩토링하는 것보다 우연한 중복을 그대로 두는 것이 유지보수 측면에서 훨씬 저렴하고 안전할 수 있다 [3, 8].
* **'3의 법칙 (Rule of Three)' 적용**: 코드가 두 번 중복되었다고 해서 무조건 리팩토링하는 것은 권장되지 않는다 [10]. 첫 번째는 그냥 코드를 작성하고, 두 번째로 비슷한 작업을 할 때는 중복이 거슬리더라도 일단 그대로 작성하며, 세 번째로 비슷한 코드를 작성하게 될 때 비로소 리팩토링을 수행하라는 '3의 법칙'이 권장된다 [11-13]. 세 번의 중복 사례가 확보될 때까지 기다리면 추출해야 할 공통점과 차이점을 정확히 파악하기 쉬워져 섣부른 추상화로 인한 위험을 예방할 수 있다 [3, 11].
---
*Last updated: 2026-05-03*