ํด๋น ๊ธ์ CS ์คํฐ๋์์ ๊ณต๋ถํ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ต๋๋ค.
JDK 1.5๋ถํฐ ๋์ ๋์๋ค.
ํด๋์ค ๋ด๋ถ์์ ์ฌ์ฉํ ๋ฐ์ดํฐ ํ์ ์ ์ธ๋ถ์์ ์ง์ ํ๋ ๊ธฐ๋ฒ์ด๋ค. ์ปดํ์ผ ํ์์ ํ์ ์ ์ฒดํฌํจ์ผ๋ก์จ ์ฝ๋์ ์์ ์ฑ์ ๋์ฌ์ค๋ค.
List<T>
์ T : ํ์
๋งค๊ฐ๋ณ์
List<String> strings = new ArrayList<String>();
์ String : ๋งค๊ฐ๋ณ์ํ๋ ํ์
๋ฐํ์์ด ์๋, ์ปดํ์ผ ํ์์ ๊ฐ๋ ฅํ ํ์ ๊ฒ์ฌ๊ฐ ๊ฐ๋ฅํ๋ค. ํ์ ์์ ์ฑ์ ์ ๊ณตํ๋ค.
์ ๋ค๋ฆญ ๋ฏธ์ฌ์ฉ
List stringList = new ArrayList<>();
stringList.add("hunch");
stringList.add(1);
String result =
(String) stringList.get(0) * (String) stringList.get(1)
//-> ๋ฐํ์ ์๋ฌ!!๐
์ ๋ค๋ฆญ ์ฌ์ฉ
List<String> stringList = new ArrayList<>();
stringList.add("hunch");
stringList.add(1);
//-> ์ปดํ์ผ ์๋ฌ!!๐
๋ง์ฝ ๋งค๋ฒ ์บ์คํ (ํ์ ๋ณํ)์ ํ๊ฒ ๋๋ฉด ๊ท์ฐฎ๊ณ , ๋น ๋จ๋ฆด ์ ์๋ค.
์ ๋ค๋ฆญ์ ์ฐ๋ฉด ์บ์คํ ์ ํ ํ์๊ฐ ์๋ค. ์ฝ๋๋ ๊ฐ๊ฒฐํด์ง๋ค.
์ ๋ค๋ฆญ ๋ฏธ์ฌ์ฉ
List stringList = new ArrayList<>();
stringList.add("hunch");
String result = (String) stringList.get(0);
//-> ๋งค๋ฒ ์บ์คํ
์ด ํ์ํจ๐
์ ๋ค๋ฆญ ์ฌ์ฉ
List<String> stringList = new ArrayList<>();
stringList.add("hunch");
String result = stringList.get(0);
//-> ์บ์คํ
์ํด๋ ๋จ!๐
์ด๋ป๊ฒ ์ ๋ค๋ฆญ ํ์ ์ ์ ์ธํ๊ณ ์์ฑํ ๊น?
class MyArray<T> {
private T element;
public MyArray(T element) {
this.element = element;
}
public T get() {
return element;
}
}
์ฌ์ฉ
MyArray<Integer> myArr = new MyArray<Integer>(1);
// Java SE 7๋ถํฐ ๊ฐ๋ฅํจ.
MyArray<Integer> myArr2 = new MyArray<>(1);
class MyArray<T> {
private T element;
public MyArray(T element) {
this.element = element;
}
//...
public<T> void printArray(T parameter) {
System.out.println("ํด๋์ค ํ๋์ ์ ์๋ ํ์
: " + element.getClass().getName());
System.out.println("๋ฉ์๋ ํ๋์ ์ ์๋ ํ์
: " + parameter.getClass().getName());
}
}
์ฌ์ฉ
MyArray<Integer> myArr = new MyArray<>();
myArr.printArray("ํ๋ผ๋ฏธํฐ");
// ํด๋์ค ํ๋์ ์ ์๋ ํ์
: java.lang.Integer
// ๋ฉ์๋ ํ๋์ ์ ์๋ ํ์
: java.lang.String
List<Object> objectList = new ArrayList<String>();
โ ๋ฌธ๋ฒ์ ํ์ฉ๋์ง ์๋๋ค! ์ปดํ์ผ ์ค๋ฅ!
๋ณ์ฑ์ ์ ๋๋ก ์ดํดํ๋ ค๋ฉด "ํ์ S๊ฐ T์ ํ์ ํ์ ์ผ ๋, Box[S]๊ฐ Box[T]์ ํ์ ํ์ ์ธ๊ฐ?" ๋ผ๋ ์ง๋ฌธ์์ ์์ํ๋๊ฒ ์ข๋ค.
ย ํ์ ์ ๊ณ์ธต ๊ด๊ณ(Type Hierarchy)์์ ์๋ก ๋ค๋ฅธ ํ์ ๊ฐ์ ์ด๋ค ๊ด๊ณ๊ฐ ์๋์ง๋ฅผ ๋ํ๋ด๋ ๊ฐ๋ ์ด๋ค.
<T>
ํ์ S๊ฐ T์ ํ์ ํ์ ์ผ ๋, Box[S]์ Box[T] ์ฌ์ด์ ์์ ๊ด๊ณ๊ฐ ์๋ ๊ฒ
<? extends T>
// Number ๋ฐฐ์ด์ ํ์ ํ์
๊ฐ์ ์ถ๊ฐ
Number[] numbers = new Number[3];
numbers[0] = new Integer(42);
numbers[1] = new Double(3.14);
numbers[2] = new Byte((byte) 0);
// Number ๋ฐฐ์ด์ Interger ๋ฐฐ์ด์ ํ ๋น
Integer[] ints = { 1, 2, 3, 4};
Number[] nums = ints;
ํ์ S๊ฐ T์ ํ์ ํ์ ์ผ ๋, Box[S]๊ฐ Box[T]์ ํ์ ํ์ ์ธ ๊ฒ
<? super T>
ํ์ S๊ฐ T์ ํ์ ํ์ ์ผ ๋, Box[S]๊ฐ Box[T]์ ์์ ํ์ ์ธ ๊ฒ
์ ๋ค๋ฆญ ๊ฐ์ฒด๋ฅผ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ๋, ๊ทธ ๊ฐ์ฒด์ ํ์ ๋ณ์๋ฅผ ์ ํํ๋ ๊ฒ!
@Test
void genericTest() {
List<Integer> list = Arrays.asList(1, 2, 3);
printCollection(list); // ์ปดํ์ผ ์๋ฌ!!๐
}
void printCollection(Collection<Object> c) {
for (Object e : c) {
System.out.println(e);
}
}
์ ๋ค๋ฆญ์ ๋ถ๊ณต๋ณ๐ฅฒ
Collection<Object>
๋ Collection<Integer>
์ ํ์ํ์
์ด ์๋๋ฏ๋ก ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.์ด์ ์์ผ๋์นด๋
ํ์
์ด ์ถ๊ฐ๋์๋ค!
<?>
๋ชจ๋ ํ์ ์ด ๊ฐ๋ฅ!
<? extends MyArray>
MyArray
์ MyArray
์ ํ์ ํ์
!
<? extends Collection>
: Collection
, Map
, List
โฆ<? super MyArray>
MyArray
์ MyArray
์ ์์ ํ์
!
<? super Collection>
: Object
, Iterable
, Collection
โฆproducer
(์์ฑ์) - extends
(์ํ ์ ํ)consumer
(์๋น์) - super
(ํํ ์ ํ)public void pop(Test<? extends String> myArray) {
String element = myArray.get();
//๊บผ๋ด๋ ๊ฑด ๊ฐ๋ฅ!
element.set(new String());
//์ ์ฅ์ ๋ถ๊ฐ!
}
public void push(Test<? super String> myArray) {
element.set(new String());
//์ ์ฅ์ ๊ฐ๋ฅ!
String element = myArray.get();
//๊บผ๋ด๋ ๊ฑด ๋ถ๊ฐ!
}
์ ๋ค๋ฆญ์ ํ์ ์ ์ฌ์ฉ๋ ํ์ ์ ๋ณด๋ฅผ ์ปดํ์ผ ํ์์๋ง ์ฌ์ฉํ๊ณ ๋ฐํ์์๋ ์๊ฑฐํ๋ค!
public static void main(String[] args) {
ArrayList<String> objects = new ArrayList<>();
objects.add("abc");
String s = objects.get(0);
System.out.println("s = " + s);
}
//->์ปดํ์ผ๋ฌ๊ฐ ๋ค์ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ
public static void main(String[] args) {
ArrayList<String> objects = new ArrayList();
objects.add("abc");
String s = (String) objects.get(0); //ํ์
์บ์คํ
System.out.println("s = " + s);
}
Object
๋ก ๋ณ๊ฒฝํด์ค๋ค.Object
bridege method
๋ฅผ ์์ฑํ๋ค.[10๋ถ ํ
์ฝํก] ๊ทธ๋ฆฐ๋ก ์ ์ ๋ค๋ฆญ
Type Erasure Deep Dive
http://www.tcpschool
https://sungjk.github.io/2021/02/20/variance.html
https://www.baeldung
https://jyami.tistory.com/99