๐Ÿ“ฑ [SwiftUI] Image: ์ด๋ฏธ์ง€ ๋‹ค๋ฃจ๊ธฐ

์ด์„œยท2023๋…„ 10์›” 8์ผ
1

๐Ÿ“ฑ SwiftUI ํŠธ๋ž™

๋ชฉ๋ก ๋ณด๊ธฐ
4/7

์‚ก์‚ก ์•ˆ๋…•ํ•˜์„ธ์š” ์ด์„œ์˜ˆ์š”, ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” SwiftUI์—์„œ Image๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ… ํ•˜๋ ค๊ณ  ํ•ด์š”๐Ÿž๏ธ.

๊ฐœ์š”

์ด๋ฏธ์ง€(Image)๋Š” SwiftUI์—์„œ ํ™”๋ฉด์— ๊ทธ๋ž˜ํ”ฝ ์ปจํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ทฐ ์š”์†Œ์—์š”. ์ด๋ฏธ์ง€๋Š” ์ •์  ์ด๋ฏธ์ง€๋‚˜ ๋™์  ์ด๋ฏธ์ง€๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค์—์„œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์–ด์š”. SwiftUI์˜ Image ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ์ง€๋ฅผ ํ™”๋ฉด์— ์‰ฝ๊ฒŒ ํ‘œ์‹œํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ, ๋น„์œจ, ๋ Œ๋”๋ง ์˜ต์…˜ ๋“ฑ์„ ์กฐ์ ˆํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์‹œ๊ฐ์  ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋˜ํ•œ, ์ด๋ฏธ์ง€๋ฅผ ๋‹ค๋ฅธ ๋ทฐ์™€ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด๋ฏธ์ง€ ์ถ”๊ฐ€

1. Assets.xcassets

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์— ์žˆ๋Š” Assets.xcassets ํŒŒ์ผ์— ์ด๋ฏธ์ง€ ์…‹(Image Set)์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”.

  1. Xcode ๋‚ด์—์„œ Assets.xcassets ํŒŒ์ผ๋กœ ์ด๋™ํ•ด์š”.
  2. ์ขŒ์ธก ํŒจ๋„์—์„œ ์šฐํด๋ฆญํ•˜์—ฌ, New Image Set์„ ์„ ํƒํ•ด์š”.

  1. ์›ํ•˜๋Š” ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ์ž‘์„ฑํ•ด์š”.
  2. ๊ฐ€์šด๋ฐ ํŒจ๋„์— ์›ํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋ž(drag and drop)ํ•ด์š”.

์ด์ œ ์ด๋ฏธ์ง€ ๋“ฑ๋ก์ด ์™„๋ฃŒ๋˜์—ˆ์–ด์š”, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋“ฑ๋กํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

2. Namespace๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

๐Ÿ’ก Namespace๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

๋งŒ์•ฝ ํด๋” ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”.
๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด Image(โ€images/MyImageโ€) ์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”.

  1. Assets.xcassets ํŒŒ์ผ์—์„œ New Folder with Namespace๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

  1. ์›ํŒŒ๋Š” ํด๋” ์ด๋ฆ„์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ €๋Š” images๋กœ ํ–ˆ์–ด์š”.
  2. images ํด๋” ์•ˆ์— ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ์–ด์ฃผ์„ธ์š”.

  1. ์ด์ œ Image(โ€images/MyImageโ€)๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”.

์ด๋ฏธ์ง€ ๋ Œ๋”๋ง

Image ๊ตฌ์กฐ์ฒด์˜ ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ์ž‘์„ฑํ•ด์š”. Image(โ€MyImageโ€)๋กœ ์ž‘์„ฑํ•˜๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ ์ด๋ฏธ์ง€๊ฐ€ ๋žœ๋”๋ง ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

์Šคํƒ€์ผ๋ง

ํ…Œ๋‘๋ฆฌ: .border()

Image("MyImage")
	.border(.blue, width: 5)

ํ”„๋ ˆ์ž„: .frame()

์ด๋ฏธ์ง€์˜ ํ”„๋ ˆ์ž„(ํ‹€)์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

Image("images/MyImage")
  .border(.red, width: 5)
  .frame(width: 150, height: 150)
  .border(.blue, width: 5)

.border(.red, width: 5)๋Š” ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋งŒํผ ํ…Œ๋‘๋ฆฌ๊ฐ€ ์„ค์ •๋˜์—ˆ์–ด์š”.

.border(.blue, width: 5)๋Š” frame(width: 150, height: 150)์ด ์„ค์ •๋˜๊ณ  ๋‚œ ์ดํ›„ ํ…Œ๋‘๋ฆฌ๋ฅผ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋„ˆ๋น„ 150, ๋†’์ด 150 ๋งŒํผ์˜ ํ…Œ๋‘๋ฆฌ๊ฐ€ ์ƒ๊ฒจ๋‚ฌ์–ด์š”.

ํฌ๊ธฐ ์กฐ์ ˆ ํ—ˆ์šฉ: .resizable()

์ด๋ฏธ์ง€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ๊ทธ๋Œ€๋กœ ๋ Œ๋”๋งํ•ด์š”. ๋”ฐ๋ผ์„œ frame์˜ ํฌ๊ธฐ๋งŒํผ ์ด๋ฏธ์ง€๋ฅผ ์กฐ์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด resizable()์„ ํ†ตํ•ด ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ ˆ์„ ํ—ˆ์šฉํ•ด์•ผํ•ด์š”.

Image("images/MyImage")
  .resizable()
  .frame(width: 150, height: 150)
  .border(.blue, width: 5)
  .frame(width: 200, height: 200)
  .border(.red, width: 5)

resizable()์„ ํ†ตํ•ด ์ด๋ฏธ์ง€๊ฐ€ frame์— ๋งž๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์–ด์š”! ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€ frame(width: 200, height:200)์„ ํ†ตํ•ด ํ”„๋ ˆ์ž„์„ ํ•œ๋ฒˆ ๋” ์”Œ์šฐ๊ณ  ํ…Œ๋‘๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ frame์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๋งŒ์•ฝ frame์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  resizable()๋งŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ์ด๋ฏธ์ง€๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ทฐ์˜ ๋ฒ”์œ„ ๋งŒํผ ์ฐจ์ง€ํ•ด์š”.

๋ถˆํˆฌ๋ช…๋„: .opacity()

์ด๋ฏธ์ง€์˜ ๋ถˆํˆฌ๋ช…๋„๋ฅผ ์กฐ์ ˆํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” opacity()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์š”. 0๋ถ€ํ„ฐ 1๊นŒ์ง€์˜ ๊ฐ’์„ ์ธ์ž๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, 0์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ํˆฌ๋ช…ํ•ด์ ธ์š”.

Image("MyImage")
	.opacity(0.8)

๋น„์œจ ์กฐ์ ˆ: .aspectRatio()

.aspectRatio(_ ratio: CGFloat?, contentMode: ContentMode)

.aspectRatio()๋Š” SwiftUI์—์„œ ๊ฐ€๋กœ์„ธ๋กœ ๋น„์œจ์„ ์กฐ์ ˆํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ด์š”. aspectRatio๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ทฐ์˜ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ด๋ฏธ์ง€๋ฅผ ํŠน์ • ๋น„์œจ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์–ด์š”.

  • ratio: ์›ํ•˜๋Š” ๊ฐ€๋กœ์„ธ๋กœ ๋น„์œจ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, 1.0์€ 1:1 ๋น„์œจ. 0.5๋Š” 1:2์˜ ๋น„์œจ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, nil์„ ์ง€์ •ํ•˜๋ฉด ์›๋ž˜ ์ด๋ฏธ์ง€ ๋น„์œจ์„ ์œ ์ง€ํ•ด์š”.
    • 1.0: ๊ฐ€๋กœ์„ธ๋กœ 1:1 ๋น„์œจ
    • 0.5: ๊ฐ€๋กœ 1 ์„ธ๋กœ 2 ๋น„์œจ
    • 16/9: ๊ฐ€๋กœ์„ธ๋กœ 16:9 ๋น„์œจ
    • 3/2: ๊ฐ€๋กœ์„ธ๋กœ 3:2 ๋น„์œจ
  • contentMode: ratio๋ฅผ ํ†ตํ•ด ๋น„์œจ์„ ์กฐ์ ˆํ•œ ํ›„ ๋ทฐ์˜ ๋‚ด์šฉ์„ ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ด์š”.
    • fit: ์ฝ˜ํ…์ธ ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์„ธ๋กœ ๋ฐ ๊ฐ€๋กœ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„ ์•ˆ์— ๋งž๋„๋ก ํ•˜๋Š” ์˜ต์…˜์ด์—์š”.
      • ์ฝ˜ํ…์ธ ๋ฅผ ๋น„์œจ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ํฌ๊ฒŒ ํ™•๋Œ€ํ•˜์—ฌ ๋ทฐ ๋‚ด์— ๋งž์ถฐ์š”. ๋”ฐ๋ผ์„œ ๋ทฐ์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์ง€ ์•Š์•„์š”.
    • fill: ์ฝ˜ํ…์ธ ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์„ธ๋กœ ๋ฐ ๊ฐ€๋กœ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋„๋ก(occupy) ํ•˜๋Š” ์˜ต์…˜์ด์—์š”.
      • ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ€๋“ ์ฑ„์šฐ๋„๋ก ํ™•๋Œ€ํ•˜์—ฌ ๋ทฐ ๋‚ด์— ๋งž์ถฐ์š”. ๋”ฐ๋ผ์„œ ๋ทฐ์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„ค ์ˆ˜ ์žˆ์–ด์š”.

ContentMode: fit ์˜ˆ์‹œ

ratio๋ฅผ 0.5(1/2)์˜ ๋น„์œจ๋กœ ์กฐ์ •ํ•˜๊ณ  fit์„ ํ†ตํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ทฐ ๋‚ด์—์„œ ์ด๋ฏธ์ง€ ๋น„์œจ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋Š” ์˜ˆ์‹œ์—์š”. ํ˜„์žฌ ์ฝ”๋“œ ๋‚ด์—๋Š” ํ•˜๋‚˜์˜ ๋ทฐ์— ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋งŒ ๋“ค์–ด๊ฐ€๋„๋ก ๋˜์–ด ์žˆ์–ด ์ „์ฒด ํ™”๋ฉด์„ ์ฐจ์ง€ํ•˜๋Š” ๋ชจ์Šต์ด์—์š”!

ratio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์œจ์„ ์กฐ์ •ํ•˜๊ณ  fit์„ ํ†ตํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ทฐ ๋‚ด์—์„œ ์ด๋ฏธ์ง€ ๋น„์œจ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋Š” ์˜ˆ์‹œ์—์š”.

ContentMode: fill ์˜ˆ์‹œ

ratio๋ฅผ 1/2์˜ ๋น„์œจ๋กœ ์„ค์ •ํ•˜๊ณ  fill๋กœ ์„ค์ •ํ–ˆ์–ด์š”. ์ด๋ ‡๊ฒŒ๋งŒ ๋ด์„œ๋Š” fit๊ณผ์˜ ์ฐจ์ด๋ฅผ ์ž˜ ๋ชจ๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ์•„๋ž˜์˜ ์˜ˆ์‹œ์—์„œ ๊ทธ ์ฐจ์ด์ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”!

์ด๋ฒˆ์—๋Š” ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ratio๋ฅผ ์„ค์ •ํ•˜๊ณ  contentMode๋ฅผ fill๋กœ ์ „๋ถ€ ๋ณ€๊ฒฝํ•˜์˜€์–ด์š”. ์–ด๋– ์‹ ๊ฐ€์š”? ์ด์ œ ์ฐจ์ด์ ์ด ๋ณด์ด์‹œ๋‚˜์š”? ์ด์ฒ˜๋Ÿผ fill์˜ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ทฐ๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์ด๋ฏธ์ง€์˜ ๋น„์œจ์„ ์กฐ์ •ํ•ด์š”. ์œ„์˜ fit์˜ ๊ฒฝ์šฐ์—๋Š” ํ•œ ํ™”๋ฉด ์•ˆ์— ์ด๋ฏธ์ง€๋“ค์„ ๋‹ค ๋‹ด์œผ๋ ค๊ณ  ํ–ˆ๋‹ค๋ฉด, fill์˜ ๊ฒฝ์šฐ์—๋Š” ์ด๋ฏธ์ง€๊ฐ€ ๋ทฐ๋ฅผ ๋„˜์–ด์„œ ๋น„์œจ์— ๋งž์ถฐ ์กฐ์ •๋˜์—ˆ์–ด์š”.

์ •๋ฆฌํ•˜์ž๋ฉด fit์˜ ๊ฒฝ์šฐ์—๋Š” ๋ทฐ๋ฅผ ์ค‘์š”์‹œํ•˜๊ณ , fill์˜ ๊ฒฝ์šฐ์—๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ค‘์š”์‹œ ์—ฌ๊ธด๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ์ดํ•ดํ•˜์‹œ๊ธฐ ์ข€ ๋” ์ˆ˜์›”ํ•˜์‹ค ๊ฑฐ์˜ˆ์š”.

๋งˆ์Šคํ‚น: clipShape()

clipShape() ๋ชจ๋””ํŒŒ์ด์–ด๋Š” SwiftUI์—์„œ ๋ทฐ์˜ ํ˜•ํƒœ๋ฅผ ์ž๋ฅด๊ฑฐ๋‚˜ ๋งˆ์Šคํ‚นํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์š”. ์ด ๋ชจ๋””ํŒŒ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ทฐ ๋‚ด์šฉ์„ ์ง€์ •๋œ ๋ชจ์–‘์œผ๋กœ ์ž๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ๋กœ ๋„ํ˜• ๋ทฐ(์˜ˆ: ์›, ์‚ฌ๊ฐํ˜•) ๋˜๋Š” ๊ฒฝ๋กœ(Path)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ๋ฅผ ์ž˜๋ผ๋‚ด๊ฑฐ๋‚˜ ๋ชจ์–‘์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์š”.

Image("images/MyImage")
	.clipShape(Circle())

๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์–ด์š”! iOS ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ์ด๋ฏธ์ง€ ์ปจํŠธ๋กค์€ ํ•„์ˆ˜์ธ๋ฐ ์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ํ†ตํ•ด์„œ ์ •๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด ์ข‹์•˜์–ด์š”. ํฌ์ŠคํŠธ๋ฅผ ์ฝ์œผ์‹œ๋Š” ๋ถ„๋“ค๋„ ์ •๋ฆฌ๊ฐ€ ๋˜์…จ์œผ๋ฉด ์ข‹๊ฒ ์–ด์š”!

profile
๐ŸŽ๏ธ๐Ÿ’จ Beep Beep

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2024๋…„ 1์›” 16์ผ

๋„ˆ๋ฌด ์ •๋ฆฌ ์ž˜ํ•ด์ฃผ์…จ๋„ค์š”! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ