์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค! ์ค๋์ ํ์ ์บ์คํ ์ ๋ํด์ ๋ฐฐ์๋ณด๋๋ก ํ ๊ฒ์! ๋งฅ๋ถ์ด ๋์ฐฉํด์ ์ผ๋ฅธ ๊ฐ๋ฐํด๋ณด๊ณ ์ถ์ ๋ง์์ ๋ฌธ๋ฒ ์์ฑ๊ฐ์๋ง ๋ฃ๊ณ ์์ฆ ๊ณต์๋ฌธ์ ์ ๋ฆฌ๋ ๋ธํ๋ค์ ใ ใ ์ผ๋ฅธ ์ ๋ฆฌํด์ผํ ํ ๋ฐ.. ์ญ์ ๊ธฐ๋กํ๊ณ ํ๊ธฐ?ํ๋ฉด์ ๊ณต๋ถํ๋๊ฑด ์กฐ๊ธ ๋ ์ค๋๊ฑธ๋ฆฌ๋๊ฒ๊ฐ์์! ํ์ง๋ง ๋จธ๋ฆฌ์๋ ๋ ๋ง์ด ๋จ์ผ๋,,,, ์ข๋ง ์ฐธ๊ณ ์ด์ฌํ ๊ณต๋ถํด๋ณด๋๋ก ํ ๊ฒ์ ใ ใ ๊ทธ๋ผ 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์ ๊ด๋ จ๋ ๊ธ์ ํฌ์คํ ํด๋ณด๊ฒ ๋ค.
'Swift > Swift BASIC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - ํ๋กํ ์ฝ (protocol) (0) | 2022.01.19 |
---|---|
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - assert (0) | 2022.01.19 |
[Swift] ํ๋กํผํฐ ์ต์ ๋ฒ (property observer) (0) | 2022.01.19 |
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - ์์ (Inheritance) - sub class, super class๋? (0) | 2022.01.17 |
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - ํ๋กํผํฐ(property) (0) | 2022.01.17 |