# [[Pull Up Method]] ## πŸ“Œ Brief Summary Pull Up Method(λ©”μ„œλ“œ 올리기)λŠ” ν˜•μ œ ν•˜μœ„ 클래슀(sibling classes)듀에 μ€‘λ³΅μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” λ™μΌν•œ λ©”μ„œλ“œλ₯Ό λΆ€λͺ¨ 클래슀(superclass)둜 λŒμ–΄μ˜¬λ € μ€‘μ•™μ§‘μ€‘ν™”ν•˜λŠ” λ¦¬νŒ©ν† λ§ 기법이닀 [1], [2]. 이 기법은 μ½”λ“œ 쀑볡을 μ œκ±°ν•˜μ—¬ λΆˆν•„μš”ν•œ λ…Έλ ₯을 쀄이고, ν•œμͺ½ λ©”μ„œλ“œλ§Œ μˆ˜μ •λ˜μ–΄ λ°œμƒν•  수 μžˆλŠ” 잠재적 버그λ₯Ό μ˜ˆλ°©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€ [1], [3]. μžμ‹ ν΄λž˜μŠ€λ“€μ΄ μ™„μ „νžˆ λ™μΌν•œ 본문을 κ°€μ§„ λ©”μ„œλ“œλ₯Ό κ³΅μœ ν•  λ•Œ κ°€μž₯ μ§κ΄€μ μœΌλ‘œ μ μš©ν•  수 μžˆλŠ” μΌλ°˜ν™”(Generalization) λ¦¬νŒ©ν† λ§ 쀑 ν•˜λ‚˜μ΄λ‹€ [4], [5]. ## πŸ“– Core Content * **적용 동기:** μ—¬λŸ¬ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ λ™μΌν•œ λ™μž‘μ„ μˆ˜ν–‰ν•˜λŠ” 두 λ©”μ„œλ“œκ°€ κ·ΈλŒ€λ‘œ 방치될 경우 ν–₯ν›„ λ²„κ·Έμ˜ μ˜¨μƒμ΄ 될 수 μžˆλ‹€ [3]. μ€‘λ³΅λœ λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•˜λ©΄ μ½”λ“œ μˆ˜μ • μ‹œ ν•œμͺ½λ§Œ λ³€κ²½ν•˜κ³  λ‹€λ₯Έ ν•˜λ‚˜λŠ” λ³€κ²½ν•˜μ§€ μ•Šκ³  λˆ„λ½ν•  μœ„ν—˜μ΄ 있기 λ•Œλ¬Έμ— 이λ₯Ό 슈퍼클래슀둜 올렀 단일화해야 ν•œλ‹€ [3]. λ˜ν•œ, ν•˜μœ„ 클래슀의 λ©”μ„œλ“œκ°€ μƒμœ„ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜(override)ν•˜λ©΄μ„œ μ‹€μ œλ‘œλŠ” λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” νŠΉμˆ˜ν•œ κ²½μš°μ—λ„ 이 기법이 ν•„μš”ν•˜λ‹€ [6]. * **μ‹€ν–‰ 절차:** 1. ν˜•μ œ 클래슀 κ°„μ˜ λ©”μ„œλ“œλ₯Ό κ²€μ‚¬ν•˜μ—¬ 두 λ©”μ„œλ“œμ˜ κ΅¬ν˜„μ΄ μ •λ§λ‘œ μ™„λ²½ν•˜κ²Œ λ™μΌν•œμ§€ 확인 및 λΆ„μ„ν•œλ‹€ [1], [7]. λ§Œμ•½ μ‹œκ·Έλ‹ˆμ²˜κ°€ λ‹€λ₯΄λ‹€λ©΄ μŠˆνΌν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•  ν˜•νƒœλ‘œ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μΌμΉ˜μ‹œν‚¨λ‹€ [7]. 2. λΆ€λͺ¨ ν΄λž˜μŠ€μ— μƒˆλ‘œμš΄ λ©”μ„œλ“œλ₯Ό μƒμ„±ν•œ ν›„, 쀑볡 λ©”μ„œλ“œμ˜ 본문을 λ³΅μ‚¬ν•˜μ—¬ λΆ™μ—¬λ„£κ³  μ‘°μ •ν•œλ‹€ [1], [7]. ν•„μš”ν•˜λ‹€λ©΄ κ°€μ‹œμ„±(visibility)을 `protected`둜 λ³€κ²½ν•œλ‹€ [1]. 3. ν•˜μœ„ ν΄λž˜μŠ€λ“€μ—μ„œ μ€‘λ³΅λœ λ©”μ„œλ“œ κ΅¬ν˜„μ„ μ‚­μ œν•˜κ³  μ½”λ“œλ₯Ό 컴파일 및 ν…ŒμŠ€νŠΈν•œλ‹€ [1], [8]. 4. 였직 슈퍼클래슀의 λ©”μ„œλ“œλ§Œ 남을 λ•ŒκΉŒμ§€ λͺ¨λ“  ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ‚­μ œν•˜κ³  ν…ŒμŠ€νŠΈν•˜λŠ” 과정을 λ°˜λ³΅ν•œλ‹€ [8]. * **κ΄€λ ¨ κΈ°λ²•μ˜ ν™œμš©:** 두 λ©”μ„œλ“œκ°€ λΉ„μŠ·ν•˜μ§€λ§Œ μ™„μ „νžˆ κ°™μ§€ μ•Šμ€ κ²½μš°μ—λŠ” 'λ©”μ„œλ“œ 올리기'λ₯Ό λ°”λ‘œ μ μš©ν•  수 μ—†λ‹€ [7]. 이럴 λ•ŒλŠ” λ¨Όμ € 'μ•Œκ³ λ¦¬μ¦˜ μ „ν™˜(Substitute Algorithm)'μ΄λ‚˜ 'ν…œν”Œλ¦Ώ λ©”μ„œλ“œ ν˜•μ„±(Form Template Method)'을 μ‚¬μš©ν•˜μ—¬ 차이점을 λΆ„λ¦¬ν•˜κ³  곡톡점을 μΆ”μΆœν•˜λŠ” μž‘μ—…μ΄ μ„ ν–‰λ˜μ–΄μ•Ό ν•œλ‹€ [7]. ## βš–οΈ Trade-offs & Caveats * **ν•˜μœ„ 클래슀 쒅속성 문제:** 'λ©”μ„œλ“œ 올리기'λ₯Ό μ μš©ν•  λ•Œ κ°€μž₯ 닀루기 κΉŒλ‹€λ‘œμš΄ 뢀뢄은 λŒμ–΄μ˜¬λ¦¬λ €λŠ” λ©”μ„œλ“œμ˜ 본문이 μŠˆνΌν΄λž˜μŠ€μ—λŠ” μ—†κ³  ν•˜μœ„ ν΄λž˜μŠ€μ—λ§Œ μ‘΄μž¬ν•˜λŠ” κΈ°λŠ₯(λ©”μ„œλ“œλ‚˜ ν•„λ“œ)을 μ°Έμ‘°ν•˜λŠ” κ²½μš°μ΄λ‹€ [6]. * **ν•˜μœ„ λ©”μ„œλ“œ μ°Έμ‘° μ‹œ μ œμ•½:** λŒμ–΄μ˜¬λ¦° λ©”μ„œλ“œκ°€ ν•˜μœ„ ν΄λž˜μŠ€μ—λ§Œ μ‘΄μž¬ν•˜λŠ” λ‹€λ₯Έ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 경우, ν•΄λ‹Ή λ©”μ„œλ“œλ„ ν•¨κ»˜ μΌλ°˜ν™”ν•˜μ—¬ λŒμ–΄μ˜¬λ¦¬κ±°λ‚˜ μŠˆνΌν΄λž˜μŠ€μ— 좔상 λ©”μ„œλ“œ(abstract method)둜 μ„ μ–Έν•΄μ•Όλ§Œ μ •μƒμ μœΌλ‘œ 컴파일되고 λ™μž‘ν•  수 μžˆλ‹€ [6], [8]. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ©”μ„œλ“œμ˜ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ λ³„λ„μ˜ μœ„μž„(delegating) λ©”μ„œλ“œλ₯Ό λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” λ³΅μž‘ν•¨μ΄ 수반될 수 μžˆλ‹€ [6]. * **ν•˜μœ„ ν•„λ“œ μ°Έμ‘° μ‹œ μ œμ•½:** λŒμ–΄μ˜¬λ¦° λ©”μ„œλ“œκ°€ ν•˜μœ„ 클래슀의 νŠΉμ • ν•„λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 경우라면, 'ν•„λ“œ 올리기(Pull Up Field)'λ‚˜ 'ν•„λ“œ μžκ°€ μΊ‘μŠν™”(Self Encapsulate Field)'λ₯Ό μ μš©ν•΄μ•Ό ν•˜λ©°, μŠˆνΌν΄λž˜μŠ€μ— μΆ”μƒν™”λœ getter λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜μ—¬ μ ‘κ·Όν•΄μ•Ό ν•˜λŠ” ꡬ쑰적 μ œμ•½μ΄ λ”°λ₯Έλ‹€ [8]. --- *Last updated: 2026-05-03*