# [[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*