Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/Swift BASIC

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

๊ฐ์ž ๐Ÿฅ” 2022. 1. 19. 14:03
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์ž์ž…๋‹ˆ๋‹ค! ์˜ค๋Š˜์€ ํƒ€์ž…์บ์ŠคํŒ…์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ณด๋„๋ก ํ• ๊ฒŒ์š”! ๋งฅ๋ถ์ด ๋„์ฐฉํ•ด์„œ ์–ผ๋ฅธ ๊ฐœ๋ฐœํ•ด๋ณด๊ณ  ์‹ถ์€ ๋งˆ์Œ์— ๋ฌธ๋ฒ• ์†์„ฑ๊ฐ•์˜๋งŒ ๋“ฃ๊ณ  ์š”์ฆ˜ ๊ณต์‹๋ฌธ์„œ ์ •๋ฆฌ๋Š” ๋œธํ•˜๋„ค์š” ใ… ใ…  ์–ผ๋ฅธ ์ •๋ฆฌํ•ด์•ผํ• ํ…๋ฐ.. ์—ญ์‹œ ๊ธฐ๋กํ•˜๊ณ  ํ•„๊ธฐ?ํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ•˜๋Š”๊ฑด ์กฐ๊ธˆ ๋” ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š”๊ฒƒ๊ฐ™์•„์š”! ํ•˜์ง€๋งŒ ๋จธ๋ฆฌ์—๋Š” ๋” ๋งŽ์ด ๋‚จ์œผ๋‹ˆ,,,, ์ข€๋งŒ ์ฐธ๊ณ  ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•ด๋ณด๋„๋ก ํ• ๊ฒŒ์š” ใ…Žใ…Ž ๊ทธ๋Ÿผ start!

ํƒ€์ž… ์บ์ŠคํŒ…(Type Casting)์ด๋ž€?

์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์„ ํ™”์ธํ•˜๊ฑฐ๋‚˜ ์–ด๋– ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ด๋‹น ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ์˜ ์Šˆํผํด๋ž˜์Šค๋‚˜ ์„œ๋ธŒํด๋ž˜์Šค๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. swift์—์„œ๋Š” is์™€ as๋ผ๋Š” ์—ฐ์‚ฐ์ž๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋‘ ์—ฐ์‚ฐ์ž๋Š” ๊ฐ’์˜ ํƒ€์ž…์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

ํƒ€์ž…์บ์ŠคํŒ…์„ ์ดํ•ดํ•˜๊ณ  ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด MediaItem์ด๋ผ๋Š” class๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ๊ทธ๋ฆฌ๊ณ  MediaItem์„ ์ƒ์†ํ•˜๋Š” Movie class์™€ Song class๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. 

import Foundation

class MediaItem {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class Movie: MediaItem {
    var director: String
    init(name: String, director: String) {
        self.director = director
        super.init(name: name)
    }
}

class Song: MediaItem {
    var artist:String
    init(name: String, artist: String) {
        self.artist = artist
        super.init(name: name)
    }
}

let library = [
    Movie(name:"๊ธฐ์ƒ์ถฉ", director: "๋ด‰์ค€ํ˜ธ"),
    Song(name: "Butter", artist: "BTS"),
    Movie(name: "์˜ฌ๋“œ๋ณด์ด", director: "๋ฐ•์ฐฌ์šฑ"),
    Song(name: "์šฐ๋ฆฌ์ง‘", artist: "2pm")
    ]

var movieCount = 0
var songCount = 0

 

1) Checking Type : is

 ์ด์ œ ์œ„์—์„œ ๋งŒ๋“  ํด๋ž˜์Šค๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ is์—ฐ์‚ฐ์ž์˜ ๋™์ž‘๋ฐฉ์‹์„ ํ™•์ธํ•ด๋ณด์ž. for in ๊ตฌ๋ฌธ๊ณผ if ๊ตฌ๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค. 

for item in library {
    if item is Movie {
        movieCount += 1
    } else if item is Song {
        songCount += 1
    }
}


print("Library์— ์˜ํ™”๋Š” \(movieCount)๊ฐœ ์žˆ๊ณ , ๋…ธ๋ž˜๋Š” \(songCount)๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค.")

์œ„ ์ฝ”๋“œ ์ฒ˜๋Ÿผ item์ด Movie์ผ๊ฒฝ์šฐ, +1 ์”ฉํ•ด์ฃผ๊ณ  Song์ผ ๊ฒฝ์šฐ songCount์— +1 ์”ฉํ•ด์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ํƒ€์ž…์„ ํ™•์ธํ• ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 ์ฆ‰, is๋Š” ํƒ€์ž…์„ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•œ ์—ฐ์‚ฐ์ž๋กœ, ๋Ÿฐํƒ€์ž„ ์‹œ์ ์—์„œ ์‹ค์ œ ํ™•์ธ์ด ์ด๋ฃจ์–ด์ง„๋‹ค. ํ‘œํ˜„์‹์ด  Type๊ณผ ๋™์ผํ•˜๊ฑฐ๋‚˜, ํ‘œํ˜„์‹์ด Type์˜ ์„œ๋ธŒ ํด๋ž˜์Šค์ธ ๊ฒฝ์šฐ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

2) Type casting : as

ํ‘œํ˜„์‹(์˜ ํƒ€์ž…)์ด ๋ณ€ํ™˜ํ•  Type๊ณผ ํ˜ธํ™˜๋œ๋‹ค๋ฉด, ๋ณ€ํ™˜ํ•  Type์œผ๋กœ ์บ์ŠคํŒ…๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ์ƒ์† ๊ด€๊ณ„์ธ ์—…์บ์ŠคํŒ…(Upcasting)๊ณผ ๋‹ค์šด ์บ์ŠคํŒ…(Downcasting)์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. Any์™€ AnyObject ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ƒ์† ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ์–ด๋„ ์˜ˆ์™ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.. 

๊ณ  ํ•˜๋Š”๋ฐ ๋ฌด์Šจ๋ง์ผ๊นŒ? ์—…์บ์ŠคํŒ…์€ ๋ญ๊ณ  ๋‹ค์šด์บ์ŠคํŒ…์€ ๋ญ˜๊นŒ? ์šฐ์„  ๋‘ ๊ฐ€์ง€์˜ ๊ฐœ๋…์„ ๋จผ์ € ์ดํ•ดํ•ด๋ณด์ž.

2.1) ์—…์บ์ŠคํŒ… (Up casting)

์„œ๋ธŒํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์Šˆํผํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ์ฐธ์กฐํ•œ๋‹ค. ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์Šˆํผํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—…์บ์ŠคํŒ…์€ ํ•ญ์ƒ ์„ฑ๊ณตํ•œ๋‹ค. ์ด๋•Œ as์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์œ„ ์ฝ”๋“œ์—์„œ ๋ณด๋ฉด, library๋ฅผ ์„ ์–ธํ• ๋•Œ 'Movie', 'Song' ๋‘๊ฐ€์ง€ ํƒ€์ž…์—์„œ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด๋Š” ๊ทธ ์ƒ์œ„ ํด๋ž˜์Šค์ธ MediaItem์œผ๋กœ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์กŒ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์—…์บ์ŠคํŒ… ๋˜์—ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Movieํด๋ž˜์Šค์™€ Songํด๋ž˜์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค์ด์ง€๋งŒ, ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์„œ๋กœ ๊ณต์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ์†์— ์—…์บ์ŠคํŒ…ํ•˜์—ฌ ๊ฐ™์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

class Human {
    let name: String = "Sodeul"
}
class Teacher: Human {
    let subject: String = "English"
}
class Student: Human {
    let grade: Int = 1
}


let human = Teacher.init() as Human

์ด ์ฝ”๋“œ๋ฅผ ์˜ˆ์‹œ๋กœ ๋ณด์ž. ์—…์บ์ŠคํŒ…์€ as๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ์œ„ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. human์ด๋ผ๋Š” ์ธ์Šคํ„ด์Šค๋Š” Teacher์ด๋ผ๋Š” ํƒ€์ž…์„ ๊ฐ€์ง€์ง€๋งŒ, ์ด๋Š” Humanํƒ€์ž…์œผ๋กœ ์—…์บ์ŠคํŒ…ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋”ฐ๋ผ์„œ human์˜ ์ ‘๊ทผ ๋ฒ”์œ„๋Š” ์Šˆํผ ํด๋ž˜์Šค์ธ Human์œผ๋กœ ํ•œ์ •๋œ๋‹ค. (subject๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋‹ค๋Š” ๋ง์ด๋‹ค.) ๋Œ€์ถฉ ์—ฌ๊ธฐ๊นŒ์ง€ ์•Œ์•„๋ณด๊ณ ,,, 

2.2) ๋‹ค์šด ์บ์ŠคํŒ… (Down casting)

ํŠน์ • ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ƒ์ˆ˜ ๋˜๋Š” ๋ณ€์ˆ˜๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ฐ์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. mediaItem์œผ๋กœ ์„ค์ •๋œ ๋ฐฐ์—ด์„ as ๋‹ค์šด์บ์ŠคํŒ…์„ ์‚ฌ์šฉํ•˜์—ฌ mediaItem์˜ ์„œ๋ธŒํด๋ž˜์Šค์ธ movie, song ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ํƒ€์ž…์บ์ŠคํŠธ ์—ฐ์‚ฐ์ž๋กœ as? as! ๋‘๊ฐœ๋กœ ํ˜•๋ณ€ํ™˜์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์šด์บ์ŠคํŒ…์„ ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ์–ด์„œ ํƒ€์ž…์บ์ŠคํŠธ ์—ฐ์‚ฐ์ž๋Š” ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ์กด์žฌํ•œ๋‹ค.

๋ฐ”๋กœ ์œ„์—์„œ, human์„ Teacherํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ์ง€์ •ํ•˜์ง€๋งŒ, ์—…์บ์ŠคํŒ… ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Human๊นŒ์ง€๋งŒ ๋ฒ”์œ„๊ฐ€ ํ•œ์ •๋œ๋‹ค๊ณ  ํ•˜์˜€๋‹ค. ๊ทธ๋ž˜์„œ human.subject์—๋Š” ์ ‘๊ทผ์„ ๋ชปํ•œ๋‹ค๊ณ ,,, ์ด๋ฅผ ๋‹ค์šด์บ์ŠคํŒ…์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

let teacher: Teacher = human as! Teacher

์ด๋ ‡๊ฒŒ as ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ, Human ํƒ€์ž…์œผ๋กœ ์—…์บ์ŠคํŒ…๋œ human๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ํ•˜์œ„ํด๋ž˜์Šค์ธ Teacherํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋„ฃ์–ด์ค€ ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋‹ค์šด ์บ์ŠคํŒ…์ด๊ณ , ์Šˆํผํด๋ž˜์Šค์ธ Human ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์„œ๋ธŒํด๋ž˜์Šค์ธ Teacherํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. 

๊ทผ๋ฐ , ์ผ๋ฐ˜ as๊ฐ€ ์•„๋‹ˆ๋ผ ๋’ค์— ์™œ ๋Š๋‚Œํ‘œ๊ฐ€ ๋ถ™๋Š”๊ฒƒ์ธ๊ฐ€? ๋‹ค์šด์บ์ŠคํŒ…์—๋Š” ๋‘ ๊ฐ€์ง€์˜ as์—ฐ์‚ฐ์ž ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ๋ฐ”๋กœ ์‚ดํŽด๋ณด์ž.

 

โ–ถ ์กฐ๊ฑด๋ถ€ ํ˜•์‹์ธ as?

๋‹ค์šด์บ์ŠคํŒ…ํ•˜๋ ค๋Š” ์ธ์Šคํ„ด์Šค์˜ ์˜ต์…”๋„ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ๋‹ค์šด์บ์ŠคํŒ…์ผ ์‹œ๋„ํ•  ๋•Œ ์‹คํŒจํ•  ๊ฒฝ์šฐ์— nil์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ–ถ ๊ฐ•์ œ ํ˜•์‹์ธ as!

๊ฐ•์ œ๋กœ ์–ธ๋ž˜ํ•‘ํ•˜์—ฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์‹คํŒจํ•  ๊ฒฝ์šฐ์— ๊ทธ๋ƒฅ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ์ด๊ฒƒ์€ ํ•ญ์ƒ ์„ฑ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ์ด ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ์ƒํ™ฉ์—์„œ ๊ฐ•์ œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋ฒ„๋ฆฌ๋Š” ๋ถˆ์ƒ์‚ฌ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋Ÿผ ๋งจ์œ„์— mediaItem, Song, Movieํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋†จ๋˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค์šด์บ์ŠคํŒ…์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ๋™์ž‘๋ฐฉ์‹์„ ์•Œ์•„๋ณด์ž.

for item in library {
    if let movie = item as? Movie {
        print("Movie: \(movie.name), dir. \(movie.director)")
    } else if let song = item as? Song {
        print("Song: \(song.name), artist. \(song.artist)")
    }
}

 

 

์ด๋ ‡๊ฒŒ ํƒ€์ž…์บ์ŠคํŒ…์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๋ดค๋˜ ๊ฐœ๋…๊ณผ๋Š” ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋ผ ์ƒ์†Œํ•˜๊ธฐ๋„ํ•˜๊ณ , ์–ด๋ ต๊ธฐ๋„ ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋ธŒํด๋ž˜์Šค, ๋ถ€๋ชจํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ฐœ๋…์€ ํ™•์‹คํžˆ ์•Œ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋‚˜๋งˆ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์› ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿผ ๋‹ค์Œ์œผ๋กœ๋Š” assert์™€ ๊ด€๋ จ๋œ ๊ธ€์„ ํฌ์ŠคํŒ…ํ•ด๋ณด๊ฒ ๋‹ค.

 

๋ฐ˜์‘ํ˜•