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 ํ์ผ์๋ ์ง๋ค๋ฆญ ํ์ ์ ๋ํ ์ ๋ณด๊ฐ ์๋ค.
๊ทธ ์ด์ ๋ ์ง๋ค๋ฆญ์ด ๋์ ๋๊ธฐ ์ด์ ์ ์์ค์ฝ๋์์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด์์ด๋ค.
์ง๋ค๋ฆญ ํ์ ์ ์ ๊ฑฐ ๊ณผ์ ์ ๊ฝค ๋ณต์กํ๋ค. ๊ธฐ๋ณธ์ ์ธ ์ ๊ฑฐ ๊ณผ์ ๋ง ์์๋ณด์.
์ง๋ค๋ฆญ ํ์ ์ ๊ฒฝ๊ฒ๋ฅผ ์ ๊ฑฐํ๋ค. ์ง๋ค๋ฆญ ํ์ ์ด <T extends Fruit> ๋ผ๋ฉด T๋ Fruit๋ก ์นํ๋๊ณ <T>์ธ ๊ฒฝ์ฐ๋ Object๋ก ์นํ๋๋ค. ํด๋์ค์์ ์ ์ธ์ ์ ๊ฑฐ๋๋ค.
์ง๋ค๋ฆญ ํ์ ์ ์ ๊ฑฐํ ํ์ ํ์ ์ด ์ผ์นํ์ง ์์ผ๋ฉด ํ๋ณํ์ ์ถ๊ฐํ๋ค.
์์๊ฐ์ด ์์ผ๋ ์นด๋๊ฐ ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ํ ํ์ ์ผ๋ก์ ํ๋ณํ์ด ์ถ๊ฐ๋๋ค.
Last updated