final ํค์๋๋ฅผ ์ฌ์ฉํ๋ ์ด์
final ํค์๋๋ฅผ ์๊ธฐ ์ํด์๋ ์์ ๊ฐ๋ ์ ๋จผ์ ์ง๊ณ ๋์ด๊ฐ์ผ ํฉ๋๋ค.
๐ ์์(Inheritance)
์์์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์ ํต์ฌ ๊ฐ๋ ์ค ํ๋์ ๋๋ค.
Swift์์๋ ํด๋์ค(class)๋ง ์์์ด ๊ฐ๋ฅํ๋ฉฐ, ๊ตฌ์กฐ์ฒด(struct)๋ ์ด๊ฑฐํ(enum)์ ์์์ ์ง์ํ์ง ์์ต๋๋ค.
์ฆ, ๊ธฐ์กด ํด๋์ค์ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ ๋ฌผ๋ ค๋ฐ์ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋ฐ๋ก ์์์ ๋๋ค!
class Developer {
func introduce() {
print("์ ๋ iOS ๊ฐ๋ฐ์์
๋๋ค.")
}
}
class Zero: Developer {
func coding() {
print("๋ง๊ฑธ๋ฆฌ์กฐ ํ์ดํ
!")
}
}
let ze = Zero()
ze.introduce() // ์ถ๋ ฅ: ์ ๋ iOS ๊ฐ๋ฐ์์
๋๋ค.
ze.coding() // ์ถ๋ ฅ: ๊ณต๋ถ ํ์ดํ
!
์ ์์์์ Zero ํด๋์ค๋ Developer๋ฅผ ์์๋ฐ์์ต๋๋ค.
๋๋ถ์ Developer์ introduce() ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋๊ฑฐ์ฃ !
๋ฉ์๋ ์ฌ์ ์(Override)
์์๋ฐ์ ๊ธฐ๋ฅ์ ์์ ํ๊ฑฐ๋ ์์ ์๊ฒ ๋ง๊ฒ ๋์์ํค๊ณ ์ถ์ ๋๋
override ํค์๋๋ฅผ ์ฌ์ฉํด ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์(override) ํฉ๋๋ค.
class iOSTeamMember: Developer {
override func introduce() {
print("์ ๋ ์์ ๊ฐ๋ฐ์์
๋๋ค.")
}
}
let member = iOSTeamMember()
member.introduce() // ์ถ๋ ฅ: ์ ๋ ์์ ๊ฐ๋ฐ์์
๋๋ค.
์ด์ฒ๋ผ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ์ฐ์ง ์๊ณ ,
ํ๋ก์ ํธ๋ ์ญํ ์ ๋ง๊ฒ ๋ฎ์ด์ธ ์ ์๋ ๊ฒ์ด override์ ํต์ฌ์ ๋๋ค.
๐ final ํค์๋์ ์ญํ
๊ทธ๋ผ ์ด์ ์ค๋์ ์ฃผ์ ์ธ final ํค์๋์ ์ญํ ์ ๋ํด ์์๋ด ์๋ค!
final ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์์๊ณผ ์ฌ์ ์๋ฅผ ๋ชจ๋ ๋ง์ ์ ์์ต๋๋ค.
์ฆ, ๋ ์ด์ ํ์ ํด๋์ค๊ฐ ์๊ธฐ๊ฑฐ๋ ์ค๋ฒ๋ผ์ด๋๋๋ ์ผ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
// final ํด๋์ค ์์
final class School {
func welcome() {
print("์ ํ๊ธฐ๊ฐ ์์๋์์ต๋๋ค!")
}
}
// โ ์ค๋ฅ: 'School' ํด๋์ค๋ final์ด๋ผ ์์ ๋ถ๊ฐ๋ฅ
// class MySchool: School { }
// final ๋ฉ์๋ ์์
class Student {
final func study() {
print("์ด์ฌํ ๊ณต๋ถ ์ค์
๋๋ค ๐")
}
}
// โ ์ค๋ฅ: 'study()' ๋ฉ์๋๋ final์ด๋ผ ์ฌ์ ์ ๋ถ๊ฐ๋ฅ
// class HighSchoolStudent: Student {
// override func study() { print("๊ฒ์ํ๋ค๊ฐ ๊ณต๋ถ ์์!") }
// }
์ ์ฝ๋์ฒ๋ผ final์ ๋ถ์ด๋ฉด “๋ ์ด์ ๋ณ๊ฒฝ๋๋ฉด ์ ๋๋ ํด๋์ค๋ ๋ฉ์๋”๋ฅผ ๋ช ํํ๊ฒ ํ์ํ ์ ์์ต๋๋ค.
์ด๋ก์จ ์ฝ๋ ๊ตฌ์กฐ๊ฐ ์์ ๋๊ณ , ์์ธก ๋ถ๊ฐ๋ฅํ ์์ ์ผ๋ก ์ธํ ์ค๋ฅ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๐ ์ธ์ final์ ์ฌ์ฉํ ๊น?
| ํ์ ํด๋์ค๊ฐ ํ์ ์๋ ํด๋์ค | ๋ ์ด์ ์์ ๊ตฌ์กฐ๊ฐ ํ์ฅ๋์ง ์์๋ ๋๋ ๊ฒฝ์ฐ |
| ๊ธฐ๋ฅ์ด ๋ณ๊ฒฝ๋๋ฉด ์ ๋๋ ๋ฉ์๋ | ์ค์ํ ๋ก์ง์ ๋ณดํธํ๊ณ ์ถ์ ๋ |
| ์ํคํ ์ฒ์ ์ผ๋ก ๋ ๋ฆฝ๋ ๋ชจ๋ | ์: ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง, ๊ณตํต ์ ํธ ํด๋์ค ๋ฑ |
| ํ ๋ด ๊ณต์ฉ ๊ธฐ๋ฐ ์ฝ๋ | ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ์ ๊ทผํ๋๋ผ๋ ๊ตฌ์กฐ๊ฐ ๊นจ์ง์ง ์๋๋ก ๋ฐฉ์ง |
์๋ฅผ ๋ค์ด, ์ ๊ฐ ์์ฑํ AppManager ํด๋์ค๊ฐ ์ฑ ์ ์ฒด์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ค๋ฉด,
ํด๋น ํด๋์ค๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์์๋ก ์์ ํ๊ฑฐ๋ ์์๋ฐ์ง ๋ชปํ๊ฒ final๋ก ์ ์ธํ๋ ๊ฒ์ด ์ข๊ฒ ์ฃ ?
final ํค์๋์ ์ฑ๋ฅ์ ์ด์
final์ ๋จ์ํ ์์ ๊ธ์ง๋ฅผ ์ํ ๋๊ตฌ๊ฐ ์๋๋ผ, ์ฑ๋ฅ ํฅ์์๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
๊ทธ ์ด์ ๋ Swift์ Dynamic Dispatch(๋์ ๋์คํจ์น) ๋์ ๋ฐฉ์๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
๐ Dynamic Dispatch๋?
Swift์์ ํด๋์ค์ ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐํ์ ์์ ์ ํธ์ถ ๋์์ด ๊ฒฐ์ ๋ฉ๋๋ค.
์ฆ, ์ด๋ค ํ์ ํด๋์ค๊ฐ ์ค์ ๋ก ์ด ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋์ง ํ์ธํด์ผ ํ๋ฏ๋ก, ์ปดํ์ผ ์์ ์๋ ์ ํํ ํธ์ถ ๋์์ ๋ชจ๋ฆ ๋๋ค.
์ด๋ฐ ๋ฐฉ์์ Dynamic Dispatch๋ผ๊ณ ํฉ๋๋ค.
class Base {
func sayHello() {
print("๊ธฐ๋ณธ ์ธ์ฌ")
}
}
class Sub: Base {
override func sayHello() {
print("ํ์ ํด๋์ค ์ธ์ฌ")
}
}
let base: Base = Sub()
base.sayHello() // ์ค์ ์ถ๋ ฅ: ํ์ ํด๋์ค ์ธ์ฌ
Swift๋ sayHello()๋ฅผ ํธ์ถํ๊ธฐ ์ , ๊ฐ์ฒด๊ฐ Base๊ฐ ์๋ Sub ํ์
์ธ์ง ๋ฐํ์์์ ํ์ธํด์ผ ํฉ๋๋ค.
→ ์ฆ, ๊ฐ์ ํธ์ถ(indirect call) ์ด ์ผ์ด๋ฉ๋๋ค.
๐ final๋ก ์ธํ ์ต์ ํ
ํ์ง๋ง ๋ง์ฝ sayHello()๊ฐ final์ด๋ผ๋ฉด,
Swift ์ปดํ์ผ๋ฌ๋ “์ด ํจ์๋ ์ฌ์ ์๋ ์ ์๋ค”๋ ์ฌ์ค์ ์ด๋ฏธ ์๊ณ ์์ต๋๋ค.
class Base {
final func sayHello() {
print("๊ธฐ๋ณธ ์ธ์ฌ - ๋ณ๊ฒฝ ๋ถ๊ฐ")
}
}
let obj = Base()
obj.sayHello() // ์ปดํ์ผ๋ฌ๊ฐ ์ง์ ํธ์ถ ๊ฐ๋ฅ
์ด ๊ฒฝ์ฐ Dynamic Dispatch๊ฐ ํ์ ์์ผ๋ฏ๋ก, ์ปดํ์ผ๋ฌ๋ Static Dispatch(์ ์ ๋์คํจ์น) ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
์ฆ, ์ปดํ์ผ ์์ ์ ํจ์ ์ฃผ์๋ฅผ ๋ฐ๋ก ๊ฒฐ์ ํ๋ฏ๋ก ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค.
'๐ถ๐ข๐ฆ > ๐ iOS ๊ฐ๋ ํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [iOS / Swift] Equatable, Hashable, Comparable (0) | 2025.11.05 |
|---|---|
| [iOS / Swift] Enum์ด๋? (2) | 2025.11.04 |
| [iOS / Swift] Optional์ด๋? (1) | 2025.10.16 |
| [iOS / Swift] ์๋ช ์ฃผ๊ธฐ(Life Cycle)๋? (0) | 2025.10.16 |
| [iOS / Swift] ์ ๊ทผ ์ ์ด์(Access Control Levels) (0) | 2025.10.16 |