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) ๋ฉ”์†Œ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ด ๋ฉ”์†Œ๋“œ๋“ค์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ณ , ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰์„ ์™„๋ฃŒํ•ด์•ผ๋งŒ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

(Vector(C++) ์‚ดํŽด๋ณด๊ธฐ)

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?