๐Ÿ“’ Study/๐Ÿšฉ Swift

[ Swift ] ํƒ€์ž…์บ์ŠคํŒ…(Type Casting)

EarthSea 2024. 3. 12. 21:57

 

 

 

ํƒ€์ž…์บ์ŠคํŒ…์ด๋ž€?

: ๋ณ€์ˆ˜๋‚˜ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ

 

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๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜๋Š” ์—†์„ ๊ฒƒ์ด๋‹ค.