์ฑ์ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด is, as, as!, as? ์ ๊ฐ์ด ๊ฐ์ ๋ฏ ๋ค๋ฅธ ๋ฌธ๋ฒ์ ๋ณธ ์ ์ด ์์๊ฒ์ด๋ค.
์ฐ๋ฆฌ๋ ์ด๊ฑธ ํ์ ์บ์คํ ์ด๋ผ๊ณ ํ๋๋ฐ ์ด๋ค ๊ฒ๋ค์ด ๋ค๋ฅธ์ง ์ ํํ ์ง๊ณ ๋์ด๊ฐ๊ธฐ ์ํด ๊ธ์ ์์ฑํ๊ฒ ๋์๋ค.
ํ์ ์บ์คํ (Type Casting)
๋ณ์๋ ์์์ ํ์ ์ ๋ค๋ฅธ ํ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋งํ๋ค.
์ธ์คํด์ค์ ํ์ ์ ํ์ธํ๊ฑฐ๋, ์ธ์คํด์ค๋ฅผ ๊ฐ์ ๊ณ์ธต์ ์๋ ๋ค๋ฅธ ์ํผ ํด๋์ค(์์)๋ ์๋ธ ํด๋์ค(ํ์)๋ก ์ทจ๊ธํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํ๋ค.
ํ์ ์บ์คํ ์ is ์ as ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
is ์ฐ์ฐ์
ํน์ ์ธ์คํด์ค์ ํ์ ์ ํ์ธํ๋ ์ฐ์ฐ์ด๋ค. ๋ฐํ ํ์ ์ Bool์ด๋ค.
let mystr : String = "Kimgahyun"
mystr is Character // false
mystr is String // true
let bool : Bool = true
bool is Bool // true
bool is Character // false
bool is String // false
class Snack { }
class Salty : Snack { } //์์ ๋ฐ์
let pretzel : Salty = .init() //pretzel๋ Snack์ ์๋ธํด๋์ค
pretzel is Salty // true
pretzel is Snack // true
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ์ ์ ํ์ธํ ์ ์๋๋ฐ ๋์ผํ ํ์ ์ ํ์ธํ ๋๋ ์๊ณ , ํด๋์ค ๊ฐ์ ์์ ๊ด๊ณ๋ฅผ ์ด์ฉํด์ ํ์ ์ ํ์ธํ ์๋ ์๋ค.
as ์ฐ์ฐ์
ํด๋์ค ๊ณ์ธต ์์ ํ์ ์ ๋ณํํ๋ ๊ฒ์ ๋งํ๋ค.
1. ์ ์บ์คํ
์ ์บ์คํ ์ ์๋ธ ํด๋์ค์์ ์ํผ ํด๋์ค๋ก ํ๋ณํํ๋ ๊ฒ์ด๋ค. ์ ์บ์คํ ์ as ๋ฅผ ํตํด์ ์งํ๋๊ณ ํญ์ ์ฑ๊ณตํ๋ค.
์ ์บ์คํ ์ฑ๊ณต ์ ์ ์บ์คํ ํ ํด๋์ค์ ๋ฉ์๋์ ํ๋กํผํฐ์๋ง ์ ๊ทผํ ์ ์๋ค.
- as : ํ์ ๋ณํ์ด ํ์คํ๊ฒ ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ง ์ฌ์ฉํ๋ค. ๊ทธ ์ธ์๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
class Snack {
let name : String
init(name : String) {
self.name = name
}
}
class Salty : Snack { }
class Sweety : Snack { }
let snack : [Snack] = [
Salty.init(name: "ํ๋ง๊ธ์ค"),
Sweety.init(name: "๋นผ๋นผ๋ก"),
Sweety.init(name: "์ด์ฝ์ก์ด")
]
snack ๋ฐฐ์ด์๋ Snack ํ์ ๋ง ๋ค์ด๊ฐ ์ ์๋ค.
๊ทผ๋ฐ ์์ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด Salty์ Sweety ํ์ ์ด ๋ค์ด๊ฐ๋ค. ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด "์ ์บ์คํ " ์ด๋ค.
Salty์ Sweety๋ ๋ค๋ฅธ ํ์ ์ ํด๋์ค์ด์ง๋ง, ์ํผ ํด๋์ค(๋ถ๋ชจ ํด๋์ค)๊ฐ ๊ฐ๋ค. Snack ํด๋์ค๋ฅผ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ "์ ์บ์คํ "์ ํตํด snack ๋ฐฐ์ด ์์๋ค์ Salty ๋๋ Sweety๋ก ํ์ ์บ์คํ ์ ํ ์ ์๋ค.
let chocolate = Sweety.init() as Snack
Sweety ํ์ ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง๋ง, ์ด๋ฅผ Snack ํ์ ์ผ๋ก ์ ์บ์คํ ํด์ chocolate์ ์ ์ฅํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง as ๋ฅผ ์ฌ์ฉํ์ฌ ๋ํ๋ธ ์ ์บ์คํ ์์ ์ฝ๋์ด๋ค.
// 1. as
let candy = Sweety.init() as Snack
// 2. ์ง์ ํ์
๋ช
์
let jelly : Snack = Sweety.init()
์ ์บ์คํ ์ ํ๋ ค๋ฉด as ๋ฅผ ์ฌ์ฉํด๋ ๋๊ณ , ์ง์ ํ์ ๋ช ์ ๋ฅผ ํด์ค๋ ๋๋ค.
2. ๋ค์ด ์บ์คํ
๋ค์ด ์บ์คํ ์ ์ํผ ํด๋์ค์ ํ์ ์ ์๋ธ ํด๋์ค์ ํ์ ์ผ๋ก ๋ฎ์ถฐ์ ํ๋ณํํ๋ ๊ฒ์ ๋ค์ด ์บ์คํ ์ด๋ผ๊ณ ๋งํ๋ค. ๋ค์ด ์บ์คํ ์๋ ์คํจ๋ฅผ ํ ์ ์๊ธฐ ๋๋ฌธ์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
- as? : ๋ณํ์ด ์ฑ๊ณต ์ Optional ๊ฐ์ ๊ฐ์ง๋ค. ์คํจ ์ nil ๋ฐํ
- as! : ๋ณํ ์ฑ๊ณต ์ Optional ํ์ ์ ๊ฐ์ ๋ก ์ธ๋ํ๋ ๊ฐ์ ๊ฐ์ง๋ค. ์คํจ ์ ๋ฐํ์ ์๋ฌ ๋ฐ์
์์์ ๋ณด์ฌ์ค Snack ์์ ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ ๋ค์ด ์บ์คํ ์ ํด๋ณด๋๋ก ํ๊ฒ ๋ค.
for s in snack {
if let salt = s as? Salty {
print("์งญ์งคํ ๊ณผ์ : \(salt.name)")
} else if let sweet = s as? Sweety {
print("๋ฌ๋ฌํ ๊ณผ์ : \(sweet.name)")
}
}
// ์งญ์งคํ ๊ณผ์ : ํ๋ง๊ธ์ค
// ๋ฌ๋ฌํ ๊ณผ์ : ๋นผ๋นผ๋ก
// ๋ฌ๋ฌํ ๊ณผ์ : ์ด์ฝ์ก์ด
์ถ๋ ฅ๋ ์ ๋์ฌ ๊ฒ์ด๋ค.