์ถ์ฒ
ChatGPT
์๋ฐ 1.8 ์์ค ์ฝ๋
์๋ฐ 1.8์ HashSet ๊ตฌํ ์ค ์ฝ๋
HashSet์ ๋ด๋ถ์ HashMap์ ์ด์ฉํ๊ณ , ์ด HashMap์ transient ํค์๋๋ก ์ ์ธ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
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;
}
์ด์
HashSet ํด๋์ค ๋ด๋ถ์์ HashMap์ด transient ์์ฝ์ด๋ก ์ ์ธ๋ ์ด์ ๋ HashSet์ด ์ง๋ ฌํ๋ ๋ ํน์ ํ ๋ฐฉ๋ฒ์ผ๋ก ์ง๋ ฌํ ๊ณผ์ ์ ์ ์ดํ๊ธฐ ์ํด์์ด๋ค.
1. ์ง๋ ฌํ ํ์ ์ ์ด
- HashSet ํด๋์ค๋ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ฐํด HashMap์ ์ฌ์ฉํ์ง๋ง, HashSet์ ์ง๋ ฌํ ํ์์ HshMap์ ๊ตฌ์กฐ์ ๋ค๋ฅด๋ค. HashSet์ ๋จ์ํ ์งํฉ(set)์ผ๋ก์์ ๊ธฐ๋ฅ๋ง์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ง๋ ฌํ ์์๋ HashMap ์ ์ฒด๋ฅผ ์ง๋ ฌํํ ํ์๊ฐ ์๋ค. ๋์ , HashSet์ ์ ์ฅ๋ ์์๋ค๋ง ์ง๋ ฌํํ๋ฉด ๋๋ค.
- HashMap์ transient๋ก ์ ์ธํจ์ผ๋ก์จ, ๊ธฐ๋ณธ ์ง๋ ฌํ ๋ฐฉ์์์๋ HashMap ์์ฒด๊ฐ ์ง๋ ฌํ๋์ง ์๋๋ก ํ๊ณ , HashSet์ ์ง๋ ฌํ ๋งค์ปค๋์ฆ์ ํตํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ก ์ง๋ ฌํํ ์ ์๊ฒ ํ๋ค.
2. ์ปค์คํ ์ง๋ ฌํ ๊ตฌํ
- HashSet ํด๋์ค๋ wirteObject์ readObject ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํด ์ปค์คํ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ ๋ก์ง์ ๊ตฌํํ๊ณ ์๋ค. ์ด ๋ฉ์๋ค์ HashSet์ ํฌํจ๋ ์์๋ค๋ง ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํํ๋๋ก ์ฒ๋ฆฌํ๋ค.
- ๋ฐ๋ผ์, HashMap ํ๋๊ฐ transient๋ก ์ ์ธ๋์๊ธฐ ๋๋ฌธ์, JVM์ ์ด ํ๋๋ฅผ ์๋์ผ๋ก ์ง๋ ฌํํ์ง ์๊ณ , ๋์ HashSet ํด๋์ค์ ์ปค์คํ ๋ก์ง์ ๋ฐ๋ผ ์์๋ค์ด ์ง๋ ฌํ๋๋ค.
HashSet์ ์ปค์คํ ์ง๋ ฌํ ๊ตฌํ์ด ๋ ์์ค ์ฝ๋๋ ์๋์ ์๋ค.
3. ๋ถํ์ํ ๋ฐ์ดํฐ์ ์ง๋ ฌํ ๋ฐฉ์ง
๋ง์ฝ HashMap์ด ์ง๋ ฌํ ๊ณผ์ ์์ ๊ทธ๋๋ก ์ง๋ ฌํ๋๋ค๋ฉด, HashSet์ ํ์ํ ๊ฒ ์ด์์ ๋ฐ์ดํฐ๊ฐ ์ง๋ ฌํ๋ ์ ์๋ค. ์ด๋ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ด๋ํ ์ ์๊ณ , ์ง๋ ฌํ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ปค์ ธ ๋คํธ์ํฌ ์ ์ก ์ ๋นํจ์จ์ ์ผ ์ ์๋ค.
์ฝ๋
์๋ฐ 1.8์ HashSet ํด๋์ค์ ์ง๋ ฌํ ๊ด๋ จ ๋ถ๋ถ์ ์ฝ๋๋ค.
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
//Set์ ์์๋ค์ ์ง๋ ฌํํ๋ ๋ก์ง
// Write out any hidden serialization magic
s.defaultWriteObject();
// Write out HashMap capacity and load factor
s.writeInt(map.capacity());
s.writeFloat(map.loadFactor());
// Write out size
s.writeInt(map.size());
// Write out all elements in the proper order.
for (E e : map.keySet())
s.writeObject(e);
}
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// Set์ ์์๋ค์ ์ญ์ง๋ ฌํํ๋ ๋ก์ง
// Read in any hidden serialization magic
s.defaultReadObject();
// Read capacity and verify non-negative.
int capacity = s.readInt();
if (capacity < 0) {
throw new InvalidObjectException("Illegal capacity: " +
capacity);
}
// Read load factor and verify positive and non NaN.
float loadFactor = s.readFloat();
if (loadFactor <= 0 || Float.isNaN(loadFactor)) {
throw new InvalidObjectException("Illegal load factor: " +
loadFactor);
}
// Read size and verify non-negative.
int size = s.readInt();
if (size < 0) {
throw new InvalidObjectException("Illegal size: " +
size);
}
// Set the capacity according to the size and load factor ensuring that
// the HashMap is at least 25% full but clamping to maximum capacity.
capacity = (int) Math.min(size * Math.min(1 / loadFactor, 4.0f),
HashMap.MAXIMUM_CAPACITY);
// Constructing the backing map will lazily create an array when the first element is
// added, so check it before construction. Call HashMap.tableSizeFor to compute the
// actual allocation size. Check Map.Entry[].class since it's the nearest public type to
// what is actually created.
SharedSecrets.getJavaOISAccess()
.checkArray(s, Map.Entry[].class, HashMap.tableSizeFor(capacity));
// Create backing HashMap
map = (((HashSet<?>)this) instanceof LinkedHashSet ?
new LinkedHashMap<E,Object>(capacity, loadFactor) :
new HashMap<E,Object>(capacity, loadFactor));
// Read in all elements in the proper order.
for (int i=0; i<size; i++) {
@SuppressWarnings("unchecked")
E e = (E) s.readObject();
map.put(e, PRESENT);
}
}
transient ํค์๋๋ฅผ ์ฌ์ฉํด HashMap์ ์ง๋ ฌํ ๋์์์ ์ ์ธํ๊ณ , ๋์ HashSet์ ์์๋ค๋ง ์ง๋ ฌํํด ํจ์จ์ฑ์ ๋์ธ ๊ฒ์ด๋ค.
๊ฒฐ๋ก
HashSet ๋ด๋ถ์์ HashMap ํ๋๋ฅผ transient๋ก ์ ์ธํ ๊ฒ์ ์ง๋ ฌํ ์ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ํผํ๊ณ , HashSet์ ์ ํฉํ ์ง๋ ฌํ ํ์์ ์ฌ์ฉํ๊ธฐ ์ํ ์กฐ์น์ด๋ค. ์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ณ ์ง๋ ฌํ/์ญ์ง๋ ฌํ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[OOP] ๋์ ๋ฐ์ธ๋ฉ (0) | 2024.09.04 |
---|---|
[Java] HashSet ๊ตฌํ (0) | 2024.09.04 |
[Java] transient ์์ฝ์ด (0) | 2024.09.04 |
[Java] Set๊ณผ Map์ ์ฐจ์ด์ (0) | 2024.09.03 |
[Java] ArrayList์ LinkedList์ ์์ ์ํ ์ ์ฑ๋ฅ ์ฐจ์ด (1) | 2024.09.03 |