ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Checking Type & Downcasting - Type Casting
    iOS/🟠 Swift 2021. 1. 21. 00:57

    Checking Type

    이전 κΈ€μ—μ„œ μž‘μ„±ν•œ 상속 ꡬ쑰

    /* item 이 Transportation νƒ€μž…μœΌλ‘œ Upcasting λ˜μ–΄ μžˆλŠ” 상황 */
    ...
    
    if item is Metro {
    
    } else if item is Bus {
    
    }
    
    ...

    Type check operator ` is ` λ₯Ό μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€κ°€ νŠΉμ • subclass νƒ€μž…μΈμ§€ μ•„λ‹Œμ§€ ν™•μΈν•©λ‹ˆλ‹€.

     

    μΈμŠ€ν„΄μŠ€κ°€ νŠΉμ • subclass νƒ€μž…μ΄ λ§žλ‹€λ©΄ true λ₯Ό , μ•„λ‹ˆλΌλ©΄  false λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

     

    Type Casting 은 νƒ€μž…μ„ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ μ•„μ˜ˆ λ°”κΎΈλŠ” 것이 μ•„λ‹ˆλΌ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ μ·¨κΈ‰λ§Œ ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ, is μ—°μ‚°μžλ‘œ sublcass인지 μ•„λ‹Œμ§€λ₯Ό 확인 ν•  수 μžˆκ² μŠ΅λ‹ˆλ‹€.

     


     

    Downcasting

    # as? # as!

     

    μ–΄λ–€ 수퍼 클래슀 νƒ€μž…μ„ 가진 μΈμŠ€ν„΄μŠ€λŠ” 사싀 μ„œλΈŒν΄λž˜μŠ€ μΈμŠ€ν„΄μŠ€μΌ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

     

    즉, 사싀은 μ„œλΈŒ 클래슀 νƒ€μž…μΈλ° μ—… μΊμŠ€νŒ…λ˜μ–΄μ„œ 슈퍼클래슀의 νƒ€μž…μΈ `μ²™` ν•˜λŠ” μƒν™©μž…λ‹ˆλ‹€.

     

    이런 μƒν™©μ—μ„œ `Downcasting` 을 톡해 μ„œλΈŒν΄λž˜μŠ€ νƒ€μž…μœΌλ‘œ νƒ€μž… μΊμŠ€νŒ…ν•΄μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    νƒ€μž… μΊμŠ€νŒ… μ—°μ‚°μž ` as? ` 와  ` as! ` λ₯Ό ν†΅ν•΄μ„œ κ°€λŠ₯ν•©λ‹ˆλ‹€.

     

    κ΄€λ ¨ κΈ€ : Optionals - Optionals

     

    ` as? `λŠ” μ„œλΈŒν΄λž˜μŠ€λ₯Ό μ˜΅μ…”λ„ νƒ€μž…μœΌλ‘œ λž˜ν•‘ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€. 즉, 성곡 μ‹œμ—λŠ” Optional(subclass) λ₯Ό λ°˜ν™˜ν•˜κ³ , μ‹€νŒ¨ μ‹œ nil을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

    λ”°λΌμ„œ 보톡 μ˜΅μ…”λ„ 바인딩 νŒ¨ν„΄μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

     

    λ‹€μš΄ μΊμŠ€νŒ… 성곡 μ—¬λΆ€κ°€ ν™•μ‹€ν•˜μ§€ μ•Šμ„ λ•Œμ—λŠ” ` as? ` μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

     

    ` as! `λŠ” λ‹€μš΄ μΊμŠ€νŒ…ν•œ μ˜΅μ…”λ„ νƒ€μž…μ„ κ°•μ œ μ–Έλž˜ν•‘ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μΊμŠ€νŒ… μ‹€νŒ¨ μ‹œ μ•± ν¬λž˜μ‹œκ°€ λ°œμƒν•©λ‹ˆλ‹€.

     

    λ‹€μš΄ μΊμŠ€νŒ…μ΄ 항상 μ„±κ³΅ν•œλ‹€λ©΄ ` as! ` μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

     

    κ·Έλ ‡λ‹€λ©΄ λ‹€μš΄μΊμŠ€νŒ…μ΄ μ‹€νŒ¨ν•˜λŠ” κ²½μš°λŠ” μ–Έμ œμΌκΉŒμš”?

     

    1. μΊμŠ€νŒ…ν•˜κ³  싢은 νƒ€μž…μ΄ 상속계측에 μ‘΄μž¬ν•˜μ§€ μ•Šκ±°λ‚˜,

    2. μˆ˜νΌν΄λž˜μŠ€μ—μ„œ λΆ„κΈ°ν•˜λŠ” μ„œλΈŒν΄λž˜μŠ€ μ’…λ₯˜κ°€ 2개 이상일 κ²½μš°μž…λ‹ˆλ‹€.

     

    μ•„λž˜ 그림은 2번 μƒν™©μž…λ‹ˆλ‹€.

     

    Bus νƒ€μž…μ„ μ—… μΊμŠ€νŒ…λ˜μ–΄ Transportation νƒ€μž…μ΄ λ˜μ—ˆλŠ”λ°,

    Metro νƒ€μž…μœΌλ‘œ λ‹€μš΄ μΊμŠ€νŒ…μ„ μ‹œλ„ν•œλ‹€λ©΄ μ‹€νŒ¨ν•˜μ—¬ nil을 리턴할 κ²ƒμž…λ‹ˆλ‹€.

    이전 κΈ€μ—μ„œ μž‘μ„±ν•œ 상속 ꡬ쑰

     

    var bus: Bus = Bus(fare: 750, busNumber: 6617)
    
    // μ—…μΊμŠ€νŒ…
    var trans: Transportation = bus
    
    /* λ‹€μš΄μΊμŠ€νŒ… nil λ°˜ν™˜λ˜μ–΄, 바인딩 μ‹€νŒ¨λ‘œ else 블둝이 μ‹€ν–‰ λ©λ‹ˆλ‹€ */
    if let bus = trans as? Metro  {
    
        print("\(lineNumber)")
    } else {
    
        print("fail")
    }
    
    // "fail"

    N O T E

     

    Type Casting 은 μΈμŠ€ν„΄μŠ€ μžμ²΄λ‚˜ μΈμŠ€ν„΄μŠ€ μ•ˆμ˜ 값을 μ „ν˜€ λ³€κ²½ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

     

    μΈμŠ€ν„΄μŠ€λŠ” κ·ΈλŒ€λ‘œ 놔두고, 취급을 μΊμŠ€νŒ…λœ νƒ€μž…μœΌλ‘œ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

     

    μΈμŠ€ν„΄μŠ€λ₯Ό λ³€κ²½ν•˜λŠ” Type Conversionκ³Ό ꡬ뢄해야 ν•©λ‹ˆλ‹€.

     



     

    Type Casting for Any and AnyObject

     

    Any νƒ€μž…μ€ ν•¨μˆ˜ νƒ€μž…μ„ ν¬ν•¨ν•œ λͺ¨λ“  νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό ν‘œν˜„ν•  수 μžˆλŠ” νƒ€μž…μž…λ‹ˆλ‹€.

     

    λ‹€μ‹œ λ§ν•΄μ„œ, λͺ¨λ“  νƒ€μž…μ€ Any νƒ€μž…μœΌλ‘œ μΊμŠ€νŒ…μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€

     

     

    AnyObject νƒ€μž…μ€ λͺ¨λ“  클래슀 νƒ€μž…μ„ ν‘œν˜„ν•  수 μžˆλŠ” νƒ€μž…μž…λ‹ˆλ‹€.

     

    λ‹€μ‹œ λ§ν•΄μ„œ, λͺ¨λ“  클래슀 νƒ€μž…μ€ AnyObject νƒ€μž…μœΌλ‘œ μΊμŠ€νŒ…μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

     

    var things = [Any]()
    
    things.append(0)          // Int
    things.append(0.0)        // Double
    things.append(43)         // Int
    things.append("🐢")       // String
    things.append((3.0, 5,0)) // Tuple

    Any νƒ€μž…μ˜ things 배열에 λ“€μ–΄κ°„ 멀버듀은 Any νƒ€μž…μœΌλ‘œ μΊμŠ€νŒ…λ˜μ–΄ λ“€μ–΄κ°‘λ‹ˆλ‹€.

     

    μ›λž˜ νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•˜λ €λ©΄ as? ν˜Ήμ€ as! μ—°μ‚°μžλ‘œ μΊμŠ€νŒ…ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.

     

    μ˜ˆμ œμ—μ„œλŠ” for-in μˆœνšŒν•˜λ©° switch 문을 λŒλ ΈμŠ΅λ‹ˆλ‹€. (μƒλž΅)

     

     

    끝!


     

    λŒ“κΈ€

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ λ‚˜