Collection - List, Set
์๋ฐ๋ ์๋ฃ๊ตฌ์กฐ(Data Structure)๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ์ฒด๋ค์ ํจ์จ์ ์ผ๋ก ์ถ๊ฐ, ์ญ์ , ๊ฒ์ํ ์ ์๋๋ก java.util
ํจํค์ง์ ์ปฌ๋์
๊ณผ ๊ด๋ จ๋ ์ธํฐํ์ด์ค์ ํด๋์ค๋ค์ด ํฌํจ๋์ด ์์ผ๋ฉฐ, ์ด๋ค์ ์ด์นญํด์ Collection Framework๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Collection ์ ๊ฐ์ฒด๋ฅผ ์์งํด์ ์ ์ฅํ๋ ์ญํ ์ ํ๋ฉฐ, Framework ๋ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ฏธ๋ฆฌ ์ ํด ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋งํ๋ค.
์ธํฐํ์ด์ค ๋ถ๋ฅ
ํน์ง
๊ตฌํ ํด๋์ค
Collection(List)
- ์์๋ฅผ ์ ์งํ๊ณ ์ ์ฅ - ์ค๋ณต ์ ์ฅ ๊ฐ๋ฅ
ArrayList Vector LinkedList
Collection(Set)
- ์์๋ฅผ ์ ์งํ์ง์๊ณ ์ ์ฅ - ์ค๋ณต ์ ์ฅ ์ ๋จ
HashSet TreeSet
Map
- ํค์ ๊ฐ์ ์์ผ๋ก ์ ์ฅ - ํค๋ ์ค๋ณต ์ ์ฅ ์ ๋จ
HashMap Hashtable TreeMap Properties
List Collection
List๋ ๊ฐ์ฒด๋ฅผ ์ผ๋ ฌ๋ก ๋์ด๋์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ฉด ์๋ ์ธ๋ฑ์ค๊ฐ ๋ถ์ฌ๋๊ณ ์ธ๋ฑ์ค๋ก ๊ฐ์ฒด๋ฅผ ๊ฒ์, ์ญ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. List Collection ์ ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฒด ๋ฒ์ง๋ฅผ ์ฐธ์กฐํ๋ค. ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ค๋ณต ์ ์ฅํ ์๋ ์๋ค.
([์๋ฃ๊ตฌ์กฐ List]์ ์์ธํ ์ค๋ช ์ด ์๋ค.)
List ์ธํฐํ์ด์ค๋ ์ ๋ค๋ฆญ ํ์ ์ด๋ค.
๊ธฐ๋ฅ
๋ฉ์๋
์ค๋ช
๊ฐ์ฒด ์ถ๊ฐ
boolean add(E e)
์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ ๋งจ ๋์ ์ถ๊ฐ
void add(int index, E element)
์ฃผ์ด์ง ์ธ๋ฑ์ค์ ๊ฐ์ฒด ์ถ๊ฐ
set(int index, E element)
์ฃผ์ด์ง ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ์ฃผ์ด์ง ๊ฐ์ฒด๋ก ๋ณ๊ฒฝ
๊ฐ์ฒด ๊ฒ์
boolean contains(Object o)
์ฃผ์ด์ง ๊ฐ์ฒด๊ฐ ์ ์ฅ๋์ด ์๋์ง ์ฌ๋ถ
E get(int index)
์ฃผ์ด์ง ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๋ฆฌํด
isEmpty()
์ปฌ๋ ์ ์ด ๋น์ด์๋์ง ์กฐ์ฌ
int size()
์ ์ฅ๋์ด ์๋ ์ ์ฒด ๊ฐ์ฒด ์๋ฅผ ๋ฆฌํด
๊ฐ์ฒด ์ญ์
void clear()
์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด ์ญ์
E remove(int index)
์ฃผ์ด์ง ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๊ฐ์ฒด ์ญ์
boolean remove(Object o)
์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ ์ญ์
List<String> list = ...;
list.add("์ ๋คํ");
list.add(1,"์ ๋ฏธ๋");
String str = list.get(1);
list.remove(0);
list.remove("์ ๋ฏธ๋");
for(int i=0;i<list.size();i++){
String str = list.get(i);
}
for(String str : list){
}
ArrayList
ArrayList๋ List ์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค๋ก, ArrayList์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฐ์ฒด๊ฐ ์ธ๋ฑ์ค๋ก ๊ด๋ฆฌ๋๋ค. ๋ฐฐ์ด์ ์์ฑํ ๋ ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋๊ณ ์ฌ์ฉ ์ค์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ง๋ง, ArrayList๋ capacity(์ ์ฅ ์ฉ๋)๋ฅผ ์ด๊ณผํ ๊ฐ์ฒด๋ค์ด ๋ค์ด์ค๋ฉด ์๋์ผ๋ก capacity๊ฐ ์ฆ๊ฐํ๋ค.
List<E> list = new ArrayList<E>();
๊ธฐ๋ณธ ์์ฑ์๋ก ArrayList ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋ด๋ถ์ 10ใฑ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์๋ ์ด๊ธฐ ์ฉ๋์ ๊ฐ์ง๋ค. ์ ์ฅ๋๋ ๊ฐ์ฒด ์๊ฐ ๋์ด๋๋ฉด ์๋์ผ๋ก ์ฆ๊ฐํ์ง๋ง, ์ฒ์๋ถํฐ ์ฉ๋์ ํฌ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด ์ฉ๋์ ํฌ๊ธฐ๋ฅผ ๋งค๊ฐ๊ฐ์ผ๋ก ๋ฐ๋ ์์ฑ์๋ฅผ ์ด์ฉํ๋ฉด๋๋ค.
List<String> list = new ArrayList<String>(30);
ArrayList์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ฉด ์ธ๋ฑ์ค 0๋ถํฐ ์ฐจ๋ก๋๋ก ์ ์ฅ๋๋ค. ํน์ ์ธ๋ฑ์ค์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ฐ๋ก ๋ค ์ธ๋ฑ์ค๋ถํฐ ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ๋ชจ๋ ์์ผ๋ก 1์ฉ ๋น๊ฒจ์ง๋ค. ๋ํ ํน์ ์ธ๋ฑ์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ํด๋น ์ธ๋ฑ์ค๋ถํฐ 1์ฉ ๋ฐ๋ ค๋๋ค. ๋ฐ๋ผ์ ๋น๋ฒํ ๊ฐ์ฒด ์ญ์ ์ ์ฝ์ ์ ์ผ์ด๋๋ ๊ณณ์์๋ ArrayList๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ LinkedList๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
ArrayList๋ ๋งจ ๋ง์ง๋ง์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์ ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
ArrayList๋ฅผ ์์ฑํ๊ณ ๋ฐํ์ ์ ํ์์ ์ํด ๊ฐ์ฒด๋ค์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด์ง๋ง, ๊ณ ์ ๋ ๊ฐ์ฒด๋ค๋ก ๊ตฌ์ฑ๋ List๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ์๋ ArrayList.asList(T...a)
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐํธํ๋ค.
List<T> list = Arrays.asList(T...a);
T ํ์ ํ๋ผ๋ฏธํฐ์ ๋ง๊ฒ asList()์ ๋งค๊ฐ๊ฐ์ ์์ฐจ์ ์ผ๋ก ์ ๋ ฅํ๊ฑฐ๋, T[] ๋ฐฐ์ด์ ๋งค๊ฐ๊ฐ์ผ๋ก ์ฃผ๋ฉด๋๋ค.
import java.util.Arrays;
import java.util.list;
public class ArraysAsListEx {
public static void main(String[] args){
List<String> list = Arrays.asList("์ ๋คํ", "์ ๋ฏธ๋", "์ ์์");
for(String name : list){
System.out.println(name);
}
}
}
Vector
Vector๋ ArrayList์ ๋์ผํ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
List<E> list = new Vector<E>();
ArrayList์ ๋ค๋ฅธ ์ ์ Vector๋ ๋๊ธฐํ๋(synchronized) ๋ฉ์๋๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฉํฐ ์ค๋ ๋๊ฐ ๋์์ ์ด ๋ฉ์๋๋ค์ ์คํํ ์ ์๊ณ , ํ๋์ ์ค๋ ๋๊ฐ ์คํ์ ์๋ฃํด์ผ๋ง ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์คํํ ์ ์๋ค. ๊ทธ๋์ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ๊ฒ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ, ์ญ์ ํ ์ ์๋ค.
Linked List
ArrayList์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง๋ง ๋ด๋ถ ๊ตฌ์กฐ๋ ์์ ๋ค๋ฅด๋ค. ArrayList๋ ๋ด๋ถ ๋ฐฐ์ด์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํด์ ์ธ๋ฑ์ค๋ก ๊ด๋ฆฌํ์ง๋ง, LinkedList๋ ์ธ์ ์ฐธ์กฐ๋ฅผ ๋งํฌํด์ ์ฒด์ธ์ฒ๋ผ ๊ด๋ฆฌํ๋ค.
LinkedList์์ ํน์ ์ธ๋ฑ์ค์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ฉด ์๋ค link๋ง ๋ณ๊ฒฝ๋๊ณ ๋๋จธ์ง link๋ ๋ณ๊ฒฝ๋์ง ์๋๋ค. ๊ฐ์ฒด๋ฅผ ์ฝ์ ํ ๋๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋น๋ฒํ ๊ฐ์ฒด ์ญ์ ์ ์ฝ์ ์ด ์ผ์ด๋๋ ๊ณณ์์๋ LinkedList๊ฐ ์ข์ ์ฑ๋ฅ์ ๋ฐํํ๋ค.
List<E> list = new LinkedList<E>();
( Linked List ์๋ฃ๊ตฌ์กฐ ์ดํด๋ณด๊ธฐ )
๊ตฌ๋ถ
์์ฐจ์ ์ผ๋ก ์ถ๊ฐ/์ญ์
์ค๊ฐ์ ์ถ๊ฐ/์ญ์
๊ฒ์
ArrayLIst
๋น ๋ฅด๋ค
๋๋ฆฌ๋ค
๋น ๋ฅด๋ค
LinkedList
๋๋ฆฌ๋ค
๋น ๋ฅด๋ค
๋๋ฆฌ๋ค
sychronizedList
Collection ํ๋ ์์ํฌ์ ๋๋ถ๋ถ์ ํด๋์ค(ArrayList)๋ Single Thread ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ์ง์๋ค. Single Threadํ๊ฒฝ์์ Multi Threadํ๊ฒฝ์ผ๋ก ์ ๋ฌํ ๊ฒฝ์ฐ์ ๋๋นํด ๋น๋๊ธฐํ๋ ๋ฉ์๋๋ฅผ ๋๊ธฐํ๋ ๋ฉ์๋๋ก Wrappingํ๋ synchronizedList()๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
๋ฆฌํดํ์
๋ฉ์๋
์ค๋ช
List
synchronizedList(List list)
List๋ฅผ ๋๊ธฐํ๋ List๋ก ๋ฆฌํด
List<T> list = Collections.synchronizedList(new ArrayList<T>());
Set Collection
List Collection์ ์ ์ฅ์์๋ฅผ ์ ์งํ์ง๋ง, Set Collection์ ์ ์ฅ ์์๊ฐ ์ ์ง๋์ง ์๋๋ค. ๋ํ ๊ฐ์ฒด๋ฅผ ์ค๋ณตํด์ ์ ์ฅํ ์ ์๊ณ , ํ๋์ null๋ง ์ ์ฅํ ์ ์๋ค. ์ฆ, ์ํ์ ์งํฉ์ ๋น์ ํ ์ ์๋ค.
๊ธฐ๋ฅ
๋ฉ์๋
์ค๋ช
๊ฐ์ฒด ์ถ๊ฐ
boolean add(E e)
์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ ์ ์ฅ, ๊ฐ์ฒด๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ ์ฅ๋๋ฉด true, ์ค๋ณต์ด๋ฉด false return
๊ฐ์ฒด ๊ฒ์
boolean contains(Object o)
์ฃผ์ด์ง ๊ฐ์ฒด๊ฐ ์ ์ฅ๋์ด ์๋์ง ์ฌ๋ถ
isEmpty()
์ปฌ๋ ์ ์ด ๋น์ด์๋์ง ์กฐ์ฌ
Iterator<E> iterator
์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ํ๋ฒ์ฉ ๊ฐ์ ธ์ค๋ ๋ฐ๋ณต์ return
int size()
์ ์ฅ๋์ด ์๋ ์ ์ฒด ๊ฐ์ฒด ์ ๋ฆฌํด
๊ฐ์ฒด ์ญ์
void clear()
์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด ์ญ์
boolean remove(Object o)
์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ ์ญ์
Set Collection์ Generic Type์ผ๋ก ๊ตฌ์ฒด์ ์ธ ํ์ ์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๊ฒฐ์ ๋๋ค.
Set<String> set = ...;
set.add("ํ๊ธธ๋");
set.add("์ ๋ฏธ๋");
set.remove("์ ๋ฏธ๋");
Set Collection์ ์ธ๋ฑ์ค๋ก ๊ฐ์ฒด๋ฅผ ๊ฒ์ํด์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๊ฐ ์๋ค. ๋์ , ์ ์ฒด ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ํ๋ฒ ์ฉ ๋ฐ๋ณตํด์ ๊ฐ์ ธ์ค๋ ๋ฐ๋ณต์(Iterator)๋ฅผ ์ ๊ณตํ๋ค.
Iterator<String> iterator = set.iterator();
๋ฆฌํด ํ์
๋ฉ์๋๋ช
์ค๋ช
boolean
hasNext()
๊ฐ์ ธ์ฌ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด true, ์์ผ๋ฉด false return
E
next()
์ปฌ๋ ์ ์์ ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค.
void
remove()
Set ์ปฌ๋ ์ ์์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐ
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
String str = iterator.next();
}
Set<String> set = ...;
for(String str : set){
}
HashSet
HashSet์ Set์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค์ด๋ค.
Set<E> set = new HashSet<E>();
HashSet์ ๊ฐ์ฒด๋ค์ ์์ ์์ด ์ ์ฅํ๊ณ ๋์ผํ ๊ฐ์ฒด๋ ์ค๋ณต ์ ์ฅํ์ง ์๋๋ค. ์ฌ๊ธฐ์ ๋์ผํ ๊ฐ์ฒด๋ ๊ผญ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ปํ์ง ์๋๋ค. HashSet์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ ์ ๋จผ์ ๊ฐ์ฒด์ hashCode() ๋ฉ์๋๋ฅผ ํธ์ถํด ํด์์ฝ๋๋ฅผ ์ป์ด๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ ์ ์ฅ๋ ๊ฐ์ฒด๋ค์ hashcode์ ๋น๊ตํ๋ค. ๋์ผํ hashcode๊ฐ ์๋ค๋ฉด ๋ค์ equals() ๋ฉ์๋๋ก ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํด true๊ฐ ๋์ค๋ฉด ๋์ผํ ๊ฐ์ฒด๋ก ํ๋ํค ์ ์ฅํ์ง ์๋๋ค.
๋ฌธ์์ด์ HashSet์ ์ ์ฅํ ๊ฒฝ์ฐ, ๊ฐ์ ๋ฌธ์์ด์ ๊ฐ๋ String ๊ฐ์ฒด๋ ๋๋ฑํ ๊ฐ์ฒด, ๋ค๋ฅธ ๋ฌธ์์ด์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๊ฐ์ฃผ๋๋ค. ์ด๋ String ํด๋์ค๊ฐ hashCode()์ equals() ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
public class Member{
public String name;
public int age;
public Member(String name, int age){
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj){
if(obj instanceof Member){
Member member = (Member)obj;
return member.name.equals(name) && (memeber.age==age);
}else{
return false;
}
}
@Override
public int hashCode(){
// name๊ณผ age๊ฐ ๊ฐ์ผ๋ฉด ๋์ผํ hashCode๋ฆฌํด
return name.hashCode()+age;
}
}
import java.util.*;
public class HashSetEx{
public static void main(String[] args){
Set<Member> set = HashSet<Member>();
set.add(new Member("์ ๋คํ",24));
set.add(new Member("์ ๋คํ",24)); // ์ธ์คํด์ค๋ ๋ค๋ฅด์ง๋ง ๋ด๋ถ ๋ฐ์ดํฐ๊ฐ ๋์ผํ๋ฏ๋ก 1๊ฐ์ ์ฅ
}
}
sychronizedSet
Collection ํ๋ ์์ํฌ์ ๋๋ถ๋ถ์ ํด๋์ค(HashSet)๋ Single Thread ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ์ง์๋ค. Single Threadํ๊ฒฝ์์ Multi Threadํ๊ฒฝ์ผ๋ก ์ ๋ฌํ ๊ฒฝ์ฐ์ ๋๋นํด ๋น๋๊ธฐํ๋ ๋ฉ์๋๋ฅผ ๋๊ธฐํ๋ ๋ฉ์๋๋ก Wrappingํ๋ synchronizedSet()๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
๋ฆฌํดํ์
๋ฉ์๋
์ค๋ช
Set
synchronizedSet(Set s)
Set๋ฅผ ๋๊ธฐํ๋ Set๋ก ๋ฆฌํด
Set<T> s = Collections.synchronizedSet(new HashSet<T>());
Last updated
Was this helpful?