λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/Swift

[Swift] final ν‚€μ›Œλ“œλŠ” μ–Έμ œ μ‚¬μš©ν• κΉŒ?

by Danna 2021. 12. 12.
728x90
728x90

Swift μ—μ„œλŠ” λ‹€λ₯Έ 언어와 λΉ„μŠ·ν•˜κ²Œ 클래슀λ₯Ό 상속해 μ„œλΈŒν΄λž˜μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μžˆμ–΄μš”. λ§Œμ•½, ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ 더이상 상속이 ν•„μš”μ—†κ±°λ‚˜ νŠΉμ • 속성은 μ˜€λ²„λΌμ΄λ“œν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒμš”?! πŸ‘€

 

final ν‚€μ›Œλ“œλ₯Ό 톡해 더 이상 상속이 ν•„μš”μ—†μŒμ„ λͺ…μ‹œν•  수 있고, μ˜€λ²„λΌμ΄λ“œ ν•  μ‹œ 컴파일 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€! λͺ…μ‹œμ μœΌλ‘œ μƒμ†λ˜μ§€ μ•ŠλŠ” 것 외에 λŸ°νƒ€μž„ μ„±λŠ₯이 ν–₯μƒλœλ‹€λŠ” μž₯점도 μžˆλ‹€κ³  ν•΄μš”.


πŸ‘€ Swift λ¬Έμ„œμ—μ„œλŠ” λ‹€μŒκ³Ό 같이 μ„€λͺ…ν•˜κ³  μžˆμ–΄μš”!

μ„œλΈŒν΄λž˜μŠ€μ—μ„œ νŠΉμ • method, property, subscript κ°€ μ˜€λ²„λΌμ΄λ“œ λ˜μ§€ μ•Šλ„λ‘ ν•˜κΈ°μœ„ν•΄μ„œ final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. final ν‚€μ›Œλ“œλ₯Ό 뢙인 method, property, subscript λ₯Ό μ„œλΈŒν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ“œν•˜λ©΄, μ»΄νŒŒμΌνƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. class 전체에 λŒ€ν•΄ final ν‚€μ›Œλ“œλ₯Ό λΆ™μ΄λŠ” 경우, μ„œλΈŒν΄λž˜μŠ€λ₯Ό λ§Œλ“œλ €κ³  ν•˜λ©΄ μ»΄νŒŒμΌνƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

final class, final var, final func, final class func, and final subscript 

 

πŸ‘‰[Swift Docs] Inheritance - Preventing Overrides

 


πŸ€” final ν‚€μ›Œλ“œλ‘œ λŸ°νƒ€μž„ μ„±λŠ₯ ν–₯상?

 

final ν‚€μ›Œλ“œλ‘œ μΈν•œ μ„±λŠ₯ 비ꡐλ₯Ό μœ„ν•΄μ„œλŠ” Dynamic Dispatch, Static Dispatch 에 λŒ€ν•΄ λ¨Όμ € μ•Œμ•„μ•Όν•©λ‹ˆλ‹€ πŸ‘€.. Dispatch λŠ” μ–΄λ–€ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν• μ§€ κ²°μ •ν•˜κ³ , μ‹€ν–‰ν•˜λŠ” λ§€μ»€λ‹ˆμ¦˜μ΄μ—μš”. λŒ€ν‘œμ μΈ 두가지 Static Dispatch, Dynamic Dispatch에 λŒ€ν•΄ μ •λ¦¬ν•΄λ³Όκ²Œμš”.

 

βœ”οΈŽ Static Dispatch (Direct Call) 

컴파일 νƒ€μž„μ— μ‹€μ œ ν˜ΈμΆœν•  ν•¨μˆ˜λ₯Ό κ²°μ •ν•˜λŠ” λ°©μ‹μœΌλ‘œ, ν•¨μˆ˜ 호좜이 κ°„λ‹¨ν•˜κ³  속도가 λΉ λ¦…λ‹ˆλ‹€. Value type 인 ꡬ쑰체와 μ—΄κ±°ν˜•μ„ 기본적으둜 μ˜€λ²„λΌμ΄λ”©λ˜μ§€ μ•ŠμœΌλ―€λ‘œ Static Dispatch λ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.

 

βœ”οΈŽ Dynamic Dispatch (Indirect Call)

λŸ°νƒ€μž„μ— 호좜될 ν•¨μˆ˜λ₯Ό κ²°μ •ν•˜λŠ” λ°©μ‹μœΌλ‘œ, ν•¨μˆ˜ 호좜 κ³Όμ •μ—μ„œ μ‹€μ œ μ°Έμ‘°ν•  μš”μ†Œλ₯Ό μ°ΎλŠ” 과정이 μžˆμ–΄ Static 에 λΉ„ν•΄ 속도가 λŠλ¦½λ‹ˆλ‹€. ν΄λž˜μŠ€λ§ˆλ‹€ ν•¨μˆ˜ ν¬μΈν„°λ“€μ˜ 배열인 vtable(Virtual Dispatch Table) 을 κ°–κ³  있으며, 이λ₯Ό μ°Έμ‘°ν•΄ μ‹€μ œ ν˜ΈμΆœν•  ν•¨μˆ˜λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€. 

 

⁉️ 클래슀λ₯Ό μƒμ†ν•΄μ„œ λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•œλ‹€λ©΄, μ»΄νŒŒμΌλŸ¬κ°€ μ‹€μ œ ν˜ΈμΆœν•  λ©”μ†Œλ“œλ₯Ό μ–΄λ–»κ²Œ κ²°μ •ν•˜κ²Œ λ κΉŒμš”?

Swift 의 ν΄λž˜μŠ€λŠ” 일반적으둜 Dynamic Dispatch 방식을 μ΄μš©ν•΄ λŸ°νƒ€μž„μ‹œ μ–΄λ–€ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  지 κ²°μ •ν•œλ‹€κ³  ν•΄μš”.

 

⁉️ λ§Œμ•½ μ˜€λ²„λΌμ΄λ“œκ°€ ν•„μš”ν•˜λ‹€λ©΄ μœ„μ˜ 과정이 ν•„μš”ν•˜κ² μ§€λ§Œ, μ˜€λ²„λΌμ΄λ“œκ°€ ν•„μš”μ—†λŠ” λ©”μ†Œλ“œλΌλ©΄!?

final ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬ Dynamic Dispatch 과정이 ν•„μš” μ—†μŒμ„ λͺ…μ‹œν•΄μ€„ 수 있겠죠! ν•΄λ‹Ή ν‚€μ›Œλ“œλ₯Ό 뢙인 λ©”μ†Œλ“œλŠ” Static Dispatch λ₯Ό μ‚¬μš©ν•΄ 컴파일 νƒ€μž„μ— ν˜ΈμΆœν•  λ©”μ†Œλ“œλ₯Ό μ§€μ •ν•¨μœΌλ‘œ λŸ°νƒ€μž„ μ„±λŠ₯이 ν–₯μƒλ˜λŠ” κ²ƒμ΄μ—μš”.

 


πŸ‘ μ°Έκ³  링크

728x90
728x90