Type Casting Overview - Type Casting
Type Casting ์ ๋ ๊ฐ์ง๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
1. ์ธ์คํด์ค์ ํ์ ์ ํ์ธํ๋ ์๋จ์ ๋๋ค.
์ฌ๊ธฐ์๋ ` is ` ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
2. ์ธ์คํด์ค๋ฅผ ๊ทธ ํด๋์ค์ ์์๊ณ์ธต์ Superclass ํน์ Subclass๋ก ์ทจ๊ธํ๊ฒ ํฉ๋๋ค.
์ฌ๊ธฐ์๋ ` as ` ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ค๋ฅธ ํ์ ์ผ๋ก ์ทจ๊ธํ๋ค (treat) ๋ ์๋ฏธ๋, ๊ธฐ์กด ์ธ์คํด์ค์ ํ์ ์ ๋ณ๊ฒฝํ๋ ๊ฒ๊ณผ๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
์ ์๋ Type Casting ์ ๊ฐ๋ฆฌํค๊ณ , ํ์๋ Type Conversion์ ๊ฐ๋ฆฌํต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ํ๋กํ ์ฝ๋ ํ๋์ ๋ ๋ฆฝ์ ์ธ ํ์ ์ด๊ณ , ์์์ด ๊ฐ๋ฅํ์ฌ ์์๊ณ์ธต์ด ํ์ฑ๋๋ฏ๋ก Type Casting์ ํ์ฉํ ์ ์์ต๋๋ค.
๊ฒฐ๊ตญ Type Casting ์ Class ์ Protocol์ ํ์ ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Defining a Class Hierarchy for Type Casting
๋ค์ ์ฝ๋๋ ์ฃผ์ด์ง ์ํฉ์ ๋๋ค.
class Transportation {
var fare: Int
init(fare: Int) {
self.fare = fare
}
}
/* Transportaion ์ Subclass */
class Metro: Transportation {
var lineNumber: Int
init(fare: Int, lineNumber: Int) {
self.lineNumber = lineNumber
super.init(fare: fare)
}
}
/* Transportaion ์ ๋ ๋ค๋ฅธ Subclass */
class Bus: Transportation {
var busNumber: Int
init(fare: Int, busNumber: Int) {
self.busNumber = busNumber
super.init(fare: fare)
}
}
์๋ ์ฝ๋๋ ํ์ ์ ์ธ ์์ด ๋ฐฐ์ด์ Trasnportation ์ Subclass ๋ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฌด์์๋ก ์ง์ด๋ฃ๊ณ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ, list ๋ [Transportation] ํ์ ์ผ๋ก ํ์ ์ถ๋ก (Type Inference) ๋ฉ๋๋ค.
Swift's type checker is able to deduce that two subclasses have a common superclass of Transportation.
let list = [
Metro(fare: 1000, lineNumber: 3),
Bus(fare: 700, busNumber: 6617),
Metro(fare: 1100, lineNumber: 9),
Bus(fare: 900, busNumber: 700),
Bus(fare: 2700, busNumber: 100)
]
// ํ์
์ถ๋ก ๋์ด list๋ [Transportation] ํ์
์ด ๋จ
๋ฉค๋ฒ๋ค๋ ๋ชจ๋ Transportaion ํ์ ์ผ๋ก ์บ์คํ ๋ ๊ฒ์ ๋๋ค!
์๋ฐํ ๋งํ๋ฉด ์ ์บ์คํ ๋์์ต๋๋ค.
๋!
๋ค์ ๊ธ: Checking Type & Downcasting - Type Casting