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<Integer> v = new Vector<Integer>(5);

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

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()

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

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

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

import java.util.Vector;

public class vTest {
    public static void main(String[] args) {
        Vector<Integer> v = new Vector<>();

        //์›๋ž˜๋Š” ์ •์ˆ˜๋ฅผ Integer ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฝ์ž…
        v.add(new Integer(1));
        v.add(new Integer(2));

        //์ž๋™ ๋ฐ•์‹ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ๊ตณ์ด Integer ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋˜์–ด ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ์Œ
        v.add(3);
        v.add(4);

        //๋งŒ์•ฝ ์—ฌ๊ธฐ์—์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด ํƒ€์ž…์„ ๋„ฃ์„๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธด๋‹ค
//        v.add("hello");
//        v.add(new Double(3,5));

        //๋ฒกํ„ฐ์—๋Š” null๋„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒกํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ null์ด ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ์Œ
        v.add(null);

        //์›ํ•˜๋Š” ์œ„์น˜์— ๋ฒกํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๊ฐœ์˜ ์ธ์ž๋ฅผ ๊ฐ€์ง„ ํ•จ์ˆ˜์‚ฌ์šฉ
        //์ด๋ ‡๊ฒŒ ๋˜๋ฉด 2๋ฒˆ์งธ ์œ„์น˜์— 100์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.
        v.add(2, 100);
        //1, 2, 100, 3, 4 ์—ฌ๊ธฐ๊นŒ์ง€ ํ•ด๋‘์–ด์•ผํ•จ

        //์ธ๋ฑ์Šค์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
        //๋ฒกํ„ฐ์—์„œ์˜ 3๋ฒˆ์งธ ๊ฐ’์ด ์—†์–ด์ ธ์•ผํ•˜๋‹ˆ๊นŒ 3์ด ์—†์–ด์ ธ์•ผ ํ•œ๋‹ค
        v.remove(3);

        for(int i=0; i<v.size(); i++){
            System.out.println(v.get(i));
        }
    }
}

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

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

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

import java.util.Vector;

public class vTest {
    //์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์ด๋ฉฐ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” T
    static class MyClass<T>{
        //๋ณ€์ˆ˜ val์˜ ํƒ€์ž…์€ T
        T val;
        void set(T a){
            val = a;
        }
        T get(){
            return val;
        }
    }
    public static void main(String[] args) {
        //T์ž๋ฆฌ์— ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ๋„ฃ์–ด์ฃผ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
        MyClass<String> s = new MyClass<String>();

        //์ด๋ ‡๊ฒŒ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ  ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.
        s.set("HELLO!");
        System.out.println(s.get());

        //๊ตฌ์ฒดํ™”ํ•  ๋•Œ๋Š” ๊ธฐ๋ณธํƒ€์ž…์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ(๋ฐ”๋กœ ๋ฐ‘ ์ฃผ์„)
        //MyClass<int> i = new MyClass<int>();
        MyClass<Integer> i = new MyClass<Integer>();
        i.set(5);
        System.out.println(i.get());
    }
}

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

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

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

public <T> List<T> fromArrayToList(T[] a){
  return Arrays.stream(a).collect(Collectors.toList());
}

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

Bounded Type Parameter

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

public class Box<T> {
    private T t;
    public void set(T t){
        this.t =t;
    }
    public T get() {
        return t;
    }

    public <U extends Number> void inspect(U u){
        //์—ฌ๊ธฐ์„œ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ U์„ Number๋กœ ์ œํ•œํ–ˆ์Œ -> extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ
        //์ด๋ ‡๊ฒŒ ๋˜๋ฉด U์—๋Š” Integer๋‚˜, Float, Double์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋“ค๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ
        System.out.println("T: "+t.getClass().getName());
        System.out.println("U: "+u.getClass().getName());
    }

    public static void main(String[] args) {
        Box<Integer> ibox = new Box<Integer>();
        ibox.set(10);
        //๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ ๋ฐ‘์˜ ์ฃผ์„๋ถ€๋ถ„์€ ์—๋Ÿฌ๊ฐ€ ๋‚ ์ˆ˜๋ฐ–์— ์—†๋‹ค
        //ibox.inspect("some text");
    }
}

WildCard

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

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

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

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

Upper Bounded Wildcards

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

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

public static double sumOfList(List<? extends Number> list) {
    double s = 0.0;
    for (Number n : list)
        s += n.doubleValue();
    return s;
}
List<Integer> li = Arrays.asList(1, 2, 3);
System.out.println("sum = " + sumOfList(li));
List<Double> ld = Arrays.asList(1.2, 2.3, 3.5);
System.out.println("sum = " + sumOfList(ld));

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

Unbounded Wildcards

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

public static void printList(List<Object> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

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

public static void printList(List<?> list) {
    for (Object elem: list)
        System.out.print(elem + " ");
    System.out.println();
}

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

List<Integer> li = Arrays.asList(1, 2, 3);
List<String>  ls = Arrays.asList("one", "two", "three");
printList(li);
printList(ls);

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

Lower Bounded Wildcards

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

public static void addNumbers(List<? super Integer> list) {
    for (int i = 1; i <= 10; i++) {
        list.add(i);
    }
}

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

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

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

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

Erasure Type

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

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

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

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

public <T> List<T> genericMethod(List<T> list) { 
  return list.stream().collect(Collectors.toList()); 
}

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

public <T> List<T> genericMethod(List<Object> list) { 
  return list.stream().collect(Collectors.toList()); 
}

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

๋งŒ์•ฝ

public <T extends Building> void genericMethod(T t){
    ...
}

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

public void genericMethod(Building t){
    ...
}

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

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

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

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?