์ ๋ค๋ฆญ์ค(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๋ ๋ชจ์์ ๊ฐ์ง๋ง ์ ํ ๋ค๋ฅธ ์ญํ ์ ํ๋ค!!
์์ผ๋ ์นด๋๋ ํ๋์ ์ฐธ์กฐ๋ณ์๋ก ์๋ก ๋ค๋ฅธ ํ์ ์ด ๋์ ๋ ์ฌ๋ฌ ์ ๋ค๋ฆญ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๊ฒ์ด๊ณ ,
์ ๋ค๋ฆญ ๋ฉ์๋๋ ๋ฉ์๋๋ฅผ ํธ์ถ ํ ๋๋ง๋ค ๋ค๋ฅธ ์ ๋ค๋ฆญ ํ์ ์ ๋ํฉํ ์ ์๊ฒ ํ ๊ฒ์ด๋ค.
์ ๋ค๋ฆญ์ค๋ฅผ ์ฌ์ฉํ ์ผ์ด ๋ง์์ง ๊ฒ ๊ฐ์์ ๊ฐ๋ ์ ๋ฆฌ๋ฅผ ํ ๋ฒ ํด๋ณด์๋ค...
์ต์ํด์ง๋ ค๋ฉด ์ค๋๊ฑธ๋ฆด ๊ฒ ๊ฐ์ง๋ง ๋ณด๊ณ ๋ ๋ณด๋ฉด์ ์ ๋ฆฌํด์ผ๊ฒ ๋ค๐
'JAVA & OOP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] Optional ํด๋์ค์ orElse์ orElseGet ์ฐจ์ด (0) | 2024.03.15 |
---|---|
Java 17์ ์ฌ์ฉํ๋ ์ด์ (2) | 2024.01.06 |
JAVA :: HashMap, hashing ๊ฐ๋ ์ ๋ฆฌ (0) | 2022.08.14 |
JAVA :: Optional ํด๋์ค ๊ฐ๋ ์ ๋ฆฌ (0) | 2022.07.31 |
SOLID ์์น [๊ฐ์ฒด ์งํฅ ์ค๊ณ/ 5๊ฐ์ง ์์น /๊ฐ๋ ] (0) | 2021.07.08 |