์๋ ํ์ธ์!
์ค๋์ ํ์ฅ(Extension)์ ๋ํ ๊ณต๋ถ๋ฅผ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค!
ํ์ฅ์ด๋?
ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ, ํ๋กํ ์ฝ ๋ฑ์ ํ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ๋๋ก ๋์์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค.
๊ธฐ์กด์ ์๋ ๊ฒ์ ํ์ฅํ์ฌ ์์ฑ์(Initialize), ๋ฉ์๋(method), ํ๋กํผํฐ(property)๋ฅผ ์ถ๊ฐํ ์ ์์ด์.
ํ์ฅ์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
class Object {
// ํด๋์ค ๊ตฌํ
}
extension Object {
// ํด๋์ค์ ์ถ๊ฐํ ๊ธฐ๋ฅ ๊ตฌํ
}
์์ ์ฝ๋์ฒ๋ผ ํ์ฅ ๋ต๊ฒ extension ์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Q : ๊ทธ๋ผ ํ์ฅ์ ์ถ๊ฐํ๊ธฐ ์ ์ ์์ฑํ๋ ๊ธฐ์กด ํด๋์ค์ ์ธ์คํด์ค์์๋ ํ์ฅ์์ ๊ตฌํํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์๊น์?
A : ๋ค! ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ฅ์ Static Dispatch ๋ฐฉ์์ผ๋ก ๊ตฌํ์ด ๋์ด ์์ด "์ปดํ์ผ ํ์"์์ ํธ์ถ๋ ํจ์๋ฅผ ์ ํ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ํ์ฅ ํจ์๊ฐ ์ฝ๋์ 90๋ฒ์งธ ์ค์ ์์นํด์๋ค๋ฉด, ๊ธฐ์กด ํด๋์ค์ ์ธ์คํด์ค์์ ํ์ฅ๋ ํจ์๋ฅผ ํธ์ถํ ๋, 90๋ฒ์งธ ๋ฉ์๋๋ฅผ ์คํํด๋ฌ๋ผ๋ ์ ํธ๋ฅผ ๋ณด๋ด์ฃผ์ด ์คํ์ด ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค.
ํ์ฅ์ ๊ฐ๋ ์์ ์์ฑ์, ๋ฉ์๋, ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ค๋ฉด ํด๋์ค ๊ด์ ์์๋ ์์๊ณผ ๋น์ทํ๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ๊ฐ๋ ์ผ๋ก ๋ณธ๋ค๋ฉด ์์ฃผ์์ฃผ ๋น์ทํ์ง๋ง, ์ฌ์ค ์์๊ณผ ํ์ฅ์ ๋งค์ฐ ๋ฌ๋ผ์!
( ํด๋์ค์ ๊ด์ ์์ )
์์๊ณผ ํ์ฅ
์์( inheritance )์ ์๋ก์ด ํด๋์ค๋ฅผ ์์ฑํด ๊ธฐ์กด์ ํด๋์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ผ๋ก, ๋ถ๋ชจ ํด๋์ค์ ์๋ ๋ชจ๋ ์์๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด์ ์ถ๊ฐ์ ์ผ๋ก ์๋ก์ด ๋ฉ์๋๋ ํ๋กํผํฐ, ์์ฑ์๋ฅผ ์ถ๊ฐํ ์๋ ์๊ณ , ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ์๋ ์์ด์.
์ด์ ๋ฌ๋ฆฌ ํ์ฅ( Extension )์ ๊ธฐ์กด์ ํด๋์ค์ ์๋ก์ด ๋ฉ์๋๋ ํ๋กํผํฐ, ์์ฑ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ์ฌ์ ์๋ ๋ถ๊ฐ๋ฅํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ง ํ ์ ์์ด์!
๊ทธ๋ฆผ์ผ๋ก ๋ณด์๋ฉด ๋ ์ดํด๊ฐ ์ฌ์ฐ์ค ๊ฒ ๊ฐ์ต๋๋ค!
์์์ ์์ง์ผ๋ก ํ์ฅํ๊ณ ํ์ฅ์ ์ํ์ผ๋ก ํ์ฅ๋๋ค๊ณ ์๊ฐํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์์!
[ ์์๊ณผ ํ์ฅ์ ์ฐจ์ด์ ]
์์ ( inheritance ) | ํ์ฅ ( Extension ) |
์์ง ํ์ฅ | ์ํ ํ์ฅ |
ํด๋์ค | ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ, ํ๋กํ ์ฝ ๋ฑ๋ฑ |
์๋ก ๋ง๋ค์ด ์ฌ์ฉ | ๊ธฐ์กด์์ ์ถ๊ฐํ์ฌ ์ฌ์ฉ |
์ฌ์ ์ ๊ฐ๋ฅ | ์ฌ์ ์ ๋ถ๊ฐ๋ฅ |
์, ์์๋ฅผ ํตํด ๋ ์์ธํ ์ดํด๋ฅผ ํด๋ด ์๋ค.
์์๊ณผ ํ์ฅ์ ๋ํ ์์
class Person {
var id = 117
var name = "EarthSea"
var email = "qowlgo00@gmail.com"
func walk() {
print("๊ฑท๊ธฐ")
}
}
class Student: Person {
var grade = 3
var score = 100
// walk๋ ์ฌ์ ์ ๊ฐ๋ฅ
override func walk() {
print("ํ๊ต๋ก ๊ฑธ์ด๊ฐ๊ธฐ")
}
func study() {
print("๊ณต๋ถํ๊ธฐ")
}
// ๐จ Error Non-@objc instance method 'eat()' is declared in extension of 'Person' and cannot be overridden
// override func eat() {
// <#code#>
// }
}
class Undergraduate: Student{
var major = "computer"
func play() {
print("๋๊ธฐ")
}
}
Person ํด๋์ค์ Person์ ์์ํ Student ํด๋์ค, Student๋ฅผ ์์ํ Undergraduate ํด๋์ค๊ฐ ์์ด์. ์ฌ๊ธฐ์ Person์ด๋ผ๋ ํด๋์ค๋ฅผ ํ์ฅํ์ฌ eat()๋ผ๋ ํจ์๋ฅผ ์ถ๊ฐํด๋ด ์๋ค.
extension Person {
func eat() {
print("๋ฐฅ๋จน๊ธฐ")
}
}
์ ์ด์ ๊ฐ๊ฐ์ ์ธ์คํด์ค๋ฅผ ํ์ฑํด ํ์ฅ์ผ๋ก ๊ตฌํํ eat() ํจ์๋ฅผ ํธ์ถํด๋ด ์๋ค.
let person = Person()
person.eat() // ์ถ๋ ฅ : ๋ฐฅ๋จน๊ธฐ
var student = Student()
student.eat() // ์ถ๋ ฅ : ๋ฐฅ๋จน๊ธฐ
let undergraduate = Undergraduate()
undergraduate.eat() // ์ถ๋ ฅ : ๋ฐฅ๋จน๊ธฐ
Person์ ์ธ์คํด์ค ๋ฟ๋ง์ด ์๋๋ผ Person์ ์์๋ฐ์ Student์ Undergraduate์ ์ธ์คํด์ค๋ ๋ชจ๋ eat() ํจ์ ํธ์ถ์ด ๊ฐ๋ฅํ ๊ฒ์ ํ์ธํ ์ ์์ด์. ๋ถ๋ชจ ํด๋์ค์ ํ์ฅ๋ ๋ฐ์ดํฐ๋ค๋ ์์ ํด๋์ค๊ฐ ๋ค ์์์ ๋ฐ์ ์ ์๋ค๋ ๊ฒ์ด์ฃ . ํ์ง๋ง, ์ฌ์ ์๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค!
๋ํ ํ์ฅ์ด ํ์ํ ์ด์ ์ค ํ๊ฐ์ง๋ก ๊ธฐ์กด์ ๊ตฌํ๋ ๋ฉ์๋๋ค์ extensionํ์ฌ ์์ ๋ง์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค๋ ๊ฑด๋ฐ์. ์ ํ์ด ๋ฏธ๋ฆฌ ๊ตฌํํด๋์ Int, String ๋ฑ ์๋ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ์ง๋ง, ํ์ฅ ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์์๋ฅผ ๋ณด๋ฉด
extension Int {
var squared: Int {
return self * self
}
}
์ด๋ ๊ฒ Int ํ์ ์ ํ์ฅ์์ผ ์๋ก์ด ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ ์์ด์!
10.squared // ์ถ๋ ฅ : 100
3.squared // ์ถ๋ ฅ : 9
์ด๋ ๊ฒ ํ์ฅ์ ๊ฐ๋ ๊ณผ ์์๊ณผ์ ์ฐจ์ด์ ์ ๋ํด์ ์์๋ณด์์ด์!!
ํน์๋ ์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์๊ธฐ ๋ฐ๋๋๋ค~!
๋ค์ ์๊ฐ์ ํ์ฅ ๊ฐ๋ฅ ๋ฉค๋ฒ์ ๋ํด์ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค!
๐ ์์ ํฌ์คํ ์ ์จ๋ฐ ์ค์ํํธ ๋ฌธ๋ฒ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํ ๊ธ์ ๋๋ค.