์ถ์ฒ
ChatGPT
ArrayList๋ Java์ java.util ํจํค์ง์์ ์ ๊ณตํ๋ ๋์ ๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ปฌ๋ ์ ํด๋์ค์ด๋ค. ArrayList๋ ๋ฐฐ์ด์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ์ฌ ์์๋ค์ ์ ์ฅํ๋ฉฐ, ํ์์ ๋ฐ๋ผ ์๋์ผ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ค.
์์ค ์ฝ๋ ์์ ๋ Java 8 ๋ฒ์ ์ ArrayList ์์ค ์ฝ๋ ๋ถ๋ถ๋ค์ด๋ค.
1. ๊ธฐ๋ณธ ๊ตฌ์กฐ
ArrayList๋ List ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉฐ, ๋ด๋ถ์ ์ผ๋ก ๋์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์์๋ค์ ์ ์ฅํ๋ค. ์ด ๋ฐฐ์ด์ ํ์์ ๋ฐ๋ผ ์๋์ผ๋ก ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๋ค.
์ฃผ์ ํ๋
// ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋น ๋ฐฐ์ด๋ก, ์ด๊ธฐ ์ํ์์ ๋น์ด์๋ ArrayList๋ ์ด ๋ฐฐ์ด์ ์ฐธ์กฐํฉ๋๋ค.
private static final Object[] EMPTY_ELEMENTDATA = {};
// ๋น ๋ฐฐ์ด์ด์ง๋ง, ์ด๊ธฐ ์ฉ๋์ด ์ง์ ๋ ArrayList๋ ์ด ๋ฐฐ์ด์ ์ฐธ์กฐํฉ๋๋ค.
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// ์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๋ฐฐ์ด
transient Object[] elementData;
// ArrayList์ ํฌ๊ธฐ(ํ์ฌ ์ ์ฅ๋ ์์์ ์)
private int size;
elementData ๋ฐฐ์ด์ Object ํ์ ์ ๋ฐฐ์ด๋ก, ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์๋ ํํ์ด๋ค. ํ์ง๋ง, ์์ ํ์ ์ ์ ์ฅํ ์ ์๊ณ , ๋ฐ๋์ ํด๋น ํ์ ์ ๋ํผ ํด๋์ค (์: Integer, Double)๋ก ์ ์ฅ๋๋ค.
2. ์์ฑ์
ArrayList๋ ๋ค์ํ ์์ฑ์๋ฅผ ์ ๊ณตํ๋ค.
๊ธฐ๋ณธ ์์ฑ์
๋ด๋ถ ๋ฐฐ์ด์ ์ด๊ธฐ ํฌ๊ธฐ๊ฐ 10์ธ ๊ธฐ๋ณธ ์ฉ๋์ผ๋ก ์์ฑ๋๋ค.
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
์ด๊ธฐ ์ฉ๋์ ์ง์ ํ๋ ์์ฑ์
์ฌ์ฉ์๊ฐ ์ด๊ธฐ ์ฉ๋์ ์ง์ ํ ์ ์๋ค.
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
}
}
์ปฌ๋ ์ ์ ์ธ์๋ก ๋ฐ๋ ์์ฑ์
๋ค๋ฅธ ์ปฌ๋ ์ ์ ์ธ์๋ก ๋ฐ์ ์ด๊ธฐํํ ์ ์๋ค.
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
this.elementData = EMPTY_ELEMENTDATA;
}
}
3. ํฌ๊ธฐ ์กฐ์ Resizing
ArrayList์ ๊ฐ์ฅ ์ค์ํ ํน์ง ์ค ํ๋๋ ๋ฐฐ์ด์ด ๋์ ์ด๋ผ๋ ๊ฒ์ด๋ค. ์ฆ, ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์๋์ผ๋ก ์กฐ์ ๋๋ค. ์ด ์์ ์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ ๋, ๋ด๋ถ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ๋ถ์กฑํ๋ฉด ์ํ๋๋ค.
ํฌ๊ธฐ ์ฆ๊ฐ ๋ฉ์ปค๋์ฆ
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
} // ChatGPT์ ์ฝ๋
/** ๋ด ์ปดํจํฐ Java 8 ์ฝ๋
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
**/
private void ensureExplicitCapacity(int minCapacity) {
// ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐํ๊ธฐ ์ ์ ๊ตฌ์กฐ์ ์์ ํ์๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
modCount++;
// ํ์ํ ์ต์ ์ฉ๋์ด ํ์ฌ ๋ฐฐ์ด์ ๊ธธ์ด๋ณด๋ค ํฐ ๊ฒฝ์ฐ ํฌ๊ธฐ ์กฐ์
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
// ํ์ฌ ํฌ๊ธฐ์ 1.5๋ฐฐ๋ก ์ฆ๊ฐ
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
- ํ์ฌ ํฌ๊ธฐ์ 1.5๋ฐฐ๋ก ์ฆ๊ฐ: ArrayList๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ๋ฐฐ์ด ํฌ๊ธฐ์ 1.5๋ฐฐ๋ก ํฌ๊ธฐ๋ฅผ ๋๋ฆฐ๋ค. ์ฆ, ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๋๋ฆด ๋๋ง๋ค 50%์ฉ ์ฆ๊ฐํ๋ค.
- ๋ฐฐ์ด ๋ณต์ฌ: ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํ ํ, ๊ธฐ์กด ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด ๋ฐฐ์ด๋ก ๋ณต์ฌํ๋ค.
- ์ต๋ ํฌ๊ธฐ ๊ฒ์ฌ: JVM์ด ํ์ฉํ๋ ์ต๋ ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ์ง ์๋๋ก ๊ฒ์ฌํ๋ค.
4. ์์ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ
์์ ์ถ๊ฐ
public boolean add(E e) {
ensureCapacityInternal(size + 1); // ๋ด๋ถ ๋ฐฐ์ด์ด ์ถฉ๋ถํ์ง ํ์ธ
elementData[size++] = e; // ์์๋ฅผ ๋ฐฐ์ด์ ์ถ๊ฐํ๊ณ size๋ฅผ ์ฆ๊ฐ
return true;
}
- ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ ์ ensureCapacityInternal ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํ์ฌ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ํ์ธํ๊ณ ํ์ํ๋ฉด ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ค.
- ์์๋ฅผ elementData ๋ฐฐ์ด์ ์ถ๊ฐํ๊ณ , size๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
์์ ์ ๊ฑฐ
public E remove(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
elementData[--size] = null; // GC(๊ฐ๋น์ง ์ปฌ๋ ์
)์ ๋๊ธฐ ์ํด ๋ง์ง๋ง ์์๋ฅผ null๋ก ์ค์
return oldValue;
} // ChatGPT ์ ๊ณต ์ฝ๋
/** ๋ด ์ปดํจํฐ Java 8 ์ฝ๋
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
**/
- ์์๋ฅผ ์ ๊ฑฐํ ๋, ์ ๊ฑฐํ ์์ ๋ค์ ์๋ ๋ชจ๋ ์์๋ค์ ์ผ์ชฝ์ผ๋ก ์ด๋์ํจ๋ค.
- ์ด๋ ํ, ๋ง์ง๋ง ์์น์ ์์๋ null๋ก ์ค์ ํ์ฌ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
5. ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection) ์ง์
ArrayList๋ ๋์ ํฌ๊ธฐ ์กฐ์ ์ ์ํด ๋ฐฐ์ด์ ์ฌ์ฉํ๋ฏ๋ก, ๋ถํ์ํ ๊ฐ์ฒด๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ๋จ์ง ์๋๋ก ๊ด๋ฆฌํด์ผ ํ๋ค. ์์๋ฅผ ์ ๊ฑฐํ ๋, ํด๋น ์ธ๋ฑ์ค์ ๊ฐ์ null๋ก ์ค์ ํ์ฌ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ํ ์ ์๋๋ก ๋ค.
6. ์ฑ๋ฅ ํน์ฑ
- ์ธ๋ฑ์ค ์ ๊ทผ(O(1)): ๋ฐฐ์ด ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ๊ทผ์ด ๋น ๋ฅด๋ค.
- ์์ ์ถ๊ฐ(O(1) ํ๊ท , O(n) ์ต์ ): ์ผ๋ฐ์ ์ผ๋ก ๋์ ์์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋น ๋ฅด์ง๋ง, ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๋๋ ค์ง ์ ์๋ค.
- ์์ ์ ๊ฑฐ(O(n)): ์์๋ฅผ ์ ๊ฑฐํ ๋ ๋ฐฐ์ด์ ์์๋ค์ ์ด๋ํด์ผ ํ๊ธฐ ๋๋ฌธ์, ์์๊ฐ ๋ง์ ๊ฒฝ์ฐ ๋๋ ค์ง ์ ์๋ค.
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ArrayList์ LinkedList์ ์์ ์ํ ์ ์ฑ๋ฅ ์ฐจ์ด (1) | 2024.09.03 |
---|---|
[ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ] ์บ์ ์ง์ญ์ฑ + ArrayList์ ๊ด๊ณ (0) | 2024.09.03 |
[Java] ArrayList ์ฌ์ฉ์ ์ฃผ์ํด์ผ ํ ์ (1) | 2024.09.03 |
[ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ] ๋์ ๋ฐฐ์ด๊ณผ ์ ์ ๋ฐฐ์ด (0) | 2024.08.30 |
[ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ] (์ ์ ) ๋ฐฐ์ด์ ์ ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋์ด ์๋๊ฐ (0) | 2024.08.30 |