๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java] HashSet ๊ตฌํ˜„

์ถœ์ฒ˜

ChatGPT

Java 1.8 ์†Œ์Šค์ฝ”๋“œ


HashSetdms ์ž๋ฐ” ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋กœ, ์ง‘ํ•ฉ(Set) ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. HashSet์€ ์ค‘๋ณต ์š”์†Œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์š”์†Œ์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ HashSet์€ HashMap์„ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„๋œ๋‹ค. 

 

1. HashSet์˜ ๊ฐœ์š”

  • HashSet์€ Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ค‘๋ณต๋˜์ง€ ์•Š์€ ์š”์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ HashMap์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋‚Ÿ.
  • ์š”์†Œ๋Š” ํ•ด์‹œ ์ฝ”๋“œ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋ฉฐ, ๋น ๋ฅธ ๊ฒ€์ƒ‰, ์ถ”๊ฐ€, ์ œ๊ฑฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์‚ฝ์ž…๋œ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์š”์†Œ๋“ค์€ ๋ฌด์ž‘์œ„ ์ˆœ์„œ๋กœ ์ €์žฅ๋œ๋‹ค.

2. HashSet์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ

  • HashSet์€ ์‹ค์ œ๋กœ HashMap ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • HasgSet์˜ ๊ฐ ์š”์†Œ๋Š” HashMap์˜ ํ‚ค๋กœ ์ €์žฅ๋˜๋ฉฐ, ํ•ด๋‹น ํ‚ค์˜ ๊ฐ’์„ ์ƒ์ˆ˜(PRESENT)๋กœ ์„ค์ •๋œ๋‹ค.
private transient HashMap<E,Object> map;

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

public HashSet() {
    map = new HashMap<>();
}

public boolean add(E e) {
    return map.put(e, PRESENT) == null;
}

 

 

3. HashSet์˜ ์ฃผ์š” ๋ฉ”์†Œ๋“œ ๋™์ž‘

add(E e)

์š”์†Œ๋ฅผ HashSet์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ HashMap์˜ put ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ์š”์†Œ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด์˜ ํ‚ค ๊ฐ’์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ , ์ถ”๊ฐ€๊ฐ€ ์‹คํŒจํ•˜๋ฉฐ false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์ž๋ฐ” 1.8 HashSet ํด๋ž˜์Šค ์†Œ์Šค์ฝ”๋“œ

 /**
* ์ง€์ •๋œ ์š”์†Œ๊ฐ€ ์•„์ง ์—†๋Š” ๊ฒฝ์šฐ ์ด set์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
* ๋” ๊ณต์‹์ ์œผ๋กœ๋Š”, ์ด set์— e2๊ฐ€ ์—†๊ณ  (e==null ? e2==null : e.equals(e2))์ธ ๊ฒฝ์šฐ
* ์ง€์ •๋œ e๋ฅผ ์ด set์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
* ์ด ์„ธํŠธ์— ์ด๋ฏธ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ˜ธ์ถœ์€ ์„ธํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ 
* false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
*
* @param e ์ด ์„ธํŠธ์— ์ถ”๊ฐ€ํ•  ์š”์†Œ
* @return true ์ด ์„ธํŠธ์— ์ง€์ •๋œ ์š”์†Œ๊ฐ€ ์ด๋ฏธ ์—†๋Š” ๊ฒฝ์šฐ
*/

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

 

remove(Object o)

์š”์†Œ๋ฅผ HashSet์—์„œ ์ œ๊ฑฐํ•œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ HashMap์˜ remove ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด, ํ•ด๋‹น ํ‚ค-๊ฐ’ ์Œ์„ ์ œ๊ฑฐํ•œ๋‹ค.

 

์ž๋ฐ” 1.8 HashSet ํด๋ž˜์Šค ์†Œ์Šค์ฝ”๋“œ

/**
 * ์ง€์ •๋œ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด ์ด ์„ธํŠธ์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.   
 * ๋” ๊ณต์‹์ ์œผ๋กœ๋Š” (o==null ? e==null : o.equals(e))์ธ ์š”์†Œ e๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
 * ์ด ์„ธํŠธ์— ํ•ด๋‹น ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
 * (๋˜๋Š” ๋™๋“ฑํ•˜๊ฒŒ ์ด ์„ธํŠธ๊ฐ€ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ).
 * (ํ˜ธ์ถœ์ด ๋ฐ˜ํ™˜๋˜๋ฉด ์ด ์„ธํŠธ๋Š” ์š”์†Œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)
 * 
 * ๋งค๊ฐœ๋ณ€์ˆ˜:o – ์ด ์„ธํŠธ์—์„œ ์ œ๊ฑฐํ•  ๊ฐ์ฒด(์žˆ๋Š” ๊ฒฝ์šฐ)
 * ๋ฐ˜ํ™˜๊ฐ’:์„ธํŠธ์— ์ง€์ •๋œ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด true
 */
public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

 

contains(Object 0)

ํŠน์ • ์š”์†Œ๊ฐ€ HashSet์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ HashMap์˜ containsKey ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด, ํ‚ค์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

 

์ž๋ฐ” 1.8 HashSet ํด๋ž˜์Šค ์†Œ์Šค์ฝ”๋“œ

/**
 * ์ด ์„ธํŠธ์— ์ง€์ •๋œ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 
 * ๋” ๊ณต์‹์ ์œผ๋กœ ๋งํ•˜๋ฉด, ์ด ์„ธํŠธ์— (o==null ? e==null : o.equals(e))์ธ 
 * ์š”์†Œ e๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
 * 
 * ๋งค๊ฐœ๋ณ€์ˆ˜: o – ์ด ์„ธํŠธ์— ์กด์žฌํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•  ์š”์†Œ
 * ๋ฐ˜ํ™˜๊ฐ’: ์ด ์„ธํŠธ์— ์ง€์ •๋œ ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด true
 */
public boolean contains(Object o) {
    return map.containsKey(o);
}

 

size()

HashSet์— ์ €์žฅ๋œ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ HashMap์˜ size ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

์ž๋ฐ” 1.8 HashSet ํด๋ž˜์Šค ์†Œ์Šค์ฝ”๋“œ

/**
 * ์ด ์„ธํŠธ์˜ ์š”์†Œ ์ˆ˜(์นด๋””๋„๋ฆฌํ‹ฐ)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
 *
 * ๋ฐ˜ํ™˜: ์ด ์„ธํŠธ์˜ ์š”์†Œ ์ˆ˜(์นด๋””๋„๋ฆฌํ‹ฐ)
 */
public int size() {
    return map.size();
}

 

4. ํ•ด์‹œ ํ•จ์ˆ˜์™€ ํ•ด์‹œ ๋ฒ„ํ‚ท

  • HashSet์€ ์š”์†Œ๋ฅผ ์ €์žฅํ•  ๋•Œ ๊ฐ ์š”์†Œ์˜ hashCode() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ์ด ํ•ด์‹œ ์ฝ”๋“œ๋Š” HashMap์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•ด์‹œ ํ•จ์ˆ˜์— ์˜ํ•ด ํŠน์ • ๋ฒ„ํ‚ท(bucket)์— ๋งคํ•‘๋œ๋‹ค.
  • ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋“ค์ด ๋™์ผํ•œ ๋ฒ„ํ‚ท์— ์ €์žฅ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ HashSet์€ equals() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์š”์†Œ๊ฐ€ ๋™์ผํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

 

5. ์ถฉ๋Œ ํ•ด๊ฒฐ

  • ๋งŒ์•ฝ ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ, ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ, HashMap์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด๋‹น ๋ฒ„ํ‚ท์— ์žˆ๋Š” ์š”์†Œ๋“ค์„ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋‚˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌํ•ด ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ๋‹ค.
  • ์ž๋ฐ” 8์ดํ›„์—๋Š” ๋ฒ„ํ‚ท์˜ ์š”์†Œ๊ฐ€ ์ผ์ • ์ˆ˜ ์ด์ƒ์ด ๋˜๋ฉด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ ํŠธ๋ฆฌ๋กœ ๋ณ€ํ™˜๋˜์–ด ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•œ๋‹ค.

 

6. ์„ฑ๋Šฅ

  • HashSet์˜ ์ฃผ์š” ์—ฐ์‚ฐ(add, remove, contains)์€ ํ‰๊ท ์ ์œผ๋กœ O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด๋Š” ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ง์ ‘์ ์ธ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ํ•˜์ง€๋งŒ ํ•ด์‹œ ์ถฉ๋Œ์ด ๋งŽ์•„์ง€๊ฑฐ๋‚˜ ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ์ œ๋Œ€๋กœ ๋ถ„ํฌ๋˜์ง€ ์•Š์œผ๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

 

7. ์žฅ๋‹จ์ 

์žฅ์ 

์ค‘๋ณต ์š”์†Œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ , ๋น ๋ฅธ ๊ฒ€์ƒ‰, ์ถ”๊ฐ€, ์ œ๊ฑฐ ์—ฐ์‚ฐ์„ ์ œ๊ณตํ•œ๋‹ค.

๋‹จ์ 

์š”์†Œ๋“ค์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด TreeSet๋ณด๋‹ค ๋” ๋งŽ์„ ์ˆ˜ ์žˆ๋‹ค.

 


8. ์ถœ์ฒ˜

  • ์ž๋ฐ” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ HashSet ๊ตฌํ˜„์€ ์ž๋ฐ” ์–ธ์–ด ์ž์ฒด์˜ ๊ณต์‹์ ์ธ ์ฝ”๋“œ์ด๋ฉฐ, ์ด๋ฅผ ๋ถ„์„ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ตฌํ˜„์€ ์ž๋ฐ”์˜ ๋‹ค์–‘ํ•œ ๋ฒ„์ „์—์„œ ์กฐ๊ธˆ์”ฉ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ์›๋ฆฌ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.