# [[Object Seam (객체 접점)]] ## πŸ“Œ Brief Summary 객체 접점(Object Seam)은 μ†ŒμŠ€ μ½”λ“œλ₯Ό 직접 μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘μ„ λ³€κ²½ν•˜κ±°λ‚˜ λŒ€μ²΄ν•  수 μžˆλŠ” μ½”λ“œ λ‚΄μ˜ νŠΉμ • 지점을 μ˜λ―Έν•œλ‹€ [1-3]. 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ ν™œμš©ν•  수 μžˆλŠ” κ°€μž₯ λͺ…μ‹œμ μ΄κ³  μœ μš©ν•œ 접점 μœ ν˜•μœΌλ‘œ, λ‹€ν˜•μ„±(Polymorphism)μ΄λ‚˜ 상속을 μ΄μš©ν•˜μ—¬ μ‹€μ œ μ‹€ν–‰λ˜λŠ” κ°μ²΄λ‚˜ λ©”μ„œλ“œλ₯Ό μ™ΈλΆ€μ—μ„œ μ œμ–΄ν•  수 있게 ν•΄μ€€λ‹€ [4, 5]. λ ˆκ±°μ‹œ μ‹œμŠ€ν…œμ„ λ¦¬νŒ©ν† λ§ν•  λ•Œ κΈ°μ‘΄ μ˜μ‘΄μ„±μ„ λŠμ–΄λ‚΄κ³  κ°€μ§œ 객체(Mock)λ₯Ό μ£Όμž…ν•˜μ—¬ μ•ˆμ „ν•œ ν…ŒμŠ€νŠΈ ν™˜κ²½μ„ ν™•λ³΄ν•˜λŠ” 핡심 μˆ˜λ‹¨μœΌλ‘œ μ‚¬μš©λœλ‹€ [1, 3, 6]. ## πŸ“– Core Content * **접점(Seam)κ³Ό ν™œμ„±ν™” 지점(Enabling Point)의 κ°œλ…** 접점은 μ½”λ“œλ₯Ό 직접 νŽΈμ§‘ν•˜μ§€ μ•Šκ³ λ„ ν•΄λ‹Ή μœ„μΉ˜μ—μ„œμ˜ λ™μž‘μ„ λ°”κΏ€ 수 μžˆλŠ” 곳을 λœ»ν•˜λ©°, λͺ¨λ“  μ ‘μ μ—λŠ” μ–΄λ–€ λ™μž‘μ„ μ‚¬μš©ν• μ§€ κ²°μ •ν•  수 μžˆλŠ” 'ν™œμ„±ν™” 지점(Enabling Point)'이 μ‘΄μž¬ν•œλ‹€ [7]. 객체 μ ‘μ μ—μ„œλŠ” 주둜 λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ λͺ©λ‘μ΄λ‚˜ 객체λ₯Ό μƒμ„±ν•˜λŠ” 지점이 ν™œμ„±ν™” 지점 역할을 ν•œλ‹€ [8, 9]. * **객체 μ ‘μ μ˜ μž‘λ™ 원리와 식별** 객체지ν–₯ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” λ©”μ„œλ“œ 호좜이 μ‹€μ œλ‘œ μ–΄λ–€ λ©”μ„œλ“œμ˜ μ‹€ν–‰μœΌλ‘œ μ΄μ–΄μ§ˆμ§€ κ³ μ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€ [4, 10]. 예λ₯Ό λ“€μ–΄ `cell.Recalculate();`λΌλŠ” μ½”λ“œλŠ” `cell`이 μ–΄λ–€ μΈμŠ€ν„΄μŠ€μΈμ§€μ— 따라 λ‹€λ₯΄κ²Œ λ™μž‘ν•œλ‹€ [10]. μ£Όλ³€ μ½”λ“œλ₯Ό λ°”κΎΈμ§€ μ•Šκ³  이 호좜의 λŒ€μƒμ„ λ°”κΏ€ 수 μžˆλ‹€λ©΄ 그것이 λ°”λ‘œ 객체 접점이닀 [10]. λ°˜λŒ€λ‘œ, λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ 직접 νŠΉμ • 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  λ°”λ‘œ μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λŠ” λŒ€μƒ 객체λ₯Ό λ°”κΏ€ 수 μ—†μœΌλ―€λ‘œ 접점이 μ•„λ‹ˆλ‹€ [11]. * **ν…ŒμŠ€νŠΈ 격리λ₯Ό μœ„ν•œ 객체 접점 생성 기법** * **λ§€κ°œλ³€μˆ˜ν™”:** λ‚΄λΆ€μ—μ„œ 직접 μƒμ„±ν•˜λ˜ 객체λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 전달받도둝(`buildMartSheet(Cell cell)`) μˆ˜μ •ν•˜λ©΄, 호좜 μ‹œ ν…ŒμŠ€νŠΈμš© 객체λ₯Ό λ„˜κ²¨μ€„ 수 μžˆλŠ” 접점이 ν˜•μ„±λœλ‹€ [12]. * **상속과 μ˜€λ²„λΌμ΄λ“œ(Override):** μ™ΈλΆ€ λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°μ΄λ‚˜ APIλ₯Ό ν˜ΈμΆœν•˜λŠ” λ¬Έμ œκ°€ λ˜λŠ” ν΄λž˜μŠ€κ°€ μžˆλ‹€λ©΄, 이λ₯Ό μƒμ†λ°›λŠ” ν…ŒμŠ€νŠΈμš© ν•˜μœ„ 클래슀λ₯Ό λ§Œλ“€μ–΄ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜κ±°λ‚˜ κ°€μ§œ 객체λ₯Ό μ£Όμž…ν•˜λ„λ‘ μ½”λ“œλ₯Ό λΉ„ν‹€ 수 μžˆλ‹€ [1, 3, 13]. * **정적(Static) λ©”μ„œλ“œ λ³€ν™˜:** 정적 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 뢀뢄은 본래 객체 접점이 μ•„λ‹ˆμ§€λ§Œ, `static` ν‚€μ›Œλ“œλ₯Ό μ œκ±°ν•˜κ³  `protected` λ“±μ˜ μ ‘κ·Ό μ œμ–΄μžλ‘œ λ°”κΎΈμ–΄ 가상(virtual) λ©”μ„œλ“œμ²˜λŸΌ λ§Œλ“€λ©΄ ν…ŒμŠ€νŠΈ μ‹œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ 접점화할 수 μžˆλ‹€ [14, 15]. * **객체지ν–₯ ν™˜κ²½μ—μ„œμ˜ ꢌμž₯μ„±** 객체 접점은 객체지ν–₯ μ–Έμ–΄μ—μ„œ κ°€μž₯ ꢌμž₯λ˜λŠ” 접근법이닀 [5]. Cλ‚˜ C++μ—μ„œ μ‚¬μš©ν•˜λŠ” μ „μ²˜λ¦¬(Preprocessing) μ ‘μ μ΄λ‚˜ 링크(Link) 접점도 μ‘΄μž¬ν•˜μ§€λ§Œ, 객체 접점이 훨씬 λͺ…μ‹œμ μ΄λ©° 이에 μ˜μ‘΄ν•˜λŠ” ν…ŒμŠ€νŠΈκ°€ μœ μ§€λ³΄μˆ˜ν•˜κΈ° 더 쉽기 λ•Œλ¬Έμ΄λ‹€ [5]. ## βš–οΈ Trade-offs & Caveats * **우회(Indirection)둜 μΈν•œ ꡬ쑰적 λΆ€μžμ—°μŠ€λŸ¬μ›€:** κΈ°μ‘΄ μ½”λ“œλ₯Ό κ±΄λ“œλ¦¬μ§€ μ•Šκ³  λ™μž‘μ„ λ³€κ²½ν•  수 있게 ν•˜λ €λ©΄ κ²°κ΅­ ν™œμ„±ν™” 지점을 λ§Œλ“€κΈ° μœ„ν•΄ μ½”λ“œ ꡬ쑰λ₯Ό μ•½κ°„ λΉ„ν‹€κ±°λ‚˜ κ°„μ ‘ν™”(Indirection)ν•΄μ•Ό ν•œλ‹€ [15, 16]. 정적 λ©”μ„œλ“œλ₯Ό μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ‘œ λ°”κΎΈκ±°λ‚˜ ν•˜μœ„ 클래슀λ₯Ό μ–΅μ§€λ‘œ λ§Œλ“œλŠ” λ“±μ˜ 과정이 λ‹€μ†Œ 간접적이고 λΆ€μžμ—°μŠ€λŸ½κ²Œ 느껴질 수 μžˆλ‹€ [15]. * **λ ˆκ±°μ‹œ ν™˜κ²½μ—μ„œμ˜ ν˜„μ‹€μ  νƒ€ν˜‘:** λ§ˆμŒμ— λ“€μ§€ μ•ŠλŠ” μ˜μ‘΄μ„±μ„ μ†ŒμŠ€ μ½”λ“œμ—μ„œ 직접 μ‚­μ œν•˜κ±°λ‚˜ ν†΅μ§Έλ‘œ 고치고 싢을 수 μžˆμ§€λ§Œ, ν…ŒμŠ€νŠΈκ°€ μ™„λΉ„λ˜μ§€ μ•Šμ€ 엉망인 λ ˆκ±°μ‹œ μ½”λ“œμ—μ„œλŠ” κ·Έ 자체둜 κ±°λŒ€ν•œ μœ„ν—˜μ„ μ΄ˆλž˜ν•œλ‹€ [15]. λ”°λΌμ„œ 이상적이고 μ™„λ²½ν•œ μ„€κ³„λ‘œ ν•œ λ²ˆμ— κ°€λ €κ³  ν•˜κΈ°λ³΄λ‹€λŠ”, λ‹€μ†Œ μš°νšŒμ μΌμ§€λΌλ„ 객체 접점을 μ΄μš©ν•΄ ν…ŒμŠ€νŠΈλ₯Ό μ•ˆμ „ν•˜κ²Œ λ°°μΉ˜ν•  수 μžˆμ„ μ •λ„λ‘œλ§Œ μ½”λ“œλ₯Ό μ΅œμ†Œν•œμœΌλ‘œ νƒ€ν˜‘ν•˜κ³  μˆ˜μ •ν•˜λŠ” 것이 훨씬 λ°”λžŒμ§ν•˜λ‹€ [3, 15]. --- *Last updated: 2026-05-03*