[์ž๋ฃŒ๊ตฌ์กฐ][Java] HashSet ์ค‘๋ณต ์ œ๊ฑฐ ๋™์ž‘ ์›๋ฆฌ: HashSet์€ ์–ด๋–ป๊ฒŒ ์ค‘๋ณต์„ ํ™•์ธํ•˜๋‚˜์š”?

2025. 2. 13. 18:56ยทโ˜•Java
๋ชฉ์ฐจ
  1. ๐Ÿ”Ž ์ฃผ์ œ
  2. HashSet
  3. โš™๏ธ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹
  4. HashSet์€ HashMap์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค
  5. โš™๏ธ ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐฉ์‹
  6. HashMap์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹ค
  7. hashCode()
  8. equals()
  9. equals()์™€ hashCode()์˜ ๊ด€๊ณ„
  10. โœ… ํšจ์œจ์ ์ธ ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ
  11. ๐Ÿ”‘ ํ•œ ์ค„ ์š”์•ฝ

๐Ÿ”Ž ์ฃผ์ œ

HashSet์˜ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ์ค‘๋ณต ์ œ๊ฑฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์„ค๋ช…ํ•˜๊ณ , HashSet์ด ํšจ์œจ์ ์ธ ์ค‘๋ณต ์ฒดํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

์ด ๊ธ€์—์„œ๋Š” HashSet์— ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.

HashSet

import java.util.HashSet;

HashSet<Integer> set = new HashSet<>();

HashSet์˜ ํŠน์ง•

  • ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ , ๊ณ ์œ ํ•œ ๊ฐ’๋งŒ ์ €์žฅํ•œ๋‹ค.
  • null ๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค.
  • ์š”์†Œ์˜ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค.
  • Java Collectios Framework ์ค‘ Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

โš™๏ธ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹

HashSet์€ HashMap์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค

HashSet ํด๋ž˜์Šค๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋ฉด ์ƒ์„ฑ์ž์—์„œ HashMap์„ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค.

HashSet.java

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {
    ...
    public HashSet() {
        map = new HashMap<>();
    }
    ...
}

HashSet์€ ์ด HashMap ๊ฐ์ฒด์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„๋œ๋‹ค.

Set์— ์š”์†Œ๋ฅผ ๋”ํ•˜๋Š” add() ๋ฉ”์†Œ๋“œ์—์„œ๋Š” HashMap์˜ put() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
HashSet์˜ ์‚ฝ์ž…ํ•˜๋Š” ๊ฐ’(e)์€ ๋งต ๊ฐ์ฒด์˜ key ์—ญํ• ์„ ํ•˜๋ฉฐ, value์—๋Š” ์ƒ์ˆ˜๋ฅผ ๋Œ€์ž…ํ•œ๋‹ค.(-> ๋ชจ๋“  ์š”์†Œ์˜ value ๊ฐ’์ด ๊ฐ™๋‹ค.)

HashSet.java

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

HashMap์—์„œ key๋Š” ์ค‘๋ณต ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ณ ์œ  ์‹๋ณ„์ž์ด๋‹ค.
HashMap์˜ put(key, value) ๋ฉ”์†Œ๋“œ๋Š”

  • ์ด๋ฏธ key๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด์ „ value ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • key๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
public class Main {
    public static void main(String[] args) {
        Map<Integer, Integer> map = new HashMap<>();
        System.out.println(map.put(1,1));
        System.out.println(map.put(1,2));
    }
}
-------------------------------
์ถœ๋ ฅ ๊ฒฐ๊ณผ
null
1

HashSet์˜ add()์—์„œ๋Š” HashMap์˜ put() ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์ด null์ด๋ฉด ์ฐธ์„, null์ด ์•„๋‹ˆ๋ฉด ๊ฑฐ์ง“์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ HashSet์˜ add()๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

  • ์‚ฝ์ž… ์„ฑ๊ณต -> HashMap์˜ put()์—์„œ null ๋ฐ˜ํ™˜ -> HashSet์˜ add()์—์„œ true ๋ฐ˜ํ™˜
  • ์‚ฝ์ž… ์‹คํŒจ -> HashMap์˜ put()์—์„œ ์ด์ „ value ๋ฐ˜ํ™˜ -> HashSet์˜ add()์—์„œ false ๋ฐ˜ํ™˜

โš™๏ธ ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐฉ์‹

HashMap์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹ค

์ฆ‰, HashSet์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ HashMap์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด HashMap์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ค‘๋ณต์ธ์ง€ ๊ตฌ๋ณ„ํ• ๊นŒ?
์ด๋•Œ hashCode()์™€ equals() ๋‘ ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

hashCode()

HashMap.java

public final int hashCode() {
    return Objects.hashCode(key) ^ Objects.hashCode(value);
}

hashCode() ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ์ฒด๋ฅผ ์ •์ˆ˜ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ด ๊ณผ์ •์„ ํ•ด์‹ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค.
ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ž„์˜ ๊ธธ์ด์˜ ๋ฉ”์„ธ์ง€๋ฅผ ์ผ์ •ํ•œ ๊ณ ์ • ๊ธธ์ด์˜ ํ•ด์‹œ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚จ๋‹ค. ์ด๋•Œ ํ•ด์‹œ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ•ด์‹œ ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค. Java์—์„œ hashCode()๋Š” ๊ฐ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฐ์ฒด๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๊ฐ’์„ ์–ป๋Š”๋‹ค.

๊ฐ™์€ ๊ฐ์ฒด์˜ ํ•ด์‹œ ์ฝ”๋“œ๋Š” ์–ธ์ œ๋‚˜ ๋™์ผํ•˜๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ญ์€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•ด์‹œ ํ•จ์ˆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ž…๋ ฅ๊ฐ’์ด์–ด๋„ ๊ฐ™์€ ์ถœ๋ ฅ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•ด์‹œ ์ฝ”๋“œ๊ฐ€ ๊ฐ™๋‹ค๊ณ  ๋ฐ˜๋“œ์‹œ ๊ฐ™์€ ๊ฐ์ฒด๋Š” ์•„๋‹ˆ๋‹ค.

equals()

HashMap.java

public final boolean equals(Object o) {
    if (o == this)
        return true;

    return o instanceof Map.Entry<?, ?> e
                    && Objects.equals(key, e.getKey())
                    && Objects.equals(value, e.getValue());
}

์ด ๋ฉ”์†Œ๋“œ๋Š” ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€์ง€ ์•„๋‹Œ์ง€๋ฅผ ํ™•์ธํ•˜์—ฌ boolean์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด HashMap์˜ equals() ๋ฉ”์†Œ๋“œ์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•œ๋‹ค.

  • == ์—ฐ์‚ฐ์ž: ๋‘ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ๋‘ ๊ฐ์ฒด๋Š” ๋‹น์—ฐํžˆ ๊ฐ™์€ ์กด์žฌ์ด๋‹ค.
  • equals()์™€ &&: ์˜ค๋ธŒ์ ํŠธ๊ฐ€ Map.Entry์ด๊ณ , ๋‘ ๊ฐ์ฒด์˜ key๊ฐ€ ๊ฐ™๊ณ , ๋‘ ๊ฐ์ฒด์˜ value๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธํ•œ๋‹ค. ์ฆ‰ ๋‘ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์ด ๊ฐ™์€์ง€ ๋ณธ๋‹ค.

equals()๋Š” ๋‘ ๊ฐ์ฒด์˜ ๋…ผ๋ฆฌ์  ๋™๋“ฑ์„ฑ์„ ํ™•์ธํ•œ๋‹ค.

๋‘ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์ด ๊ฐ™์œผ๋ฉด ์ฃผ์†Œ๊ฐ€ ๋‹ฌ๋ผ๋„ ๊ฐ™์€ ๊ฐ์ฒด๋กœ ๋ณธ๋‹ค.

์˜ˆ์‹œ๋ฅผ ๋ณด์ž. equals()๋Š” ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•  ๋•Œ ๋งŽ์ด ์จ๋ดค์„ ๊ฒƒ์ด๋‹ค.

Main.java

public static void main(String[] args) {

    String str1 = new String("Hello World");
    String str2 = new String("Hello World");
    String str3 = new String("hello world");

    System.out.println(str1==str2);    // str1๊ณผ str2์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” ๋‹ค๋ฆ„
    System.out.println(str1.equals(str2));    // ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด์šฉ์€ ๊ฐ™์Œ
    System.out.println(str1.equals(str3));    // str1๊ณผ str3๋Š” ์ฃผ์†Œ์™€ ๋‚ด์šฉ ๋ชจ๋‘ ๋‹ค๋ฆ„

}
---------------------
์ถœ๋ ฅ ๊ฒฐ๊ณผ
false
true
false

str1๊ณผ str2์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” ๋‹ค๋ฅด๋ฏ€๋กœ "==" ์—ฐ์‚ฐ์ž๋กœ ๋น„๊ตํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ณธ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ equals()๋กœ ๋น„๊ตํ•˜๋ฉด true์ด๋‹ค.

String.java

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    return (anObject instanceof String aString)
                && (!COMPACT_STRINGS || this.coder == aString.coder)
                && StringLatin1.equals(value, aString.value);
}

String ํด๋ž˜์Šค์—์„œ๋Š” ๊ฐ’์„ ๋น„๊ตํ•  ๋•Œ value ์ฆ‰ ์ €์žฅ๋œ ๋ฌธ์ž์—ด์„ ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด์ฒ˜๋Ÿผ HashMap์—์„œ๋Š” ํ•œ ์—”ํŠธ๋ฆฌ์—์„œ key์™€ value์˜ ๋‚ด์šฉ์ด ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๊ณ , HashSet์—์„œ๋Š” value๋Š” ์ƒ์ˆ˜๋กœ ๋ชจ๋‘ ๊ฐ™์œผ๋ฏ€๋กœ key, HashSet์˜ ์š”์†Œ๋“ค์ด ๋‚ด์šฉ์ด ๊ฐ™์€์ง€ ํ™•์ธํ•˜์—ฌ ์ค‘๋ณต์„ ํ”ผํ•œ๋‹ค.

equals()์™€ hashCode()์˜ ๊ด€๊ณ„

equals()๋กœ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๊ณ , hashCode()๋กœ ๊ฐ ๊ฐ์ฒด๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๊ฐ’์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™œ ๋‘ ๋ฉ”์†Œ๋“œ ์ค‘ ํ•˜๋‚˜๋งŒ ์“ฐ์ง€ ์•Š๊ณ , ํ•จ๊ป˜ ์“ธ๊นŒ?

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

ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ์—์„œ ๊ฐ ํ‚ค(HashMap์˜ ํ‚ค, HashSet์˜ ์š”์†Œ)๋Š” ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ถ€์—ฌ ๋ฐ›๋Š” ํ•ด์‹ฑ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑฐ์ณ ๊ฐ’(value)์„ ํ…Œ์ด๋ธ”์˜ ์–ด๋А ์ธ๋ฑ์Šค์— ์ €์žฅ๋ ์ง€ ๊ฒฐ์ •๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์‹ค์ œ๋กœ ๊ฐ’์ด ์ €์žฅ๋˜๋Š” ์žฅ์†Œ๋ฅผ ๋ฒ„ํ‚ท์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋‹น์—ฐํžˆ ํ•˜๋‚˜์˜ ๋ฒ„ํ‚ท์— ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
๋ฒ„ํ‚ท์˜ ๊ฐœ์ˆ˜๋Š” ์œ ํ•œํ•˜๊ณ  ๋งŒ์•ฝ ๋‹ค๋ฅธ ๋‘ ๊ฐ์ฒด์˜ ํ•ด์‹œ ํ•จ์ˆ˜ ์ถœ๋ ฅ๊ฐ’์ด ๋™์ผํ•˜๋‹ค๋ฉด, ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๊ฐ™์€ ์ธ๋ฑ์Šค ์ฆ‰, ๊ฐ™์€ ๋ฒ„ํ‚ท์— ์ €์žฅ๋œ๋‹ค.
์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” '15'์™€ '8'์ด ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด(ํ•ด์‹œ ์ถฉ๋Œ) ๊ฐ™์€ ๋ฒ„ํ‚ท์— ์ €์žฅ๋˜์—ˆ๋‹ค. (๊ฐ™์€ ๋ฒ„ํ‚ท ๋‚ด์—์„œ๋Š” ์„œ๋กœ ์—ฐ๊ฒฐ๋˜๋Š”๋ฐ ์ด๊ฒƒ์„ ์ฒด์ด๋‹์ด๋ผ ํ•œ๋‹ค.) ๊ฐ™์€ ๊ฐ์ฒด๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ€์ง€์ง€๋งŒ, ๊ฐ™์€ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค๊ณ  ๊ฐ™์€ ๊ฐ์ฒด๋ผ๊ณ  ๋ณผ ์ˆ˜๋Š” ์—†๋‹ค.

๊ฒฝ์šฐ 1
๋งŒ์•ฝ ์ด ํ…Œ์ด๋ธ”์—์„œ '11'๊ณผ '15'๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด
๊ฐ์ž์˜ ๋ฒ„ํ‚ท์œผ๋กœ ๊ฐ€์„œ ๋‚ด์šฉ์„ ์ง์ ‘ ํ™•์ธํ•˜๊ธฐ๋„ ์ „์— ํ•ด์‹œ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ
๊ฒฐ๊ณผ๋Š” false์ด๋‹ค.

๊ฒฝ์šฐ 2
๋งŒ์•ฝ ์ด ํ…Œ์ด๋ธ”์—์„œ '15'์™€ '8'์„ ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋ฉด
๋‘ ๊ฐ์ฒด๋Š” ํ•ด์‹œ ๊ฐ’์ด 1๋กœ ๊ฐ™๋‹ค. ์ด์ œ๋Š” ๋‚ด์šฉ์„ ๋น„๊ตํ•ด๋ด์•ผ ํ•œ๋‹ค.
๋ฒ„ํ‚ท 1๋กœ ๊ฐ€์„œ '15'์™€ '8'์ด ๊ฐ™์€ ๋‚ด์šฉ์ธ์ง€ equals๋ฅผ ํ™•์ธํ•œ๋‹ค.
๊ฒฐ๊ณผ๋Š” false์ด๋‹ค.


 

์ด์ฒ˜๋Ÿผ ํ•ด์‹œ ๊ตฌ์กฐ์—์„œ ๋‘ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ๋•Œ๋Š”
ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๊ฐ์ฒด์™€ ์ผ์ผ์ด ๋น„๊ตํ•˜์ง€ ์•Š๊ณ  hashCode()๋กœ ๋ฒ„ํ‚ท์„ ์ฐพ์•„ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ ,
๊ฐ™์€ ๋ฒ„ํ‚ท์— ์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” equals()๋กœ ์‹ค์ œ๋กœ ๋™๋“ฑํ•œ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

Java์—์„œ ํ•ด์‹œ ๊ตฌ์กฐ์—์„œ์˜ ํƒ์ƒ‰ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • equals()๊ฐ€ true๋ผ๋ฉด hashCode()๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ™๊ณ , ๋‘ ๊ฐ์ฒด๋Š” ๊ฐ™๋‹ค.
  • equals()๊ฐ€ false๋ผ๋ฉด hashCode()๋Š” ๊ฐ™์„ ์ˆ˜๋„, ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ฐ์ฒด๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋‹ค.

โœ… ํšจ์œจ์ ์ธ ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ

์™œ ํ•ด์‹œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

ํ•ด์‹œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฒ„ํ‚ท์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งŒ์•ฝ Sam Doe๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๊ทธ ๋ฒ„ํ‚ท์— ์ ‘๊ทผํ•œ๋‹ค.
๋ฒ„ํ‚ท 254์—๋Š” ๊ฐ์ฒด๊ฐ€ Sam Doe ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ”๋กœ ์ฐพ์•˜๋‹ค.

๋งŒ์•ฝ Sandra Dee๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฒ„ํ‚ท 152์— ์ ‘๊ทผํ•œ๋‹ค.
๋ฒ„ํ‚ท์—์„œ ๊ฐ์ฒด๋“ค์ด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”๋ฐ Sandra Dee๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋‹ค. Sandra Dee๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•œ๋‹ค.

ํ‰๊ท ์ ์œผ๋กœ, ํ•ด์‹œ ์ฝ”๋“œ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ O(1)์— ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์›Œ์ŠคํŠธ ์ผ€์ด์Šค์—๋Š” ํ•œ ๋ฒ„ํ‚ท์— ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฟ ์žˆ๊ณ , ์ฐพ์œผ๋ ค๋Š” ๊ฐ์ฒด๊ฐ€ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ๊ฒฝ์šฐ๋กœ O(n)์ด๋‹ค.

ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ž˜ ์ •์˜ํ•œ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— O(1)๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
ํšจ์œจ์ ์œผ๋กœ ์ค‘๋ณต์„ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”‘ ํ•œ ์ค„ ์š”์•ฝ

 

HashSet์€ ๋‚ด๋ถ€์ ์œผ๋กœ HashMap์œผ๋กœ ๋™์ž‘ํ•˜๊ณ ,
ํ•ด์‹œ ๊ตฌ์กฐ์—์„œ hashCode()์™€ equals()๋กœ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ณ  ๋น„๊ตํ•˜์—ฌ
์ค‘๋ณต์„ ํšจ์œจ์ ์œผ๋กœ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค!

 

๐Ÿ“‹ ์ฐธ๊ณ ์ž๋ฃŒ

์ถ”์ฒœ โœ…
Internal working of Set/HashSet in Java
Java HashSet
HashSet In Java: Features, Hierarchy, Constructors, Methods, and More
[JAVA] HashSet์ด๋ž€? & ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ
Hashing in Data Structure
์ž๋ฐ”์—์„œ equals()์™€ ==์˜ ์ฐจ์ด

์ด๋ฏธ์ง€ ์ถœ์ฒ˜
Hash Table Data Structure
Hash Buckets

๋ฐ˜์‘ํ˜•

'โ˜•Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JAVA] ํˆฌ ํฌ์ธํ„ฐ (๋ฐฑ์ค€ 2018๋ฒˆ, ๋ฐฑ์ค€ 1940๋ฒˆ)  (3) 2025.05.18
[JAVA] ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ (๋ฐฑ์ค€ 11659๋ฒˆ, ๋ฐฑ์ค€ 2042๋ฒˆ)  (1) 2025.05.17
[JAVA] ๋ฐฐ์—ด๊ณผ ๋ฆฌ์ŠคํŠธ: ์ˆซ์ž์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ(๋ฐฑ์ค€ 11720)  (3) 2025.05.14
[Java] ์ŠคํŠธ๋ฆผ Stream ๊ฐœ๋…๊ณผ Stream API ์ด์ •๋ฆฌ  (2) 2025.02.13
[Java] ๋น ๋ฅธ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ: BufferedReader์™€ BufferedWriter + Buffer (with ๋ฐฑ์ค€15552)  (0) 2025.02.12
  1. ๐Ÿ”Ž ์ฃผ์ œ
  2. HashSet
  3. โš™๏ธ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹
  4. HashSet์€ HashMap์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค
  5. โš™๏ธ ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐฉ์‹
  6. HashMap์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹ค
  7. hashCode()
  8. equals()
  9. equals()์™€ hashCode()์˜ ๊ด€๊ณ„
  10. โœ… ํšจ์œจ์ ์ธ ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ
  11. ๐Ÿ”‘ ํ•œ ์ค„ ์š”์•ฝ
'โ˜•Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [JAVA] ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ (๋ฐฑ์ค€ 11659๋ฒˆ, ๋ฐฑ์ค€ 2042๋ฒˆ)
  • [JAVA] ๋ฐฐ์—ด๊ณผ ๋ฆฌ์ŠคํŠธ: ์ˆซ์ž์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ(๋ฐฑ์ค€ 11720)
  • [Java] ์ŠคํŠธ๋ฆผ Stream ๊ฐœ๋…๊ณผ Stream API ์ด์ •๋ฆฌ
  • [Java] ๋น ๋ฅธ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ: BufferedReader์™€ BufferedWriter + Buffer (with ๋ฐฑ์ค€15552)
์†Œ์˜ ๐Ÿ€
์†Œ์˜ ๐Ÿ€
Hello World โœจ
  • ์†Œ์˜ ๐Ÿ€
    Soyoung's Dev Lab
    ์†Œ์˜ ๐Ÿ€
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ธ€์“ฐ๊ธฐ ๊ด€๋ฆฌ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (47)
      • ๐Ÿ“ข ๊ฒŒ์‹œํŒ (0)
      • ๐Ÿ“š ์ž๋ฃŒ๊ตฌ์กฐ & ์•Œ๊ณ ๋ฆฌ์ฆ˜ (1)
      • ๐ŸŒฟSpring (15)
      • โ˜•Java (8)
      • ๐Ÿ“Š ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (3)
      • ๐Ÿ“ค ๋ฐฐํฌ (4)
        • Docker (4)
        • AWS (0)
      • โš™๏ธ CS & ๊ธฐํƒ€ ๊ฐœ๋ฐœ ์ž๋ฃŒ (14)
      • ๐Ÿ–ฅ๏ธ ํ”„๋กœ์ ํŠธ (0)
      • ๐Ÿ‘ฉโ€๐Ÿ’ป ํ™œ๋™ & ํ›„๊ธฐ (0)
      • ๐Ÿต ์ด์•ผ๊ธฐ (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํƒœ๊ทธ
  • ๋งํฌ

    • github
    • velog
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ
    Spring
    ๊ฐœ๋ฐœ
    Java
    Spring Security
    docker
    ์œ„ํด๋ฆฌ ํŽ˜์ดํผ
    ์„œ๋ฒ„
    ์ž๋ฃŒ๊ตฌ์กฐ
    ๋ฐฐํฌ
    GIT
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    ๊ฐ์ฒด์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์†Œ์˜ ๐Ÿ€
[์ž๋ฃŒ๊ตฌ์กฐ][Java] HashSet ์ค‘๋ณต ์ œ๊ฑฐ ๋™์ž‘ ์›๋ฆฌ: HashSet์€ ์–ด๋–ป๊ฒŒ ์ค‘๋ณต์„ ํ™•์ธํ•˜๋‚˜์š”?

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.