Tech Stack/Java & Spring
[์ปฌ๋ ์ ํ๋ ์์ํฌ] Set
_silver
2025. 4. 10. 21:20
1. Set์ด๋?
- ์ค๋ณต์ ํ์ฉํ์ง ์๊ณ , ์์๋ฅผ ๋ณด์ฅํ์ง ์๋ ์๋ฃ๊ตฌ์กฐ
- ์๋ฐ์์๋ Set ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ค์ํ ๊ตฌํ์ฒด ์ ๊ณต
2. ์๋ฐ๊ฐ ์ ๊ณตํ๋ ๋ํ์ ์ธ Set ๊ตฌํ์ฒด
๋๋ณด๊ธฐ
โ๏ธ HashSet ์ค๋ช
| ํน์ง | ์ค๋ช |
| ๊ตฌํ | ๋ด๋ถ์ ์ผ๋ก ํด์ ํ ์ด๋ธ์ ์ฌ์ฉ |
| ์์ | ๋ณด์ฅํ์ง ์์(์ ๋ ฅ ์์ X) |
| ์ฑ๋ฅ | ํ๊ท ์๊ฐ ๋ณต์ก๋ O(1) |
| ์ฉ๋ | ์ค๋ณต ์ ๊ฑฐ๊ฐ ์ค์ํ๊ณ ์์๊ฐ ์ค์ํ์ง ์์ ๊ฒฝ์ฐ |
๋๋ณด๊ธฐ
โ๏ธ LinkedHashSet ์ค๋ช
| ํน์ง | ์ค๋ช |
| ๊ตฌํ | HashSet + ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌ์กฐ |
| ์์ | ์ ๋ ฅ ์์๋ฅผ ์ ์ง |
| ์ฑ๋ฅ | HashSet๋ณด๋ค๋ ์ฝ๊ฐ ๋๋ฆฌ์ง๋ง ์ฌ์ ํ ๋น ๋ฆ |
| ์ฉ๋ | ์ ๋ ฅ ์์๋ฅผ ์ ์งํ๋ฉด์ ์ค๋ณต ์ ๊ฑฐ๊ฐ ํ์ํ ๋ ์ฌ์ฉ |
๋๋ณด๊ธฐ
โ๏ธ TreeSet ์ค๋ช
| ํน์ง | ์ค๋ช |
| ๊ตฌํ | ๋ด๋ถ์ ์ผ๋ก ๋ ๋-๋ธ๋ ํธ๋ฆฌ(์ด์ง ํ์ ํธ๋ฆฌ์ ์ผ์ข ) ์ฌ์ฉ |
| ์์ | ์๋ ์ ๋ ฌ๋จ (๊ธฐ๋ณธ์ ์ค๋ฆ์ฐจ์, Comparator๋ก ์ปค์คํ ๊ฐ๋ฅ) |
| ์ฑ๋ฅ | O(log n) (์ด์ง ํ์ ํธ๋ฆฌ ๊ธฐ๋ฐ) |
| ์ฉ๋ | ์ ๋ ฌ๋ Set, ๋ฒ์ ๊ฒ์์ด ํ์ํ ๋ ์ฌ์ฉ |
3. Set ์ข ๋ฅ๋ณ ๋น๊ต ์์
๋๋ณด๊ธฐ
public class JavaSetMain {
public static void main(String[] args) {
run(new HashSet<>()); // ์์ ๋ณด์ฅ X
run(new LinkedHashSet<>()); // ์
๋ ฅ ์์ ๋ณด์ฅ
run(new TreeSet<>()); // ์ ๋ ฌ๋ ์์ ๋ณด์ฅ
}
private static void run(Set<String> set) {
System.out.println("set = " + set.getClass());
set.add("C");
set.add("B");
set.add("A");
set.add("1");
set.add("2");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
}
}
โ๏ธ ์คํ ๊ฒฐ๊ณผ
set = class java.util.HashSet
A 1 B 2 C
set = class java.util.LinkedHashSet
C B A 1 2
set = class java.util.TreeSet
1 2 A B C
4. TreeSet์ ๋ด๋ถ - ์ด์ง ํ์ ํธ๋ฆฌ
โ๏ธ ์ด์ง ํ์ ํธ๋ฆฌ๋?
- ๋ ธ๋์ ์ผ์ชฝ์๋ ๋ ์์ ๊ฐ, ์ค๋ฅธ์ชฝ์๋ ๋ ํฐ ๊ฐ์ด ๋ค์ด๊ฐ
- ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ์ฆ์ ์ ๋ ฌ๋ ๊ตฌ์กฐ๋ก ์ ์ง๋จ
โ๏ธ TreeSet์ ์ฅ์
- ์๋ ์ ๋ ฌ(Comparable ๋๋ Comparator ๊ธฐ๋ฐ)
- ์ ๋ ฌ๋ ๋ฒ์ ๊ฒ์์ด ์ฌ์
- ํ์/์ฝ์ /์ญ์ ์ฑ๋ฅ O(log n) ๋ณด์ฅ (๋ ๋-๋ธ๋ ํธ๋ฆฌ ๋๋ถ)
5. Set์ ์ค๋ณต ์ ๊ฑฐ ์ค์ ์์
โ๏ธ ๋ฌธ์ 1 - ์ค๋ณต ์ ๊ฑฐ(์์ ์๊ด ์์)
Integer[] arr = {30, 20, 20, 10, 10};
Set<Integer> set = new HashSet<>();
for (Integer n : arr) {
set.add(n); // ์ค๋ณต ์ ๊ฑฐ ์๋ ์ฒ๋ฆฌ
}
for (Integer n : set) {
System.out.println(n); // ์์ ๋ณด์ฅ X
}
โ๏ธ ๋ฌธ์ 2 - ์ค๋ณต ์ ๊ฑฐ + ์ ๋ ฅ ์์ ์ ์ง
Integer[] arr = {30, 20, 20, 10, 10};
Set<Integer> set = new LinkedHashSet<>(List.of(arr));
for (Integer n : set) {
System.out.println(n); // ์
๋ ฅ ์์๋๋ก ์ถ๋ ฅ: 30, 20, 10
}
โ๏ธ ๋ฌธ์ 3 - ์ค๋ณต ์ ๊ฑฐ + ์ ๋ ฌ๋ ์์ ์ถ๋ ฅ
Set<Integer> set = new TreeSet<>(List.of(30, 20, 20, 10, 10));
for (Integer n : set) {
System.out.println(n); // ์ ๋ ฌ๋ ์์: 10, 20, 30
}
6. Set ์ฐ์ฐ(ํฉ์งํฉ, ๊ต์งํฉ, ์ฐจ์งํฉ)
Set<Integer> set1 = new HashSet<>(List.of(1, 2, 3, 4, 5));
Set<Integer> set2 = new HashSet<>(List.of(3, 4, 5, 6, 7));
// ํฉ์งํฉ
Set<Integer> union = new HashSet<>(set1);
union.addAll(set2); // ๋ชจ๋ ์์ ํฉ์น๊ธฐ
// ๊ต์งํฉ
Set<Integer> intersection = new HashSet<>(set1);
intersection.retainAll(set2); // ๊ณตํต ์์๋ง ๋จ๊ธฐ๊ธฐ
// ์ฐจ์งํฉ
Set<Integer> difference = new HashSet<>(set1);
difference.removeAll(set2); // set2 ์์ ์ ๊ฑฐ
System.out.println("ํฉ์งํฉ: " + union);
System.out.println("๊ต์งํฉ: " + intersection);
System.out.println("์ฐจ์งํฉ: " + difference);
7. equals & hashCode ์ค๋ฒ๋ผ์ด๋ฉ ์์
public class Rectangle {
private int width;
private int height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Rectangle)) return false;
Rectangle r = (Rectangle) o;
return width == r.width && height == r.height;
}
@Override
public int hashCode() {
return Objects.hash(width, height); // width + height ๊ธฐ์ค ํด์ ์์ฑ
}
@Override
public String toString() {
return "Rectangle{" + "width=" + width + ", height=" + height + '}';
}
}
Set<Rectangle> set = new HashSet<>();
set.add(new Rectangle(10, 10));
set.add(new Rectangle(20, 20));
set.add(new Rectangle(20, 20)); // ์ค๋ณต์ผ๋ก ์ ์ฅ ์ ๋จ
for (Rectangle r : set) {
System.out.println("rectangle = " + r);
}
8. HashSet์ ์ฑ๋ฅ ์ต์ ํ ์๋ฆฌ
- ๊ธฐ๋ณธ ๋ฒํท ํฌ๊ธฐ: 16
- ๋ถํ์จ(load factor): 0.75 (75%)
- ๋ฒํท ์ฌ์ฉ๋ฅ ์ด 75%๋ฅผ ๋์ผ๋ฉด → ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ 2๋ฐฐ๋ก ํ์ฅ + ๋ชจ๋ ์์ ์ฌ๋ฐฐ์น(rehashing)
- ์ฑ๋ฅ ์ ์ง๋ฅผ ์ํด ํ์ํ ๋น์ฉ์ด์ง๋ง, ์๋ฐ๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌ
9. ์ ๋ฆฌ
- HashSet : ์ค๋ณต ์ ๊ฑฐ
- LinkedHashSet : ์ค๋ณต ์ ๊ฑฐ + ์์ ์ ์ง
- TreeSet : ์ค๋ณต์ ๊ฑฐ + ์ ๋ ฌ ์ ์ง
| ๊ตฌํ์ฒด | ์ค๋ณต ์ ๊ฑฐ | ์์ ๋ณด์ฅ | ์๋ ์ ๋ ฌ | ์์ |
| HashSet | O | X | X | ๋งค์ฐ ๋น ๋ฆ O(1) |
| LinkedHashSet | O | O (์ ๋ ฅ ์์) | X | ๋ณดํต |
| TreeSet | O | O (๊ฐ ์ ๋ ฌ ์์) | O | ๋๋ฆผ O(log n) |
<์ฐธ๊ณ > - ๊น์ํ์ ์ค์ ์๋ฐ ์ค๊ธ2ํธ ๊ฐ์ ์น์ 9. ์ปฌ๋ ์ ํ๋ ์์ํฌ Set