[Swift] ํƒ€์ž…์บ์ŠคํŒ…, ๋‹ค์šด์บ์ŠคํŒ…, is, as๋ž€?
iOS/Swift

[Swift] ํƒ€์ž…์บ์ŠคํŒ…, ๋‹ค์šด์บ์ŠคํŒ…, is, as๋ž€?

Swift์˜ ํƒ€์ž…์บ์ŠคํŒ…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•„์š”. ๐Ÿ˜Ž

๋จผ์ € ํด๋ž˜์Šค์˜ ์ƒ์† ๊ฐœ๋…๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ......

์ด๋ ‡๊ฒŒ Coffee, Latte, Americano๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋ผ๋–ผ์™€ ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋ฅผ ๋ฌถ์–ด์„œ ์ปคํ”ผ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜์ฃ !??!? 

์ปคํ”ผ๋ผ๋Š” ๊ฐœ๋…์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ผ๋–ผ๋Š”, ์—ฌ๊ธฐ์—์„œ๋Š” ์ปคํ”ผ๋ฅผ ์ƒ์†๋ฐ›์•„ ๋ผ๋–ผ๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค! ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปคํ”ผ๋ผ๋Š” ๊ฐœ๋…์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋„ ์ƒ์„ฑ!

๊ทธ๋Ÿฌ๋ฉด ์ปคํ”ผ๋Š” ๋ถ€๋ชจ Class, ๋ผ๋–ผ์™€ ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋Š” ์ž์‹ Class๊ฐ€ ๋จ๋‹ˆ๋‹ค. '์ปคํ”ผ'๋Š” '์ƒท'์ด๋ผ๋Š” ํ•ญ๋ชฉ์„ ๊ฐ–๊ณ  ์žˆ๊ณ , ์ด๋ฅผ ์ƒ์†๋ฐ›์€ ์ž์‹๋“ค์ธ ๋ผ๋–ผ์™€ ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋„ '์ƒท'์ด๋ผ๋Š” ํ•ญ๋ชฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šด๋‹ˆ๋‹ค~~ ์ดˆ๊ฐ„๋‹จ ์ƒ์† ๋—!

class Coffee {
    let shot: Int
    
    init(shot: Int) {
        self.shot = shot
    }
}

class Latte: Coffee {
    var flavor: String
    
    init(flavor: String, shot: Int) {
        self.flavor = flavor
        super.init(shot: shot)
    }
}

class Americano: Coffee {
    let iced: Bool
    
    init(shot: Int, iced: Bool) {
        self.iced = iced
        super.init(shot: shot)
    }
}

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ '์ปคํ”ผ' ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๊ฑ ์ปคํ”ผ, '๋ผ๋–ผ' ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ธ ๋ฐ”๋‹๋ผ๋ผ๋–ผ์™€, '์•„๋ฉ”๋ฆฌ์นด๋…ธ' ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ธ '์•„์ด์Šค์•„๋ฉ”๋ฆฌ์นด๋…ธ(aka ์•„์•„)'๋ฅผ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์๋‹ˆ๋‹ค.

let coffee: Coffee = Coffee(shot: 1)
let vanillaLatte: Latte = Latte(flavor: "vanilla", shot: 2)
let icedAmericano: Americano = Americano(shot: 3, iced: true)

์› ์ƒท ์ปคํ”ผ, ํˆฌ ์ƒท ๋ฐ”๋‹๋ผ๋ผ๋–ผ, ์“ฐ๋ฆฌ ์ƒท ์•„์•„๋ฅผ ์ƒ์„ฑํ–ˆ์Œ! ์œ„์—์„œ ๋งํ–ˆ๋“ฏ 'shot' ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋Š” Latte ํด๋ž˜์Šค์™€ Americano ํด๋ž˜์Šค๊ฐ€ Coffee ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ €๋ ‡๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ์Œ!

 

๐Ÿ“Œ is ์‚ฌ์šฉํ•˜๊ธฐ

/// ๋ฐ์ดํ„ฐ ํƒ€์ž… ํ™•์ธ
print("coffee is Coffee ->", coffee is Coffee) // true
print("coffee is Americano ->", coffee is Americano) // false
print("coffee is Latte ->", coffee is Latte) // false

is๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค! <์ธ์Šคํ„ด์Šค> is <ํด๋ž˜์Šค>  ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, return ๊ฐ’์œผ๋กœ Boolean ํƒ€์ž…์˜ ๊ฐ’์„ ๋Œ๋ ค ์ค๋‹ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ์—์„œ, ๋ถ€๋ชจ ํด๋ž˜์Šค Coffee์˜ ์ธ์Šคํ„ด์Šค์ธ ๊ฑ coffee๋Š” is Coffee๋ฅผ ํ–ˆ์„ ๋•Œ true๋ฅผ ๋ฐ›์ง€๋งŒ, ์ž์‹ ํด๋ž˜์Šค๋กœ is Americano์™€ is Latte๋ฅผ ํ–ˆ์„ ๋• false๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ์ž์‹ ํด๋ž˜์Šค์ธ ์ฒ™์„ ํ•  ์ˆ˜๋Š” ์—†๋Š” ๊ฒƒ ..

print("vanillaLatte is Coffee ->", vanillaLatte is Coffee) // true
print("vanillaLatte is Americano ->", vanillaLatte is Americano) // false
print("vanillaLatte is Latte ->", vanillaLatte is Latte) // true

print("icedAmericano is Coffee ->", icedAmericano is Coffee) // true
print("icedAmericano is Americano ->", icedAmericano is Americano) // true
print("icedAmericano is Latte ->", icedAmericano is Latte)// false

ํ•˜์ง€๋งŒ! ๋ฐ”๋‹๋ผ๋ผ๋–ผ์™€ ์•„์•„๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์ธ Coffee๋ฅผ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“  Americano, Latte ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ฃ !??!? ๋ถ€๋ชจ์ฒ˜๋Ÿผ shot์ด๋ผ๋Š” ๋ณ€์ˆ˜๋„ ๊ฐ–๊ณ  ์žˆ์ฃ !??!? ๊ทธ๋Ÿฌ๋ฉด ๋ถ€๋ชจ์ธ ์ฒ™์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!!!! vanillaLatte is Coffee๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค!!! icedAmericano๋„ ๋งˆ์ฐฌ๊ฐ€์ง€! ์ด๋ ‡๊ฒŒ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค์ธ ์ฒ™ํ•˜๋Š” ๊ฑธ ์—…์บ์ŠคํŒ…์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค~ '์ฒ™ํ•œ๋‹ค'๋Š” ๊ฒƒ์€ ์ฐธ์กฐํ•œ๋‹ค๋Š” ๊ฒƒ์ด์ ธ! ์ž์‹์ด ๋ถ€๋ชจ์ธ ์ฒ™ํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์„ฑ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์—…์บ์ŠคํŒ…์€ ํ•ญ์ƒ ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค!

๋˜ ํ•˜์ง€๋งŒ... Latte ํด๋ž˜์Šค๋งŒ์ด ๊ฐ–๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋Š” flavor๋ผ๋Š” ํŠน์ง•์„ Americano๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์—†๋“ฏ(์•„๋ญ...ํ—ค์ด์ฆ๋„›์•„์•„๋ผ๋˜๊ฐ€ ์ด๋Ÿฐ๊ฑด  ๋ง๊ณ ...) ์ž์‹๋ผ๋ฆฌ๋Š” ์™„์ „ํžˆ ๋…๋ฆฝ๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค! icedAmericano is Latte๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ฃ ~!

 

+ ์ถ”๊ฐ€๋กœ, ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ type(of: <์ธ์Šคํ„ด์Šค๋ช…>) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •ํ™•ํ•œ ํด๋ž˜์Šค๋ช…์„ return๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๋ฐ”๋‹๋ผ๋ผ๋–ผ๋Š” ์ปคํ”ผ๋ƒ? ํ–ˆ์„ ๋•Œ true์˜€์ง€๋งŒ, ์ •ํ™•ํžˆ๋Š” Latte๋ผ๋Š” ๊ฒƒ์ด์ ธ. Coffee์ธ ์ฒ™์„ ํ•  ์ˆ˜ ์žˆ๋Š” Latte์™€ Americano..

print(type(of: coffee)) // Coffee
print(type(of: vanillaLatte)) // Latte
print(type(of: icedAmericano)) // Americano

 

๐Ÿ“Œ ๋‹ค์šด์บ์ŠคํŒ…, as? as!

๋‹ค์Œ์€ ์ž์ฃผ ์“ฐ๋Š” as? as! as์ง€๋งŒ,... ์ •ํ™•ํžˆ ์™œ ์ด๊ฒƒ์„ ์“ฐ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ณ ... ๋Œ€์ถฉ ?! ์ด๊ฑฐ๋Š” ์—‘์Šค์ฝ”๋“œ๊ฐ€ ๋ฐ”๊ฟ” ์ฃผ๋Š” ๋Œ€๋กœ ์“ฐ๋˜... as? as! as์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค...

if let a: Americano = coffee as? Americano {
    print("This is Americano")
} else {
    print("FAIL")
} // FAIL

if let a: Latte = coffee as? Latte {
    print("This is Latte")
} else {
    print("FAIL")
} // FAIL

if let a: Coffee = coffee as? Coffee {
    print("This is Coffee")
} else {
    print("FAIL")
} // This is Coffee

์ด ์ฝ”๋“œ๋ฅผ ๋ณผ๊นŒ์—ฌ. ์ฒซ ๋ฒˆ์งธ if let ๊ตฌ๋ฌธ์—์„œ๋Š” a๋ผ๋Š” Americano ํƒ€์ž…์˜ ๋ณ€์ˆ˜์— ์œ„์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ๊ฑ ์ปคํ”ผ coffee(Coffee) ๋ณ€์ˆ˜๋ฅผ Americano ํƒ€์ž…์œผ๋กœ ๋ฐ”๊ฟ”์„œ ๋„ฃ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž… ๋ณ€๊ฒฝ์— ์„ฑ๊ณตํ•ด์„œ a์— ์ •์ƒ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด This is Americano๋ฅผ, ์•„๋‹ˆ๋ฉด FAIL์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ FAIL์ด ๋‚˜์ฃ ... ์ด์œ ๋Š” Coffee ํƒ€์ž…(๋ถ€๋ชจ ํƒ€์ž…)์„ Americano ํƒ€์ž…(์ž์‹ ํƒ€์ž…)์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๊ณ  ํ•ด์„œ! ๊ทธ๋ ‡์Šด๋‹ˆ๋‹ค. ๋ถ€๋ชจ๋Š” ์ž์‹์ธ ์ฒ™์„ ํ•  ์ˆ˜ ์—†์œผ๋‹ˆ๊นŒ! ๋‘ ๋ฒˆ์งธ if let ๊ตฌ๋ฌธ์—์„œ๋„ ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค! ๋ถ€๋ชจ ํƒ€์ž…์ด ์ž์‹์ธ ๋ผ๋–ผ์ธ ์ฒ™์„ ํ•  ์ˆ˜๊ฐ€ ์—†์–ด์š”~!

 

๊ทธ๋ ‡๋‹ด ์„ธ ๋ฒˆ์งธ ๊ตฌ๋ฌธ์—์„œ๋Š”, ์›๋ž˜ Coffee ํƒ€์ž…์ด์—ˆ๋˜ coffee ์ธ์Šคํ„ด์Šค๋ฅผ ๊ทธ๋Œ€๋กœ Coffee๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋„ฃ์œผ๋ ค๊ณ  ํ•˜๋‹ˆ ๋‹น์—ฐํžˆ if let ๊ตฌ๋ฌธ์ด true๊ฐ€ ๋˜๊ฒ ์ฃ ~~~

 

์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•˜๋Š” as๋Š” ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค. ๋ถ€๋ชจ ํƒ€์ž…์ธ Coffee์˜ ์ธ์Šคํ„ด์Šค coffee๋ฅผ Americano ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋ƒ? ํ•˜๋Š” ๊ตฌ๋ฌธ์ด coffee as? Americano ์ธ ๊ฒƒ์ด์ฃ ... ๋‹น์—ฐํžˆ ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋‹ˆ as?๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค! ์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” ๋Œ€์‹คํŒจํ–ˆ๊ตฐ์—ฌ. ๋ถ€๋ชจ๊ฐ€ ์ž์‹์ธ ์ฒ™์„ ํ•  ์ˆ˜ ์žˆ๋ƒ? ์œ„์—์„œ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์žˆ๋ƒ? ์ด๊ฒŒ ๋ฐ”๋กœ ๋‹ค์šด์บ์ŠคํŒ…! ๋‹ค์šด์บ์ŠคํŒ…์€ ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋‹ˆ as? ํ˜น์€ as!๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค! ๋‹น์—ฐํžˆ as!๋Š” '์•„๊ทธ๋ƒฅ๊ฐ•์ œ๋กœ์‹œ์ผœ!'๋ผ๋Š” ๋œป. ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋‚  ์ˆ˜๋„ ์žˆ์–ด์š”.

 

if let b: Americano = icedAmericano as? Americano {
    print("This is Americano")
} else{
    print("FAIL")
} // This is Americano

if let b: Latte = icedAmericano as? Latte {
    print("This is Latte")
} else {
    print("FAIL")
} // FAIL

if let b: Coffee  = icedAmericano as? Coffee {
    print("This is Coffee")
} else {
    print("FAIL")
} // This is Coffee

์ด๋ฒˆ์—” ์ด ์ฝ”๋“œ๋ฅผ ๋ด…์‹œ๋‹ค! ์ฒซ ๋ฒˆ์งธ ๊ตฌ๋ฌธ์€ Americano์˜ ์ธ์Šคํ„ด์Šค ์•„.์•„๋ฅผ Americano๋กœ ์บ์ŠคํŒ… ใ…Žใ…๋‹ˆ๊นŒ ๋‹น์—ฐํžˆ ์„ฑ๊ณตํ•˜๊ฒ ์ฃ ?? ์ด๊ฑฐ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋„ ์•Œ๊ณ  ์žˆ์–ด์š”. ์ €๋Ÿฐ ๊ตฌ๋ฌธ์„ ์“ฐ๋ฉด.. 

์‚ฌ๋žŒ ๋จธ์“ฑํ•˜๊ฒŒ,, ์•Œ๋ ค ์ฃผ๋„ค์—ฌ

๋‘ ๋ฒˆ์งธ ๊ตฌ๋ฌธ์—์„œ๋Š”! Coffee์˜ ์ž์‹ ํด๋ž˜์Šค Americano์˜ ์ธ์Šคํ„ด์Šค์ธ icedAmericano๋ฅผ ๋˜๋‹ค๋ฅธ ์ž์‹ ํด๋ž˜์Šค Latte๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์œผ๋‹ˆ๊นŒ else๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

์ด๊ฒƒ๋„ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค!

์„ธ ๋ฒˆ์งธ ๊ตฌ๋ฌธ์—์„œ๋Š” Americano์˜ ์ธ์Šคํ„ด์Šค๋ฅผ Coffee ํƒ€์ž…์— ์ฐธ์กฐํ•ด์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ญ์ƒ ์„ฑ๊ณตํ•œ๋‹ค๊ณ  ์•Œ๋ ค ์ฃผ๋„ค์š”! ์ž์‹์€ ๋ถ€๋ชจ์ธ ์ฒ™์ด ๊ฐ€๋Šฅํ•˜๋‹ˆ๊นŒ์š”!

 

๊ทธ๋ ‡๋‹ค๋ฉด as!๋ฅผ ์จ์„œ ๊ฐ•์ œ ๋‹ค์šด์บ์ŠคํŒ…์„ ํ•ด ๋ณผ๊นŒ์š”???

let castedAmericano: Americano = coffee as! Americano // ๊ฐ•์ œ ๋‹ค์šด์บ์ŠคํŒ… ์‹คํŒจ..

๋ถ€๋ชจ ํด๋ž˜์Šค Coffee์˜ ์ธ์Šคํ„ด์Šค coffee๋ฅผ ์ž์‹ ํด๋ž˜์Šค๋กœ ๊ฐ•์ œ ๋‹ค์šด์บ์ŠคํŒ…ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด as! ๋ฅผ as? ๋กœ ๋ฐ”๊ฟ”์„œ ์‹คํŒจํ•  ๊ฒฝ์šฐ์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ฃผ์–ด์•ผ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๊ฐ€ ๋˜๊ฒ ์ฃ ~~~?? ๐Ÿ˜ต‍๐Ÿ’ซ

 

 

ํ•ญ์ƒ ์„ฑ๊ณตํ•˜๋Š” ๋‹ค์šด์บ์ŠคํŒ…๋„ ์žˆ์–ด์š”!

let castedCoffee: Coffee = vanillaLatte as! Coffee // ํ•ญ์ƒ ์„ฑ๊ณตํ•˜๋Š” ๋‹ค์šด์บ์ŠคํŒ…

vanillaLatte์˜ ํƒ€์ž…์ธ Latte๊ฐ€ Coffee ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ๋„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์•ž์—์„œ์ฒ˜๋Ÿผ if let ๊ตฌ๋ฌธ์œผ๋กœ ๊ฐ์‹ธ์ง€ ์•Š์€ ์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด

๋„ˆ ๊ทธ๊ฑฐ... ํ•ญ์ƒ ์„ฑ๊ณตํ• ๊ฑธ? ๊ฐ•์ œ๋กœ ! ๋ถ™์—ฌ ๊ฐ€๋ฉด์„œ ์“ธ ํ•„์š” ์—†์„๊ฑธ? ๊ฑ 'as'๋กœ ๋ฐ”๊พธ๋Š” ๊ฒŒ ์–ด๋•Œ???? ๋ผ๊ณ  ์นœ์ ˆํ•˜๊ฒŒ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค! ๐Ÿ˜‡

 

 

 

๋ ˆํผ๋Ÿฐ์Šค

์Šค์œ„ํ”„ํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ 3ํŒ, ์•ผ๊ณฐ 

https://babbab2.tistory.com/127