JAVA & OOP

JAVA :: ์ œ๋„ค๋ฆญ์Šค(Generics) ๊ฐœ๋… ์ •๋ฆฌ

DAHLIA CHOI 2021. 10. 1. 01:05

 

 

 

์ œ๋„ค๋ฆญ์Šค(Generics)๋ž€?

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

 

ArrayList๊ฐ™์€ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ณดํ†ต ํ•œ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋งŒ ๋‹ด๋Š”๋‹ค. 
ํ•œ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋งŒ ๋‹ด๊ธฐ๋ฅผ ์›ํ•  ๋•Œ ์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜•๋ณ€ํ™˜์„ ์•ˆํ•ด๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ‘‰ ์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ

ArrayList<E> list = new ArrayList<E>();
list.add(10);
list.add("10");

String word = (String)list.get(1);
์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด Object๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ณ , ์•ˆ์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ผ ๋•Œ๋งˆ๋‹ค ํ˜•๋ณ€ํ™˜์„ ํ•ด์ค˜์•ผํ•œ๋‹ค. 

 

๐Ÿ‘‰ ์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ

ArrayList<String> list = new ArrayList<String>();
list.add("10");
list.add("20");

String word = list.get(0);
์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํƒ€์ž…์ง€์ •์„ ํ•ด์ฃผ๊ณ , ํ˜•๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ปฌ๋ž™์…˜ ํด๋ž˜์Šค๋Š” ๋ณดํ†ต ํ•œ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋งŒ ๋‹ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ํŽธ๋ฆฌํ•˜๋‹ค.

 

 

 

โœ ์ œ๋„ค๋ฆญ์Šค ์‚ฌ์šฉ ์žฅ์ 

  • ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. ( ์ฝ”๋“œ๋ฅผ ์ž˜๋ชป ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฐ”๋กœ๋ฐ”๋กœ  ์ฒดํฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.)
  • ํƒ€์ž…์ฒดํฌ์™€ ํ˜•๋ณ€ํ™˜์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด ์ง„๋‹ค.

 

 

 

[ ๋‹คํ˜•์„ฑ ]

์ œ๋„ค๋ฆญ ํƒ€์ž…์€ ํ•ญ์ƒ ๊ฐ™์•„์•ผ๋œ๋‹ค.

 

 

ArrayList<Tv> list = new ArrayList<Tv>(); --> OK

ArrayList<์กฐ์ƒ ํด๋ž˜์Šค> list = new ArrayList<์ž์† ํด๋ž˜์Šค>(); --> ERROR
์ด๋ ‡๊ฒŒ ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด ์กฐ์ƒํด๋ž˜์Šค์™€ ์ž์†ํด๋ž˜์Šค๋กœ ๋‹ค๋ฅด๊ฒŒ ์ž…๋ ฅ๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
์ œ๋„ค๋ฆญ ํด๋ž˜์Šค๋Š” ๋ฌด์กฐ๊ฑด ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด ์ผ์น˜ํ•ด์•ผ๋œ๋‹ค.

 

 

ํ•˜์ง€๋งŒ, ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค, ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋‹คํ˜•์„ฑ์€ ์„ฑ๋ฆฝํ•œ๋‹ค.

 

 

๐Ÿ‘‰ ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค๊ฐ„์˜ ๋‹คํ˜•์„ฑ

 

List<Tv> list = new ArrayList<Tv>();
List<Tv> list = new LinkedList<Tv>(); --> ๋‘˜ ๋‹ค OK

 

 

๐Ÿ‘‰ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋‹คํ˜•์„ฑ

 

ArrayList<์กฐ์ƒํด๋ž˜์Šค> list = new ArrayList<์กฐ์ƒํด๋ž˜์Šค>();
list.add(new ์ž์†ํด๋ž˜์Šค()); --> OK

 

 

 

[ Iterator, HashMap with Generics ]

 

Iterator์™€ HashMap์„ ์‚ฌ์šฉํ•  ๋•Œ๋„ ์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

โญ Iterator ์‚ฌ์šฉ

์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์–ด๋–ค ์ปฌ๋ ‰์…˜์ธ์ง€ ์ƒ๊ด€์—†์ด ๊ฐ’์„ ์ฝ์–ด์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค!

 

๋ฉ”์„œ๋“œ์—๋Š” hasNext(), next(), remove()๊ฐ€ ์žˆ๋‹ค.

 

  • hasNext() : ์ฝ์–ด์˜ฌ ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒ๋‹จํ•ด์ค€๋‹ค. (ture or false)
  • next() : ๋‹ค์Œ์œผ๋กœ ์ฝ์„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
  • remove() : next๋กœ ๋ถˆ๋Ÿฌ์˜จ ๊ฐ’ ์‚ญ์ œํ•ด์ค€๋‹ค.

 

์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์ œ๋„ค๋ฆญ์Šค๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด์ž๋ฉด

 

ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("2");

Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String s = it.next();
    System.out.println(s);
    // ์ค„์—ฌ์„œ System.out.println(it.next());๋„ ๊ฐ€๋Šฅ
    
    //๋งŒ์•ฝ ์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ํ˜•๋ณ€ํ™˜ํ•ด์ค˜์•ผ๋จ
    String s = (String)it.next();
}
์ด๋ ‡๊ฒŒ ์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜•๋ณ€ํ™˜ ๊ณผ์ • ์—†์ด ๊ฐ’์„ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

โญ HashMap ์‚ฌ์šฉ

HashMap์—๋Š” get(), put(), remove() ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ํ•ญ์ƒ ํ˜•๋ณ€ํ™˜์„ ํ•ด์•ผ๋˜๋Š”๋ฐ ์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜•๋ณ€ํ™˜ ์—†์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ!

 

HashMap<String, ํด๋ž˜์Šค ์ด๋ฆ„> map = new HashMap<>(); //<>์—ฌ๊ธฐ ์•ˆ์— ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ. ์–ด์ฐจํ”ผ ์•ž์˜ <>์™€ ๊ฐ™์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

map.put("key1", new ํด๋ž˜์Šค์ด๋ฆ„("A", 1,2));

ํด๋ž˜์Šค ์ด๋ฆ„ c = map.get("key1");

// ์ œ๋„ค๋ฆญ์Šค ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ

ํด๋ž˜์Šค ์ด๋ฆ„ c = (ํด๋ž˜์Šค ์ด๋ฆ„)map.get("key1"); //ํ˜•๋ณ€ํ™˜

 

 

 

 

[ ์ œํ•œ๋œ ์ œ๋„ค๋ฆญ์Šค ]

์ œ๋„ค๋ฆญ์Šค๋Š” ํ•œ ์ข…๋ฅ˜์˜ ํƒ€์ž…๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ œํ•œ์„ ๋‘๋ฉด ์—ฌ๋Ÿฌ ํƒ€์ž…๋„ ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

extends๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์กฐ์ƒ๋ถ€ํ„ฐ ๊ทธ ์ž์†๋“ค๊นŒ์ง€ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

class Box<T extends Fruit>{}

Box<Apple> appleBox = new Box<Apple>(); --> OK
Fruit๋ฅผ ์ƒ์†๋ฐ›๋Š” ์ž์†๋“ค๊ณผ Fruit ํด๋ž˜์Šค๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

 

 

[ ์ œ๋„ค๋ฆญ์Šค ์ œ์•ฝ ]

 

โ—ผ static ๋ฉค๋ฒ„์—๋Š” ํƒ€์ž… ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

class Box<T> {
    static T item;  --> ERROR
    static int compare(T t1, T t2){}  --> ERROR
}

 

 

 

โ—ผ ๋ฐฐ์—ด ์ƒ์„ฑํ•  ๋•Œ ํƒ€์ž… ๋ณ€์ˆ˜ ์‚ฌ์šฉ๋ถˆ๊ฐ€ (์ฐธ์กฐ ๋ณ€์ˆ˜๋Š” ๊ฐ€๋Šฅ)

class Box<T> {

    T[] toArray(){
        T[] tmpArr = new T[itemArr.length]; --> ERROR
        }
}

 

 

 

 

 

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

 

์™€์ผ๋“œ ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๋กœ ๋Œ€์ž…๋œ ํƒ€์ž…์ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์›๋ž˜ ๊ทœ์น™์€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด ํ•ญ์ƒ ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค! ํ•˜์ง€๋งŒ ์™€์ผ๋“œ ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ดœ์ฐฎ๋‹ค

 

โ—ผ <? extends T>

T์™€ ๊ทธ ์ž์†๋“ค๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ArrayList<? extends Fruit> list = new ArrayList<Apple>();

 

 

โ—ผ <? super T>

T์™€ ๊ทธ ์กฐ์ƒ๋“ค๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

ArrayList<? super Apple> list = new ArrayList<Fruit>();

 

 

โ—ผ <?>

๋ชจ๋‘ ๋‹ค ๊ฐ€๋Šฅํ•˜๋‹ค. 

<? extends Object>์™€ ๊ฐ™์€ ์˜๋ฏธ

 

 

 

 

 

[ ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ ]

์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ• ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ๋Œ€ํ•ฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ œ๋„ค๋ฆญ ํƒ€์ž…์˜ ์„ ์–ธ ์œ„์น˜๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž… ๋ฐ”๋กœ ์•ž์— ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค.

static <T> void sort(List<T> list, Comparator<? super T> c)

 

โญ ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์— ์ •์˜๋œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ์— ์ •์˜๋œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ชจ์–‘์€ ๊ฐ™์ง€๋งŒ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฒƒ์ด๋‹ค!!

 

class Box<T> {
      static <T> void sort (List<T> list, Comparator<? super T> c)
}
์œ„์— ์žˆ๋Š” T๋Š” ๋ชจ์–‘์€ ๊ฐ™์ง€๋งŒ ์ „ํ˜€ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•œ๋‹ค!!
์™€์ผ๋“œ ์นด๋“œ๋Š” ํ•˜๋‚˜์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์ด ๋Œ€์ž…๋œ ์—ฌ๋Ÿฌ ์ œ๋„ค๋ฆญ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๊ณ ,
์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ๋Œ€ํ•ฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ๊ฒƒ์ด๋‹ค.

 

 

 

 

 


์ œ๋„ค๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ผ์ด ๋งŽ์•„์งˆ ๊ฒƒ ๊ฐ™์•„์„œ ๊ฐœ๋… ์ •๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ ํ•ด๋ณด์•˜๋‹ค...

์ต์ˆ™ํ•ด์ง€๋ ค๋ฉด ์˜ค๋ž˜๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋ณด๊ณ  ๋˜ ๋ณด๋ฉด์„œ ์ •๋ฆฌํ•ด์•ผ๊ฒ ๋‹ค๐Ÿ˜ƒ