Week14(Generic)

์ œ๋„ค๋ฆญ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

์ œ๋„ค๋ฆญ์€ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํƒ€์ž…์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก, ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜(generic type)์„ ์ด์šฉํ•˜์—ฌ ์„ ์–ธํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณธ ๋–  ์ฐ์–ด๋‚ด๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ‹€์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค. ์ž๋ฐ”์—์„œ์˜ ์ œ๋„ค๋ฆญ์€ ํด๋ž˜์Šค ์ฝ”๋“œ๋ฅผ ์ฐ์–ด๋‚ด๋“ฏ์ด ์ƒ์‚ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ผ๋ฐ˜ํ™”(generic)์‹œํ‚ค๋Š” ๋„๊ตฌ์ด๋‹ค.

+์ œ๋„ค๋ฆญ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜

์—ฌ๊ธฐ์„œ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜์™€ ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋Œ€๋ฌธ์ž๋ฅผ ์‚ฌ์šฉ

  • E : Element์„ ์˜๋ฏธํ•˜์—ฌ ์ปฌ๋ ‰์…˜์—์„œ ์š”์†Œ์ž„์„ ๋‚˜ํƒ€๋ƒ„

  • T : Type์„ ์˜๋ฏธ

  • V : Value์„ ์˜๋ฏธ

  • K : Key์„ ์˜๋ฏธ

์ œ๋„ค๋ฆญ ์ปฌ๋ ‰์…˜ ์ƒ์„ฑ

๋ฒกํ„ฐ ์ƒ์„ฑํ•  ๋•Œ, Vector ์˜ E์— ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ํƒ€์ž…์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ •์ˆ˜ ๊ฐ’๋งŒ ์‚ฝ์ž… ๊ฐ€๋Šฅํ•œ ๋ฒกํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋ฉด ๋‹ค์Œ ๊ณผ ๊ฐ™์ด E์— Integer๋ฅผ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉ๊ฐ€๋Šฅ

Vector<Integer> v = new Vector<Integer>();

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ๋„ฃ์–ด์ค˜์•ผํ•˜๋Š”๋ฐ

int, char, double ๋“ฑ์˜ ๊ธฐ๋ณธ ํƒ€์ž…์€ E์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

Vector<int> v = new Vector<int>();

->์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋Š” ์ƒ์„ฑ๋œ ๋ฒกํ„ฐ์˜ ์šฉ๋Ÿ‰์„ ๊ตณ์ด ์•Œ ํ•„์š” ์—†๋‹ค. ์ปฌ๋ ‰์…˜์€ ์ž์‹ ์˜ ์šฉ๋Ÿ‰์„ ์Šค์Šค๋กœ ์กฐ์ ˆํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๊ฒŒ ๋˜ ์ œ๋„ค๋ฆญ์˜ ์žฅ์ ์ด๋‹ค

Vector E ํด๋ž˜์Šค์˜ ์ฃผ์š”๋œ ๋ฉ”์†Œ๋“œ

  • boolean add(E element)

    • ๋ฒกํ„ฐ์˜ ๋งจ ๋’ค์— element ์ถ”๊ฐ€

  • void add(int index, E element)

    • ์ธ๋ฑ์Šค index์— element๋ฅผ ์‚ฝ์ž…

  • int capacity()

    • ํ˜„์žฌ ๋ฒกํ„ฐ์˜ ์šฉ๋Ÿ‰์„ ๋ฆฌํ„ด

  • void clear()

    • ๋ฒกํ„ฐ์˜ ๋ชจ๋“  ์š”์†Œ ์‚ญ์ œ

  • boolean contains(Object o)

    • ๋ฒกํ„ฐ๊ฐ€ ์ง€์ •๋œ ๊ฐ์ฒด๋ฅผ o์ด ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋ฉด true๋ฅผ ๋ฆฌํ„ด

  • E elementAt(int index)

    • index ์œ„์น˜์—์„œ์˜ ์š”์†Œ ๋ฆฌํ„ด

  • E get(int index)

    • index ์œ„์น˜์—์„œ์˜ ์š”์†Œ ๋ฆฌํ„ด

  • E remove(int index)

    • index ์œ„์น˜์—์„œ์˜ ์š”์†Œ ์‚ญ์ œ

  • int size()

    • ๋ฒกํ„ฐ๊ฐ€ ํฌํ•จ๋˜๋Š” ์š”์†Œ์˜ ๊ฐฏ์ˆ˜ ๋ฆฌํ„ด

๋ฒกํ„ฐ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ

๋ฒกํ„ฐ์—์„œ์˜ ์‚ฝ์ž…์€ ๋ฒกํ„ฐ์˜ ๋์ด๋‚˜ ์ค‘๊ฐ„์— ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Œ

์ œ๋„ค๋ฆญ ๋งŒ๋“ค๊ธฐ

์ œ๋„ค๋ฆญ ํด๋ž˜์Šค

๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ฐจ์ด์ ์ด ์žˆ๋‹ค๋ฉด ํด๋ž˜์Šค ์ด๋ฆ„ ๋‹ค์Œ์— ์ผ๋ฐ˜ํ™”๋œ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ <> ์‚ฌ์ด์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

์ œ๋„ค๋ฆญ ๋ฉ”์†Œ๋“œ

ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ ์„ ์–ธ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋ฉฐ ๋‹ค๋ฅธ ํƒ€์ž…๋“ค์„ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ํ˜ธ์ถœ ๋  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋ฐฐ์—ด์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ œ๋„ค๋ฆญ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ์˜ˆ์ œ

์—ฌ๊ธฐ์„œ ๋ณด๋ฉด ๋ฉ”์†Œ๋“œ๋Š” ํ•˜๋‚˜์ด์ƒ์˜ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋ชจ๋“  ์ œ๋„ค๋ฆญ ํƒ€์ž…๋“ค์ด ๋ฉ”์†Œ๋“œ์˜ ๋ฆฌํ„ด ํƒ€์ž… ์ „ ์œ„์น˜์— ์ถ”๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค.

Bounded Type Parameter

ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์€ bound๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, bound๋œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์ œํ•œ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๊ณ , ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป

WildCard

์ž๋ฐ”์—์„œ ์™€์ผ๋“œ ์นด๋“œ๋Š” "?"์œผ๋กœ ํ‘œ์‹œํ•˜๋ฉฐ ์•Œ ์ˆ˜ ์—†๋Š” ํƒ€์ž…์„ ์˜๋ฏธํ•  ๋–„ ์‚ฌ์šฉ๋œ๋‹ค. ์™€์ผ๋“œ ์นด๋“œ๋Š” ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…, ํ•„๋“œ ๊ทธ๋ฆฌ๊ณ  ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ๋‹ค.

Object๋Š” ๋ชจ๋“  ์ž๋ฐ” ํด๋ž˜์Šค๋“ค์˜ ๋ถ€๋ชจ ํƒ€์ž…์ด๊ธด ํ•˜์ง€๋งŒ Object ์ปฌ๋ ‰์…˜์ด ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜๋“ค์˜ ๋ถ€๋ชจ๋Š” ์•„๋‹ˆ๋‹ค.

LIst ํƒ€์ž…์˜ ๋ณ€์ˆ˜์— List๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๊ธฐ ๋–„๋ฌธ์— ๊ฐ™์€ ์ปฌ๋ ‰์…˜์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…๋“ค์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

Upper Bounded Wildcards

์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ œํ•œ์„ ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ "?" ์„ extends ํ‚ค์›Œ๋“œ ์•ž์— ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ sumOfList ํ•จ์ˆ˜๋Š” Number์˜ sub type๊นŒ์ง€ ๋‹ค ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

Unbounded Wildcards

printList๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž, printListํ•จ์ˆ˜์˜ ๋ชฉ์ ์€ ์–ด๋А ํƒ€์ž…์ด๋“ ์ง€ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•จ์ด์ง€๋งŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์€ ์˜ค์ง Object์˜ list๋งŒ ์ถœ๋ ฅํ•˜๊ธฐ ๋–„๋ฌธ์ด๋‹ค. ์ฆ‰, List, List๋“ฑ ์ด๋Ÿฐ ๊ฒƒ๋“ค์„์€ List์˜ ์„œ๋ธŒํƒ€์ž…์ด ์•„๋‹ˆ๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์ด ํ•จ์ˆ˜๋ฅผ

์ด๋ ‡๊ฒŒ ์™€์ผ๋“œ์นด๋“œ์ธ "?" ์„ ์‚ฌ์šฉํ•ด์ค˜์„œ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค!

Lower Bounded Wildcards

์›๋ž˜ upper bounded wildcard๊ฐ€ ๋ชจ๋ฅด๋Š” ํƒ€์ž…์„ ์ž์„ธํ•œ ํƒ€์ž…์ด๋‚˜ ์„œ๋ธŒํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š๋„๋ก ์ œํ•œํ–ˆ์œผ๋ฉฐ, extends ํ‚ค์›Œ๋“œ ์•ž์—์„œ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด lower bounded wildcard๋Š” ํ•ด๋‹น ํƒ€์ž…์˜ super ํƒ€์ž…๊นŒ์ง€ ํ—ˆ์šฉํ•ด์ฃผ๋ฉฐ, super ํ‚ค์›Œ๋“œ ์•ž์— ์™€์ผ๋“œ์นด๋“œ์ธ "?" ์„ ๋ถ™ํ˜€์„œ ์‚ฌ์šฉํ•œ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด์„œ Integer์˜ lists์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ๋˜๋ฉด

List<? super Integer> ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•จ์œผ๋กœ์จ

Integer์˜ superํƒ€์ž…์ธ Integer, Number, Ojbect์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ƒฅ List ์ด๋ ‡๊ฒŒ ์“ฐ๋Š”๊ฒƒ๋ณด๋‹ค ๋ฒ”์šฉ์„ฑ์ด ๋„“์–ด์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

Erasure Type

์ œ๋„ค๋ฆญ์€ ์ž๋ฐ” ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•จ์— ์žˆ์–ด์„œ ์ปดํŒŒ์ผ ์‹œ, ๋” ๋นก๋นกํ•œ ํƒ€์ž… ์ฒดํฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์ œ๋„ค๋ฆญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋„์™€์ค€๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปดํŒŒ์ผ ์‹œ, ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด์„œ type erasure๋ผ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ ์šฉํ•œ๋‹ค

  • ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ๊ทธ๋“ค์˜ ๋ฒ”์ฃผ์•ˆ์—์„œ ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

  • ํƒ€์ž…์˜ ์•ˆ์ „์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ํƒ€์ž… ์บ์ŠคํŠธ๋ฅผ ์ง„ํ–‰

์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด์„œ ํ™•์ธ

์ด๋ ‡๊ฒŒ ์ง„ํ–‰์„ ํ•˜๋ ค๊ณ ํ•˜๋ฉด

ํƒ€์ž… ์ด๋ ˆ์ด์ €๊ฐ€ ์ ์šฉ๋˜๋ฉด์„œ ํŠน์ • ํƒ€์ž…์œผ๋กœ ์ œํ•œ๋˜์ง€ ์•Š์€ T๋ฅผ ์œ„์™€ ๊ฐ™์ด Object๋กœ ๋Œ€์ฒด๋œ๋‹ค

๋งŒ์•ฝ

์ด๋ ‡๊ฒŒ ํƒ€์ž…์ด ์ œํ•œ๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ์ด ํƒ€์ž…์€ ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ์ œํ•œ๋œ ํƒ€์ž…์œผ๋กœ ๊ต์ฒด

์ด๋ ‡๊ฒŒ ์ œ๋„ค๋ฆญ์— ๊ด€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๊ณ , ์ œ๋„ค๋ฆญ์€ ํƒ€์ž…์˜ ์ •ํ™•์„ฑ์„ ์ •ํ™•ํ•˜๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ํ•˜์—ฌ๊ธˆ ์ถ”๊ฐ€์ ์ธ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ์ œ๋„ค๋ฆญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌํ˜„์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋„์™€์ฃผ๋Š”๊ฑฐ ๊ฐ™๋‹ค

์ฐธ๊ณ ์‚ฌ์ดํŠธ

๋ช…ํ’ˆ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ํ™ฉ๊ธฐํƒœ

https://sthwin.tistory.com/22

https://medium.com/์Šฌ๊ธฐ๋กœ์šด-๊ฐœ๋ฐœ์ƒํ™œ/java-generic-์ž๋ฐ”-์ œ๋„ค๋ฆญ-f4343fa222df

https://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

https://docs.oracle.com/javase/tutorial/java/generics/erasure.html

Last updated

Was this helpful?