λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/swift

[Swift] νƒ€μž… μΊμŠ€νŒ…

by hyebin (Helia) 2023. 2. 6.
λ°˜μ‘ν˜•

νƒ€μž… μΊμŠ€νŒ… (Type Casting)

  • μΈμŠ€ν„΄μŠ€μ˜ "νƒ€μž…"을 ν™•μΈν•˜κ±°λ‚˜, ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό 슈퍼 ν΄λž˜μŠ€λ‚˜ ν•˜μœ„ 클래슀둜 μ·¨κΈ‰ν•˜λŠ” 방법
  • Swiftμ—μ„œ νƒ€μž… μΊμŠ€νŒ…μ€ "is"λ‚˜ "as" μ—°μ‚°μžλ‘œ κ΅¬ν˜„
  • νƒ€μž… μΊμŠ€νŒ…μ„ μ‚¬μš©ν•˜μ—¬ νƒ€μž…μ΄ ν”„λ‘œν† μ½œμ— μ ν•©ν•œμ§€ 여뢀도 확인 κ°€λŠ₯

is

  • νƒ€μž…μ„ μ²΄ν¬ν•˜λŠ” μ—°μ‚°μž
  • λŸ°νƒ€μž„ μ‹œμ μ— μ‹€μ œ 체크가 이루어짐
  • λ°˜ν™˜ 값은 Bool ν˜•
  • ν‘œν˜„μ‹μ΄ Typeκ³Ό λ™μΌν•˜κ±°λ‚˜, ν‘œν˜„μ‹μ΄ Type의 μ„œλΈŒν΄λž˜μŠ€μΈ 경우 Trueλ₯Ό λ°˜ν™˜
  • 이 μ™Έμ—λŠ” False λ°˜ν™˜
//1
let char: Character = "A"
 
char is Character       // true
char is String          // false

//2
class Animal { }
class Dog: Animal { }
 
let dog: Dog = .init()
dog is Dog      // true
dog is Animal        // true

1. λ™μΌν•œ νƒ€μž…μ„ 확인할 λ•Œ μ‚¬μš©

2. Animal 클래슀λ₯Ό Dogλž€ ν΄λž˜μŠ€κ°€ "상속" 받을 경우, dog μΈμŠ€ν„΄μŠ€λŠ” Animal 클래슀의 μ„œλΈŒ 클래슀이기 λ•Œλ¬Έμ— true λ°˜ν™˜

as

  • ν‘œν˜„μ‹(의 νƒ€μž…)이 λ³€ν™”ν•  Typeκ³Ό ν˜Έν™˜λœλ‹€λ©΄, λ³€ν™˜ν•  Type으둜 μΊμŠ€νŒ…λœ μΈμŠ€ν„΄μŠ€λ₯Ό 리턴
  • 상속 관계인 μ—…μΊμŠ€νŒ…(Upcasting)κ³Ό λ‹€μš΄ μΊμŠ€νŒ…(Downcasting)μ—μ„œ μ‚¬μš©
  • Any와 AnyObject νƒ€μž…μ„ μ‚¬μš©ν•  경우, 상속 관계가 μ•„λ‹ˆμ–΄λ„ μ˜ˆμ™Έμ μœΌλ‘œ μ‚¬μš© κ°€λŠ₯

 

μ—…μΊμŠ€νŒ… (Upcasting) 

  • μ„œλΈŒ 클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό "슈퍼 클래슀의 νƒ€μž…"으둜 μ°Έμ‘°
  • μ—…μΊμŠ€νŒ…μ€ 항상 성곡
  • as μ—°μ‚°μžλ₯Ό μ‚¬μš© (컴파일 μ‹œμ μ— μΊμŠ€νŒ… κ°€λŠ₯ μ—¬λΆ€λ₯Ό κ²°μ •)
  • as  : "컴파일 μ‹œμ "에 νƒ€μž… μΊμŠ€νŒ…(μ—…μΊμŠ€νŒ…)을 ν•˜λ©°, μ‹€νŒ¨ν•  경우 μ—λŸ¬κ°€ λ°œμƒ νŒ¨ν„΄ λ§€μΉ­(switch)에도 μ‚¬μš©
class Animal {
    let name: String = "Pobi"
}
class Dog: Animal {
    let color: String = "White"
}

// 1. asλ₯Ό μ‚¬μš©ν•œ μ—…μΊμŠ€νŒ…
let animal1 = Dog.init() as Animal
animal1.name	//Pobi
animal1.color	// Value of type 'Animal' has no member 'color'

// 2. Type Annotation을 μ‚¬μš©ν•œ μ—…μΊμŠ€νŒ…
let animal2: Animal = Dog.init()

Dog νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€λ§Œ, 이λ₯Ό Animal νƒ€μž…μœΌλ‘œ μ—…μΊμŠ€νŒ…ν•΄μ„œ animal에 μ €μž₯

animal이 Dogλž€ μ„œλΈŒ 클래슀λ₯Ό, Animalμ΄λž€ 슈퍼클래슀 νƒ€μž…μœΌλ‘œ μ°Έμ‘°ν•˜λŠ”"μ—…μΊμŠ€νŒ…"을 ν•œ 것이기 λ•Œλ¬Έμ—, animal의 μ ‘κ·Ό λ²”μœ„κ°€ "Animal" λ©€λ²„λ‘œ ν•œμ •λ˜λŠ” 것 

λ”°λΌμ„œ Animal ν΄λž˜μŠ€μ˜ 멀버인 nameμ—” μ ‘κ·Όν•  수 μžˆμ§€λ§Œ, μ„œλΈŒ 클래슀 Dog의 멀버인 colorμ—λŠ” μ ‘κ·Όν•  수 μ—†μŒ

 

λ‹€μš΄μΊμŠ€νŒ… (Downcasting) 

  • 슈퍼 클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό "μ„œλΈŒ 클래슀의 νƒ€μž…"으둜 μ°Έμ‘°
  • μ—…μΊμŠ€νŒ…λœ μΈμŠ€ν„΄μŠ€λ₯Ό λ‹€μ‹œ μ›λž˜ μ„œλΈŒ 클래슀 νƒ€μž…μœΌλ‘œ μ°Έμ‘°ν•  λ•Œ μ‚¬μš©
  • λ‹€μš΄ μΊμŠ€νŒ…μ€ μ‹€νŒ¨ν•  수 있기 λ•Œλ¬Έμ— as? λ˜λŠ” as! μ—°μ‚°μž μ‚¬μš©
  • as?  : "λŸ°νƒ€μž„ μ‹œμ "에 νƒ€μž… μΊμŠ€νŒ…(λ‹€μš΄ μΊμŠ€νŒ…)을 ν•˜λ©°, μ‹€νŒ¨ν•  κ²½μš° nil을 λ¦¬ν„΄
  •  as!  : "λŸ°νƒ€μž„ μ‹œμ "에 νƒ€μž… μΊμŠ€νŒ…(λ‹€μš΄ μΊμŠ€νŒ…)을 ν•˜λ©°, μ‹€νŒ¨ν•  κ²½μš° μ—λŸ¬ λ°œμƒ
class Animal {
    let name: String = "Pobi"
}
class Dog: Animal {
    let color: String = "White"
}

let animal = Dog.init() as Animal

var dog: Dog = animal as! Dog
dog.name    //Pobi
dog.color   //White

 

λ°˜μ‘ν˜•