generics

  • ์ง€๋„ค๋ฆญ์Šค๋Š” JDK1.5์—์„œ ์ฒ˜์Œ ๋„์ž…๋˜์—ˆ๋‹ค. ์ด์   ์ง€๋„ค๋ฆญ์Šค๋ฅผ ๋ชจ๋ฅด๊ณ ๋Š” JAVA API๋ฌธ์„œ๋ฅผ ์ œ๋Œ€๋กœ ๋ณด๊ธฐ ์–ด๋ ค์šธ๋งŒํผ ์ค‘์š”ํ•œ์œ„์น˜๋ฅผ ์ฐจ์ง€ํ•˜์˜€๋‹ค.

์ง€๋„ค๋ฆญ์Šค๋ž€?

  • ๋ฉ”์„œ๋“œ๋‚˜ ์ปฌ๋ ‰์…˜ํด๋ž˜์Šค์— ์ปดํŒŒ์ผ์‹œ์˜ ํƒ€์ž…์ฒดํฌ๋ฅผ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

  • ๊ฐ์ฒด์˜ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ณ  ํ˜•๋ณ€ํ™˜์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์—ฌ์ค€๋‹ค.

  • ํƒ€์ž…์•ˆ์ •์„ฑ = ์˜๋„ํ•˜์ง€ ์•Š์€ ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š”๊ฒƒ์„ ๋ง‰๊ณ  ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์˜ฌ๋•Œ ์›๋ž˜์˜ ํƒ€์ž…๊ณผ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ์ž˜๋ชป ํ˜•๋ณ€ํ™˜๋˜์–ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ค„์—ฌ์ค€๋‹ค.

์ง€๋„ค๋ฆญ ํด๋ž˜์Šค ์„ ์–ธ

class Box<T> {
	T item;

	void setItem(T item){
		this.item = item;
	}
	T getItem() { 
		return item; 
	}
}
  • T : ํƒ€์ž…๋ณ€์ˆ˜, T๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ๊ฒƒ์„ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. ์ด๋Š” ์ž„์˜์˜ ์ฐธ์กฐํ˜• ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค.

  • ๊ธฐ์กด์—๋Š” Object๋กœ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๊ทธ๋กœ์ธํ•ด ํ˜•๋ณ€ํ™˜์ด ๋ถˆ๊ฐ€ํ”ผ ํ–ˆ๋‹ค ํ—ˆ๋‚˜ ์ด์   Object ๋Œ€์‹  ์›ํ•˜๋Š” ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์„๋•Œ

  • ์œ„์ฒ˜๋Ÿผ ์ง€๋„ค๋ฆญ์ด ๋„์ž…๋˜๊ธฐ ์ด์ „์˜ ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ ์œ„ํ•ด ์˜ˆ์ „๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๊ฒƒ์ด ํ—ˆ์šฉ๋œ๋‹ค๋งŒ, ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

  • ์™ ๋งŒํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ์ž

๋งค๊ฐœ๋ณ€์ˆ˜์™€์˜ ์œ ์‚ฌ์„ฑ

  • Box<String>๊ณผ Box<Integer>๋Š” ์ง€๋„ค๋ฆญ ํด๋ž˜์Šค Box<T>์— ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์„ ๋Œ€์ž…ํ•ด ํ˜ธ์ถœํ•œ ๊ฒƒ์ผ ๋ฟ, ์ด ๋‘˜์ด ๋ณ„๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค. (๊ฐ™์€ ํด๋ž˜์Šค๋ผ๋Š” ๋ง์ด๋‹ค.)

  • ์ปดํŒŒ์ผ ํ›„์— ๋‘˜๋‹ค ๋ชจ๋‘ ์ด๋“ค์˜ ์›์‹œํƒ€์ž…์ธ Box๋กœ ๋ฐ”๋€๋‹ค. ์ง€๋„ค๋ฆญ ํƒ€์ž…์ด ์ œ๊ฑฐ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ง€๋„ค๋ฆญ ํด๋ž˜์Šค์˜ ์ œํ•œ

  • static ๋ฉค๋ฒ„์— ํƒ€์ž…๋ณ€์ˆ˜ T๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

    • T๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋กœ ๊ฐ„์ฃผ๋˜๋Š”๋ฐ static ๋ฉค๋ฒ„๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

    • static๋ฉค๋ฒ„๋Š” ํƒ€์ž…์ด ๋™์ผํ•œ ๊ฒƒ์ด์—ฌ์•ผ ํ•œ๋‹ค. ์–ด๋–ค ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœํ•ด๋„ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ ๊ณต์œ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์ง€๋„ค๋ฆญ ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š”๊ฒƒ๋„ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

    • ๊ทธ ์ด์œ ๋Š” new ์—ฐ์‚ฐ์ž ๋•Œ๋ฌธ์ธ๋ฐ ์ด ์—ฐ์‚ฐ์ž๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์— ํƒ€์ž…T๊ฐ€ ๋ญ”์ง€ ์ •ํ™•ํžˆ ์•Œ์•„์•ผํ•œ๋‹ค. Box<T>๋ฅผ ์ปดํŒŒ์ผ ํ•˜๋Š” ์‹œ์ ์— T๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ด ๋ ์ง€ ์•Œ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— instanceof ๋„ ๊ฐ™์€ ์ด์œ ๋กœ ์‚ฌ์šฉํ• ์ˆ˜ ์—†๋‹ค

์ง€๋„ค๋ฆญ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ

  • Box.java

  • FruitBox.java

  • main.java

์ œํ•œ๋œ ์ง€๋„ค๋ฆญ ํด๋ž˜์Šค

  • ๋งค๊ฐœ๋ณ€์ˆ˜ T์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์˜ ์ข…๋ฅ˜๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

  • ์ œํ•œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํƒ€์ž…์ด ์ง€์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— fruitBox์— Toy๋ฅผ ๋‹ด์„์ˆ˜๋„ ์žˆ๋‹ค

extends ์‚ฌ์šฉ

  • FruitBoxExtendsFruit.java

  • main.java

Fruit์™€ Eatable ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ์ด ์กด์žฌํ•œ๋‹ค๋ฉด

  • Eatable.interface

  • Fruit์˜ ์ž์†์ด๋ฉด์„œ Eatable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค

  • main.java

์™€์ผ๋“œ ์นด๋“œ

  • <? extends T> : ์™€์ผ๋“œ ์นด๋“œ์˜ ์ƒํ•œ ์ œํ•œ, T์™€ ๊ทธ ์ž์†๋“ค๋งŒ ๊ฐ€๋Šฅ

  • <? super T> : ์™€์ผ๋“œ ์นด๋“œ์˜ ํ•˜ํ•œ ์ œํ•œ, T์™€ ๊ทธ ์กฐ์ƒ๋“ค๋งŒ ๊ฐ€๋Šฅ

  • <?> : ์ œํ•œ ์—†์Œ ๋ชจ๋“  ํƒ€์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค <? extends Object ์™€ ๋™์ผ

์™ธ์ผ๋“œ ์นด๋“œ์˜ ํ•„์š”์„ฑ

  • Juice.java

  • Juicer.java

  • main.java

Collections.sort()๋ฅผ ์ด์šฉํ•œ ์ •๋ ฌ

  • Fruit

  • Apple

  • main.java

์ด๋Š” Collections.sort()๋ฅผ ์ด์šฉํ•ด appleBox์— ๋‹ด๊ธด ๊ณผ์ผ์„ ๋ฌด๊ฒŒ๋ณ„๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Collections์˜ ์„ ์–ธ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

์ด๋Š” ์ง€๋„ค๋ฆญ ๋ฉ”์„œ๋“œ์ด๋‹ค. list๋Š” ์ •๋ ฌํ•  ๋Œ€์ƒ, c๋Š” ์ •๋ ฌํ•  ๋ฐฉ๋ฒ•์ด ์ •์˜ ๋œ Comparator์ด๋‹ค. ์ง€๊ธˆ ์™€์ผ๋“œ ์นด๋“œ๊ฐ€ ์‚ฌ์šฉ๋˜์–ด new FruitComp๋กœ๋„ Apple์„ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์ผ ์™€์ผ๋“œ ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด Apple์€ Comparator<Apple>๋กœ Grape๋Š” Comparator<Grape>๋กœ๋งŒ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์„๊ฒƒ์ด๋‹ค. ์ƒˆ๋กœ์šด ๊ณผ์ผ์ด ์ƒ๊ธธ๋•Œ๋งˆ๋‹ค ~Comp.java๋ฅผ ๋งŒ๋“ค์–ด์ค„์ˆ˜๋Š” ์—†์œผ๋‹ˆ ์™€์ผ๋“œ์นด๋“œ๋กœ ํ•˜ํ•œ ์ œํ•œ์„ ํ•ด์ฃผ๋Š”๊ฒƒ์ด๋‹ค.

T์— Apple์ด ๋Œ€์ž…๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

Comparator<? super Apple>์€ Comparator์˜ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Apple๊ณผ ๊ทธ ์กฐ์ƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š”๊ฑฐ๋‹ค. ๊ทธ๋ž˜์„œ new FruitComp๋กœ ๋‹ค๋ฅธ ๊ณผ์ผ๋“ค๋„ ์ •๋ ฌ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ชฐ๋ก  ๊ณผ์ผ์˜ ์กฐ์ƒ์„ Fruit๋กœ ์ƒ์†ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ง€๋„ค๋ฆญ ๋ฉ”์„œ๋“œ

  • ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€์— ์ง€๋„ค๋ฆญ ํƒ€์ž…์ด ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋ผ ํ•œ๋‹ค.

  • ์ง€๋„ค๋ฆญ ํด๋ž˜์Šค์— ์ •์˜๋œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ง€๋„ค๋ฆญ ๋ฉ”์„œ๋“œ์— ์ •์˜ ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ „ํ˜€ ๋ณ„๊ฐœ์˜ ๊ฒƒ์ด๋‹ค.

  • static ๋ฉค๋ฒ„์—๋Š” ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋ฉ”์„œ๋“œ์— ์ง€๋„ค๋ฆญ ํƒ€์ž…์„ ์„ ์–ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์ด ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋งŒ ์ง€์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— static ์ด๋“  ์•„๋‹ˆ๋“  ์ƒ๊ด€์ด ์—†๋‹ค.

  • makeJuice๋ฅผ ์ง€๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋กœ ๋ฐ”๊พธ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋• ์•„๋ž˜์™€ ๊ฐ™์ด ํƒ€์ž… ๋ณ€์ˆ˜์— ํƒ€์ž…์„ ๋Œ€์ž…ํ•ด์•ผ ํ•œ๋‹ค.

  • ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์–ด ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค.

  • ํ•œ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์€ ์ง€๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋Œ€์ž…๋œ ํƒ€์ž…์„ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜๋‚˜ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‹จ์ง€ ๊ธฐ์ˆ ์ ์ธ ์ด์œ ์ด๋ฏ€๋กœ ์ง€์ผœ์•ผํ•œ๋‹ค.

  • ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ๋ณต์žกํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

์ง€๋„ค๋ฆญ ํƒ€์ž…์˜ ํ˜•๋ณ€ํ™˜

  • ์ง€๋„ค๋ฆญ ํƒ€์ž…๊ณผ ์ง€๋„ค๋ฆญ ํƒ€์ž…์ด ์•„๋‹Œ ํƒ€์ž…๊ฐ„์˜ ํ˜•๋ณ€ํ™˜์€ ํ•ญ์ƒ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ํ•˜์ง€๋งŒ ๋Œ€์ž…๋œ ํƒ€์ž…์ด ๋‹ค๋ฅธ ์ง€๋„ค๋ฆญ ํƒ€์ž… ๊ฐ„์—๋Š” ํ˜•๋ณ€ํ™˜์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

Optional ํด๋ž˜์Šค

  • ์ •๋ฆฌํ•˜๋ฉด Optional<Object>๋ฅผ Optional<String>์œผ๋กœ ์ง์ ‘ ํ˜•๋ณ€ํ™˜ ํ•˜๋Š”๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์™€์ผ๋“œ ์นด๋“œ๊ฐ€ ํฌํ•จ๋œ ์ง€๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ ํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

  • ์ฐธ๊ณ ๋กœ ์™€์ผ๋“œ ์นด๋“œ๊ฐ€ ์‚ฌ์šฉ๋œ ์ง€๋„ค๋ฆญ ํƒ€์ž…๋ผ๋ฆฌ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋งŒ ๋ฏธํ™•์ • ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋Š” ๊ฒฝ๊ณ ๊ฐ€ ๋œฌ๋‹ค.

์ง€๋„ค๋ฆญ ํƒ€์ž…์˜ ์ œ๊ฑฐ

  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ง€๋„ค๋ฆญ ํƒ€์ž…์„ ์ด์šฉํ•ด ์†Œ์ŠคํŒŒ์ผ์„ ์ฒดํฌ ํ•œ๋’ค ํ•„์š”ํ•œ ๊ณณ์— ํ˜•๋ณ€ํ™˜์„ ๋„ฃ์–ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€๋„ค๋ฆญ ํƒ€์ž…์„ ์ œ๊ฑฐํ•œ๋‹ค.

  • ์ฆ‰ ์ปดํŒŒ์ผ๋œ .class ํŒŒ์ผ์—๋Š” ์ง€๋„ค๋ฆญ ํƒ€์ž…์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†๋‹ค.

  • ๊ทธ ์ด์œ ๋Š” ์ง€๋„ค๋ฆญ์ด ๋„์ž…๋˜๊ธฐ ์ด์ „์˜ ์†Œ์Šค์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

  • ์ง€๋„ค๋ฆญ ํƒ€์ž…์˜ ์ œ๊ฑฐ ๊ณผ์ •์€ ๊ฝค ๋ณต์žกํ•˜๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์ œ๊ฑฐ ๊ณผ์ •๋งŒ ์•Œ์•„๋ณด์ž.

  1. ์ง€๋„ค๋ฆญ ํƒ€์ž…์˜ ๊ฒฝ๊ฒŒ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ์ง€๋„ค๋ฆญ ํƒ€์ž…์ด <T extends Fruit> ๋ผ๋ฉด T๋Š” Fruit๋กœ ์น˜ํ™˜๋˜๊ณ  <T>์ธ ๊ฒฝ์šฐ๋Š” Object๋กœ ์น˜ํ™˜๋œ๋‹ค. ํด๋ž˜์Šค์˜†์˜ ์„ ์–ธ์€ ์ œ๊ฑฐ๋œ๋‹ค.

  2. ์ง€๋„ค๋ฆญ ํƒ€์ž…์„ ์ œ๊ฑฐํ•œ ํ›„์— ํƒ€์ž…์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜•๋ณ€ํ™˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ์œ„์™€๊ฐ™์ด ์™€์ผ๋“œ ์นด๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ์ ˆํ•œ ํƒ€์ž…์œผ๋กœ์˜ ํ˜•๋ณ€ํ™˜์ด ์ถ”๊ฐ€๋œ๋‹ค.

Last updated