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

๐Ÿ“’ Study/๐Ÿšฉ Swift โ”ƒ 2024. 3. 12. 21:57
๋ชฉ์ฐจ
  1. ํƒ€์ž…์บ์ŠคํŒ…์ด๋ž€?
  2. is ์—ฐ์‚ฐ์ž
  3. ์—…์บ์ŠคํŒ…๊ณผ ๋‹ค์šด์บ์ŠคํŒ…
  4. ์—… ์บ์ŠคํŒ…
  5. ๋‹ค์šด ์บ์ŠคํŒ…

 

 

 

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

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

 

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

 

 

 

 

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)
  1. ํƒ€์ž…์บ์ŠคํŒ…์ด๋ž€?
  2. is ์—ฐ์‚ฐ์ž
  3. ์—…์บ์ŠคํŒ…๊ณผ ๋‹ค์šด์บ์ŠคํŒ…
  4. ์—… ์บ์ŠคํŒ…
  5. ๋‹ค์šด ์บ์ŠคํŒ…
'๐Ÿ“’ Study/๐Ÿšฉ Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [ Swift ] ์ ‘๊ทผ์ œ์–ด(Access Control) #1 - ์›์น™๊ณผ ๋ฌธ๋ฒ•
  • [ Swift ] ์†์„ฑ ๊ฐ์‹œ์ž(Property Observers)
  • [ Swift ] ๋ฐ˜๋ณต๋ฌธ - For๋ฌธ
  • [ Swift ] ์กฐ๊ฑด๋ฌธ
EarthSea
EarthSea
์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ์งธ์ž…๋‹ˆ๋‹ค ๐ŸŒฑ
EarthSea's Log๐ŸŒ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ์งธ์ž…๋‹ˆ๋‹ค ๐ŸŒฑ

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๊ธ€์“ฐ๊ธฐ
EarthSea
EarthSea's Log๐ŸŒ
EarthSea

๊ณต์ง€์‚ฌํ•ญ

  • EarthSea's Introduce
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
    • โœ๏ธ TIL
    • ๐Ÿ“‘ Project
    • ๐Ÿ“’ Study
      • ๐ŸŒ React
      • ๐Ÿšฉ Swift
      • ๐Ÿ“ UIKit
      • ๐Ÿ–ค Git
      • ๐Ÿฉต Python
    • ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป Coding Test
      • โŒจ๏ธ Programmers
      • ๐Ÿ–Œ๏ธ BAEKJOON
    • ๐ŸŽ† SSAFY
    • ๐ŸŽ Apple
    • ๐Ÿท๏ธ Tistory
    • ์˜ค๋กฏ์ด ๋‚˜์˜ ์‹œ๊ฐ„
Total
Today
Yesterday
hELLO ยท Designed By ์ •์ƒ์šฐ.v4.2.2
EarthSea
[ Swift ] ํƒ€์ž…์บ์ŠคํŒ…(Type Casting)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.