๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฑ Mobile/iOS

[iOS - Swift] is, as ํƒ€์ž… ์บ์ŠคํŒ… (์—… ์บ์ŠคํŒ…, ๋‹ค์šด ์บ์ŠคํŒ…)

์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด is, as, as!, as? ์™€ ๊ฐ™์ด ๊ฐ™์€ ๋“ฏ ๋‹ค๋ฅธ ๋ฌธ๋ฒ•์„ ๋ณธ ์ ์ด ์žˆ์„๊ฒƒ์ด๋‹ค. 

์šฐ๋ฆฌ๋Š” ์ด๊ฑธ ํƒ€์ž… ์บ์ŠคํŒ… ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์–ด๋–ค ๊ฒƒ๋“ค์ด ๋‹ค๋ฅธ์ง€ ์ •ํ™•ํžˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ ์œ„ํ•ด ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. 

 

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

๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์˜ ํƒ€์ž…์„ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ™์€ ๊ณ„์ธต์— ์žˆ๋Š” ๋‹ค๋ฅธ ์Šˆํผ ํด๋ž˜์Šค(์ƒ์œ„)๋‚˜ ์„œ๋ธŒ ํด๋ž˜์Šค(ํ•˜์œ„)๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•˜๋‹ค. 

ํƒ€์ž… ์บ์ŠคํŒ…์€  is  ์™€  as  ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

is ์—ฐ์‚ฐ์ž 

ํŠน์ • ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์„ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค. ๋ฐ˜ํ™˜ ํƒ€์ž…์€ Bool์ด๋‹ค. 

 

let mystr : String = "Kimgahyun"
 
mystr is Character       // false
mystr is String          // true
 
 
let bool : Bool = true
 
bool is Bool            // true
bool is Character       // false
bool is String 			// false
class Snack { }
class Salty : Snack { }	//์ƒ์† ๋ฐ›์Œ 
 
let pretzel : Salty = .init()	//pretzel๋Š” Snack์˜ ์„œ๋ธŒํด๋ž˜์Šค
pretzel is Salty      // true
pretzel is Snack        // true

 

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํƒ€์ž…์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋™์ผํ•œ ํƒ€์ž…์„ ํ™•์ธํ•  ๋•Œ๋„ ์žˆ๊ณ , ํด๋ž˜์Šค ๊ฐ„์˜ ์ƒ์† ๊ด€๊ณ„๋ฅผ ์ด์šฉํ•ด์„œ ํƒ€์ž…์„ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

 

 

 

as ์—ฐ์‚ฐ์ž

ํด๋ž˜์Šค ๊ณ„์ธต ์ƒ์˜ ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. 

 

 

 

1. ์—… ์บ์ŠคํŒ…

์—… ์บ์ŠคํŒ…์€ ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ์Šˆํผ ํด๋ž˜์Šค๋กœ ํ˜•๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์—… ์บ์ŠคํŒ…์€ as ๋ฅผ ํ†ตํ•ด์„œ ์ง„ํ–‰๋˜๊ณ  ํ•ญ์ƒ ์„ฑ๊ณตํ•œ๋‹ค. 

์—… ์บ์ŠคํŒ… ์„ฑ๊ณต ์‹œ ์—… ์บ์ŠคํŒ… ํ•œ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  •  as  : ํƒ€์ž…๋ณ€ํ™˜์ด ํ™•์‹คํ•˜๊ฒŒ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ ์™ธ์—๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
class Snack {
    let name : String
    init(name : String) {
        self.name = name
    }
}

class Salty : Snack { }
class Sweety : Snack { }
 
 
let snack : [Snack] = [
    Salty.init(name: "ํ”„๋ง๊ธ€์Šค"),
    Sweety.init(name: "๋นผ๋นผ๋กœ"),
    Sweety.init(name: "์ดˆ์ฝ”์†ก์ด")
]

 

snack ๋ฐฐ์—ด์—๋Š” Snack ํƒ€์ž…๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

๊ทผ๋ฐ ์œ„์˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด Salty์™€ Sweety ํƒ€์ž…์ด ๋“ค์–ด๊ฐ”๋‹ค. ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด "์—… ์บ์ŠคํŒ…" ์ด๋‹ค. 

Salty์™€ Sweety๋Š” ๋‹ค๋ฅธ ํƒ€์ž…์˜ ํด๋ž˜์Šค์ด์ง€๋งŒ, ์Šˆํผ ํด๋ž˜์Šค(๋ถ€๋ชจ ํด๋ž˜์Šค)๊ฐ€ ๊ฐ™๋‹ค. Snack ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— "์—… ์บ์ŠคํŒ…"์„ ํ†ตํ•ด snack ๋ฐฐ์—ด ์š”์†Œ๋“ค์„ Salty ๋˜๋Š” Sweety๋กœ ํƒ€์ž… ์บ์ŠคํŒ…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

let chocolate = Sweety.init() as Snack

 

Sweety ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ, ์ด๋ฅผ Snack ํƒ€์ž…์œผ๋กœ ์—… ์บ์ŠคํŒ…ํ•ด์„œ chocolate์— ์ €์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ as ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜ํƒ€๋‚ธ ์—… ์บ์ŠคํŒ… ์˜ˆ์‹œ ์ฝ”๋“œ์ด๋‹ค.  

 

// 1. as
let candy = Sweety.init() as Snack
 
// 2. ์ง์ ‘ ํƒ€์ž… ๋ช…์‹œ
let jelly : Snack = Sweety.init()

 

์—… ์บ์ŠคํŒ…์„ ํ•˜๋ ค๋ฉด  as  ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ณ ,  ์ง์ ‘ ํƒ€์ž… ๋ช…์‹œ ๋ฅผ ํ•ด์ค˜๋„ ๋œ๋‹ค. 

 

 

 

 

2. ๋‹ค์šด ์บ์ŠคํŒ…

๋‹ค์šด ์บ์ŠคํŒ…์€ ์Šˆํผ ํด๋ž˜์Šค์˜ ํƒ€์ž…์„ ์„œ๋ธŒ ํด๋ž˜์Šค์˜ ํƒ€์ž…์œผ๋กœ ๋‚ฎ์ถฐ์„œ ํ˜•๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋‹ค์šด ์บ์ŠคํŒ…์ด๋ผ๊ณ  ๋งํ•œ๋‹ค. ๋‹ค์šด ์บ์ŠคํŒ…์—๋Š” ์‹คํŒจ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

 

  •  as?  : ๋ณ€ํ™˜์ด ์„ฑ๊ณต ์‹œ Optional  ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ์‹คํŒจ ์‹œ nil ๋ฐ˜ํ™˜
  •  as!  : ๋ณ€ํ™˜ ์„ฑ๊ณต ์‹œ Optional ํƒ€์ž…์„ ๊ฐ•์ œ๋กœ ์–ธ๋ž˜ํ•‘๋œ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ์‹คํŒจ ์‹œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋ฐœ์ƒ

์œ„์—์„œ ๋ณด์—ฌ์ค€ Snack ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค์šด ์บ์ŠคํŒ…์„ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. 

 

for s in snack {
   if let salt =  s as? Salty {
        print("์งญ์งคํ•œ ๊ณผ์ž : \(salt.name)")
    } else if let sweet =  s as? Sweety {
        print("๋‹ฌ๋‹ฌํ•œ ๊ณผ์ž  : \(sweet.name)")
    }
}

// ์งญ์งคํ•œ ๊ณผ์ž : ํ”„๋ง๊ธ€์Šค
// ๋‹ฌ๋‹ฌํ•œ ๊ณผ์ž : ๋นผ๋นผ๋กœ
// ๋‹ฌ๋‹ฌํ•œ ๊ณผ์ž : ์ดˆ์ฝ”์†ก์ด

 

์ถœ๋ ฅ๋„ ์ž˜ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค. 

 

 

 

 

 

728x90