ํ์ ์บ์คํ ์ด๋?
: ๋ณ์๋ ๊ฐ์ฒด์ ํ์ ์ ๋ค๋ฅธ ํ์ ์ผ๋ก ๋ณํํ๋ ๊ฒ
is ์ฐ์ฐ์
: ํ์ ์ ์ฒดํฌํ๋ ์ฐ์ฐ์๋ก Bool ํ์ ์ ๋ฐํํ๋ค.
var name: String = "EarthSea"
print(name is String)
print(name is Int)
/* ์ถ๋ ฅ :
true
false
*/
var alphabet: Character = "A"
print(alphabet is Character)
print(alphabet is String)
/* ์ถ๋ ฅ :
true
false
*/
var age: Int = 20
print(age is Int)
print(age is Double)
/* ์ถ๋ ฅ :
true
false
*/
์ ์บ์คํ ๊ณผ ๋ค์ด์บ์คํ
: ์ธ์คํด์ค์ ํ์ ์ ํ์ธํ๊ฑฐ๋ ํด๋น ์ธ์คํด์ค๋ฅผ ์ํผํด๋์ค๋ ํ์ํด๋์ค๋ก ์ทจ๊ธํ๋ ๋ฐฉ๋ฒ
์์๊ด๊ณ๋ฅผ ๊ฐ์ง Class ์์
class Vehicle {
var numberOfWheels: Int = 4
var kindsOf: String = "car"
var isPublicTransport: Bool = false
}
class Car: Vehicle {
// ์์
// var numberOfWheels: Int
// var kindsOf: String
// var isPublicTransport: Bool
var brand: String = "Hyundai"
}
class ElectricCar: Car {
// ์์
// var numberOfWheels: Int
// var kindsOf: String
// var isPublicTransport: Bool
// var brand: String
var isCharge: Bool = true
}
ํด๋์ค์ ์์
var vehicle1: Vehicle = Vehicle()
var vehicle2: Vehicle = Car()
var vehicle3: Vehicle = ElectricCar()
//var car1: Car = Vehicle() // ๐จ Error
var car2: Car = Car()
var car3: Car = ElectricCar()
//var electricCar1: ElectricCar = Vehicle() // ๐จ Error
//var electricCar2: ElectricCar = Car() // ๐จ Error
var electricCar13: ElectricCar = ElectricCar()
- ํ์ ํด๋์ค(์์ ํด๋์ค)์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋, ์์ ํด๋์ค(๋ถ๋ชจ ํด๋์ค)์ ํ์ ์ ๊ฐ์ง ์ ์๋ค.
- ์์ ํด๋์ค(๋ถ๋ชจ ํด๋์ค)์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋, ํ์ ํด๋์ค(์์ ํด๋์ค)์ ํ์ ์ ๊ฐ์ง ์ ์๋ค.
๐ก as ์ฐ์ฐ์๋ ์ธ์คํด์ค์ ํ์ ์ ํํธ๋ฅผ ๋ณ๊ฒฝํ๋ ์ฐ์ฐ์
์ ์บ์คํ
: ํ์ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ํด๋์ค์ ํ์ ์ผ๋ก ์บ์คํ ํ๋ ๋ฐฉ๋ฒ
( ์ธ์คํด์ค ) as ( ํ์ )
- ์ปดํ์ผ ๋จ๊ณ์์ ์บ์คํ ์ด ์คํ์ด ๋๋ค.
- ํ์
์บ์คํ
ํญ์ ์ฑ๊ณต
- ์์ ํด๋์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ก ์ธ์
- ์ํธ ํธํ๊ฐ๋ฅํ ํ์ ๋ ํญ์ ์ฑ๊ณตํจ
-> ์ ์บ์คํ ์ A, B, C๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฌ๋์ด A, B๋ง์ ๊ฐ์ ธ์ผ๋ง ์ ์ฅํ ์ ์๋ ๋์ด๊ธฐ๊ตฌ์ ์์ ํ๊ฒ ์ ์ฅ์ ํ ์ ์๋๊ณ ๋ฌป๋๋ค๋ฉด ๊ทธ๊ฒ์ ๋น์ฐํ๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ฐ๋ฅธ ์์ ๊ด๊ณ๋ผ๋ฉด ์ค๋ฅ๊ฐ ๋ ์ ์๋ค.
let vehicleA = Vehicle()
let carA = Car()
let electricCarA = ElectricCar()
let vehicleList = [vehicleA, carA, electricCarA]
vehicleA์ carA, electricCarA ๋ชจ๋ ๋ค๋ฅธ ํด๋์ค์ ์ธ์คํด์ค์ธ๋ฐ๋ ์ค๋ฅ๊ฐ ๋์ง ์๊ณ ๋ฐฐ์ด๋ก ์ ์๊ฐ ๋์๋ค.
๋ชจ๋ Vehicle()๋ก ์
์บ์คํ
์ด ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด carA์ electricCarA๋ vehicleA๊ฐ ๊ฐ์ง๊ณ ์๋ ์์ ๊ฐ๋ค์ ์ ๊ทผํ ์ ์์๊น? ๋ถ๊ฐ๋ฅํ๋ค!
vehicleList[0].numberOfWheels
//vehicleList[1].brand // ๐จ error: value of type 'Vehicle' has no member 'brand'
//vehicleList[2].isCharge // ๐จ error: value of type 'Vehicle' has no member 'isCharge'
let carB = Car()
let vehicleCar = carB as Vehicle
//vehicleCar.brand // ๐จ error: value of type 'Vehicle' has no member 'brand'
๋ค์ด์์ง ์์ ๋ฉค๋ฒ๋ผ๊ณ ๋์จ๋ค.
์์์ ์ค๋ช ํ๋ฏ์ด A, B, C๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฌ๋์ด A, B๋ง ๊ฐ์ง๊ณ ์ ์ฅํ ์ ์๋ ๋์ด๊ณต์์ ์ ์ฅํ์ ๋, C๋ฅผ ์ฌ์ฉํ ์๋ ์์ ๊ฒ์ด๋ค.
๋ค์ด ์บ์คํ
: ์์ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ํ์ํด๋์ค์ ํ์ ์ผ๋ก ์บ์คํ ํ๋ ๋ฐฉ๋ฒ
(์ธ์คํด์ค) as! (ํ์ )
- ๊ฐ์ ์ธ๋ํํ ํ์ ์ผ๋ก ์คํจ์ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋๋ค.
- ์ปดํ์ผ ๋จ๊ณ์์ ์บ์คํ ์ด ์คํ๋๋ค.
- ์คํจ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ๋๋ฌธ์ ์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํ๋ค.
let vehicle = Vehicle()
vehicle.isPublicTransport
// let car = vehicle as! Car // ๐จ error: Execution was interrupted, reason: signal SIGABRT.
(์ธ์คํด์ค) as? (ํ์ )
- ์คํจํด๋ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋์ง ์๋๋ค. ( ์ต์ ๋ ํ์ ์ผ๋ก ๋ฐํํ์ฌ ์คํจ์ nil๋ก ๋ฐํํ๊ธฐ ๋๋ฌธ์ )
- ์ปดํ์ผ ๋จ๊ณ์์ ์บ์คํ ์ด ์คํ๋๋ค.
- ์ฌ์ฉํ ๋ ์ธ๋ํ ๊ณผ์ ์ด ํ์ํ๋ค.
let vehicleC = Vehicle() as? Car
print(vehicleC) // ์ถ๋ ฅ : nil
- if let ๋ฐ์ธ๋ฉ์ ์ด์ฉํ ๋ค์ด ์บ์คํ ์ธ๋ํ
if let vehicleC = Vehicle() as? Car {
print(vehicleC.brand)
}
// Person ๋ถ๋ชจ ํด๋์ค, Undergraduate ์์ ํด๋์ค
var person: Person = Person() //XXXXX
var person: Person = Undergraduate() //OOOOO
์์ ํ์์ผ๋ก ์ ์ธ๋ person์ ๋ค์ด ์บ์คํ
ํ๋ ๊ฒ์ด ์๋๋ผ
์๋์ฒ๋ผ ์ ์ธ๋ person์ ๋ค์ด ์บ์คํ
ํ๋ ๊ฒ์ด๋ค.
โญ๏ธ [ ๋ค์ด ์บ์คํ ์ ์ ํํ ์ดํด ]
๋ถ๋ชจ ํด๋์ค์ ํ์ ์ ๊ฐ์ง๋ ๋ณ์๋ฅผ ์์ ํด๋์ค์ ์ธ์คํด์ค๋ก ๋ค์ด ์บ์คํ ํ๋ค๊ณ ํด์ ํด๋น ๋ณ์๊ฐ ์์ ํด๋์ค์ ๋ชจ๋ ์์์ ์ ๊ทผ์ ํ ์ ์๋ ๊ฒ์ ์๋๋ค.
if let Vehicle_0: Vehicle = Vehicle() as? ElectricCar {}
let newVehicle_0: ElectricCar = ElectricCar()
๋ค์ด ์บ์คํ ์ ์ฑ๊ณตํ vehicle_0์ ElectricCar์ ์ธ์คํด์ค์ธ newVehicle_0์ด ์๋ค๊ณ ํ์.
vehicle_0์ ElectricCar์ ์ธ์คํด์ค ์์ญ์ ๊ฐ๋ฆฌํค๊ณ ์์ง๋ง, ๋ณ์์๋ Vehicle ํ์ ์ด ๋ค์ด์๋ค๊ณ ์ธ์์ด ๋์ด์ Vehicle์ ๋ค์ด์๋์ ์ธ๊ฐ์ง์ ๋ณ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. newVehicle_0๊ณผ๋ ์ธ์ํ๋ ๋ณ์์ ์์ญ์ด ๋ค๋ฅด๋ค.
๊ทธ๋ ๊ธฐ์ vehicle_0.brand๋ฅผ ์ถ๋ ฅํ ์๋ ์์ ๊ฒ์ด๋ค.