์ค์ํํธ์์ Extension์ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์?
Swift์์ Extension์ Class, Struct, Enum, Protocol ํ์ ์ ๋ฉ์๋๋ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. Extension ๊ท์น์ ์ ์ฅ ํ๋กํผํฐ๋ ์ถ๊ฐํ ์ ์๊ณ , ์ฐ์ฐ ํ๋กํผํฐ๋ง ์ถ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๋ํ, ์๋ฉธ์๋ ์ถ๊ฐํ ์ ์๊ณ , ์์ฑ์๋ convenience init ๋ง ์ ์ํ ์ ์์ต๋๋ค.
๐ ๊ธฐ๋ฅ ํ์ฅ ๊ด์ ์์์ Extension
์ฐ๋ฆฌ๊ฐ ํํ ๊ธฐ๋ฅ์ ํ์ฅ์ ํ ๋์๋ ์์์ ์ฌ์ฉํด์ ํ๊ฒ ๋๋๋ฐ, ์ด๋ฌํ ์์ง์ ํ์ฅ์ ๊ฒฐํฉ๋๊ฐ ๋์์ ธ ์์ ํด๋์ค์ ๊ตฌํ์ด๋ ๋ณ๊ฒฝ์ด ํ์ ํด๋์ค์ ์ํฅ์ ๋ผ์น๋ฏ๋ก ์บก์ํ๋ฅผ ํด์น ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
์๋ ์ฝ๋๋ ์์์ผ๋ก ๊ธฐ๋ฅ ํ์ฅ์ ํ์ ์ ์บก์ํ๋ฅผ ํด์น๋ ์ฝ๋ ์์์ ๋๋ค.
class S {
var array = [Int]()
func add(_ element: Int) { array.append(element) }
func addAll(_ elements: [Int]) {
elements.forEach { self.add($0) }
}
}
class SS: S {
var count = 0
override func add(_ e: Int) {
count += 1
super.add(e)
}
override func addAll(_ es: [Int]) {
count += es.count
super.addAll(es)
}
}
let ss = SS()
ss.addAll([1, 2, 3])
print(ss.count) // ?
์ ์ฝ๋๋ฅผ ์คํํ๋ฉด 3 ์๋ 6์ด ์ถ๋ ฅ๋ฉ๋๋ค. ์ด๋ ๊ฒ ์๋์น ์๊ฒ ์ธ๋ถ(๋ถ๋ชจ ํด๋์ค)์์ ์์ ์ ์ํ(count ํ๋กํผํฐ)๊ฐ ๋ณ๊ฒฝ๋๋ฏ๋ก ์บก์ํ๊ฐ ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ๋ชปํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
Swift๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ ์์์ ์ํ ์์ง์ ํ์ฅ ๋์ ์ฌ์ฉํ ์ ์๋ ์ํ์ ํ์ฅ์ ํ ์ ์๋ Extension์ ์ ๊ณตํด ์ค๋๋ค.
์ค์ํํธ์์ ์ถ์ ํด๋์ค๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
Swift๋ ์ถ์ ํด๋์ค ๋ฌธ๋ฒ์ ์ง์ํ์ง๋ ์์ง๋ง, ์ถ์ ํด๋์ค์ ๋์ผํ ๋์์ ํ๋๋ก ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํฉ๋๋ค.
๐ ํ๋กํ ์ฝ๊ณผ extension์ ํ์ฉ
protocol Vehicle {
func start()
func beep()
func stop()
}
extension Vehicle {
func start() {
print("Starting the vehicle.")
}
func stop() {
print("Stopping the vehicle.")
}
}
class Car: Vehicle {
func beep() {
print("beep~~~!")
}
}
var car = Car()
car.beep() // beep~~~!
car.stop() // Stopping the vehicle.
๐ ์์๊ณผ fatalError๋ฅผ ํ์ฉ
class BaseClass {
func someMethod1() {
print("someMethod1 called.")
}
func someMethod2() {
fatalError("This method must be overridden")
}
}
class SubClass: BaseClass {
override func someMethod2() {
print("Implemented in SubClass")
}
}
var sub = SubClass()
sub.someMethod1() // someMethod1 called.
sub.someMethod2() // Implemented in SubClass
๐จ ์ถ์ ํด๋์ค๋?
์ถ์ ํด๋์ค๋ ์ถ์ ๋ฉ์๋, ์ฆ ์ ์ธ๋ถ๋ง ์กด์ฌํ๊ณ ๊ตฌํ ์ฝ๋๊ฐ ์๋ ๋ฉ์๋๊ฐ ํ๋๋ผ๋ ์๋ ํด๋์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ์ถ์ ํด๋์ค์ ํน์ ํํ์ธ ์ธํฐํ์ด์ค๋ ์กด์ฌํ๋๋ฐ, ์ธํฐํ์ด์ค๋ ๋ชจ๋ ๋ฉ์๋๊ฐ ๋ค ์ถ์ ๋ฉ์๋์ธ ํํ๋ฅผ ์๋ฏธํฉ๋๋ค.
๐จ ์ถ์ ํด๋์ค์ ๋ชฉ์
์ถ์ ํด๋์ค๋ ์์์ ํตํ ๊ธฐ๋ฅ ํ์ฅ์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํด๋์ค์ ๋๋ค. ๊ตฌ์ฒดํ ๋ฉ์๋๊ฐ ์๋ ์ถ์ ๋ฉ์๋๋ฅผ ํตํด ์ผ๋ฐ ํด๋์ค๋ฅผ ์์ํ๋ ๊ฒ๋ณด๋ค ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์์ต๋๋ค. ํํธ, ์ธํฐํ์ด์ค๋ ์์์ ํตํ ๊ธฐ๋ฅ ํ์ฅ์ ๋ชฉ์ ๋ณด๋ค ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์ฑํํ ๊ฐ์ฒด๋ค์ ๋์ผํ ์ฌ์ฉ๋ฐฉ๋ฒ๊ณผ ๋์์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ชฉ์ ์ ๋๋ค.
Swift์์๋ Protocol์ ํตํด ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค ๊ฐ๋ ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ์ด์ค์ฒ๋ผ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๊ณ , ์ถ์ ํด๋์ค์ฒ๋ผ extension์ ํตํด ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
Extension์ ๋ฉ์๋๋ฅผ Override ํ ์ ์์๊น์?
Swift์ Extension์ ์๋ก์ด ๋ฉ์๋, ์ฐ์ฐ ํ๋กํผํฐ, ์์ฑ์(convenience init)๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง ๋ฉ์๋๋ฅผ override ํ ์๋ ์์ต๋๋ค. ํ์ง๋ง, @objc dynamic ํค์๋๊ฐ ๋ถ์ ๋ฉ์๋์ ๊ฒฝ์ฐ Table Dispatch๊ฐ ์๋ Objective-C์ Message Dispatch ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ extension์์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๊ฐ๋ฅํด์ง๋๋ค. ํ์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก Swift ๊ณต์๋ฌธ์์์๋ Extension์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํ ๊ฒ์์ ์ธ๊ธํ๊ณ ์์ผ๋ฏ๋ก extension์ ํตํ ์ค๋ฒ๋ผ์ด๋ฉ์ ์ง์ํด์ผ ํฉ๋๋ค.
class A {
@objc dynamic func something() {
print("something")
}
}
class AA: A {}
extension AA {
override func something() {
print("SOMETHING")
}
}
let a = AA()
a.something() // SOMETHING
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ARC (1) | 2024.10.30 |
---|---|
[Swift] Objective-C (1) | 2024.10.28 |
[Swift] - ์ฝ๋ ์ ํ์ (Collection Types) (0) | 2024.10.27 |
[Swift] - ๊ธฐ๋ณธ ์ฐ์ฐ์ (Basic Operators) (0) | 2024.10.26 |
[Swift] - ๋ฌธ์์ด๊ณผ ๋ฌธ์ (Strings and Characters) (0) | 2024.10.25 |
๋๊ธ