๐ ์ ๋ค๋ฆญ์ด๋?
- ์๋ฐ์ ์ ๋ค๋ฆญ(Generic)์ ํด๋์ค๋ ๋ฉ์๋๋ฅผ ์ ์ํ ๋ ํ์ ์ ํ๋ผ๋ฏธํฐํํ์ฌ, ์ปดํ์ผ ์์ ์์ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ๊ณ ํ๋ณํ์ ์ค์ด๋ ์ฅ์ ์ด ์๋ค
MyArrayListV3
package com.example.collection.array;
import java.util.Arrays;
public class MyArrayListV3 {
private static final int DEFAULT_CAPACITY = 5;
private Object[] elementData;
private int size = 0;
public MyArrayListV3() {
elementData = new Object[DEFAULT_CAPACITY];
}
public MyArrayListV3(int initialCapacity) {
elementData = new Object[initialCapacity];
}
public int size() {
return size;
}
public void add(Object e) {
// ์ฝ๋ ์ถ๊ฐ
if (size == elementData.length) {
grow();
}
elementData[size++] = e;
}
// ์ฝ๋ ์ถ๊ฐ
public void add(int index, Object e) {
if (size == elementData.length) {
grow();
}
// ๋ฐ์ดํฐ ์ด๋
shiftRightFrom(index);
elementData[index] = e;
size++;
}
// ์ฝ๋ ์ถ๊ฐ, ์์์ ๋ง์ง๋ง๋ถํฐ index๊น์ง ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๊ธฐ
private void shiftRightFrom(int index) {
for (int i = size; i > index ; i--) {
elementData[i] = elementData[i - 1];
}
}
// ์ฝ๋ ์ถ๊ฐ
private void grow() {
int oldCapacity = elementData.length;
int newCapacity =oldCapacity * 2;
// ๋ฐฐ์ด์ ์๋ก๋ง๋ค๊ณ , ๊ธฐ์กด ๋ฐฐ์ด์ ์๋ก์ด ๋ฐฐ์ด์ ๋ณต์ฌ
elementData = Arrays.copyOf(elementData, newCapacity);
}
public Object get(int index) {
return elementData[index];
}
public Object set(int index, Object e) {
Object oldValue = get(index);
elementData[index] = e;
return oldValue;
}
// ์ฝ๋ ์ถ๊ฐ
public Object remove(int index) {
Object oldValue = get(index);
// ๋ฐ์ดํฐ ์ด๋
shiftLeftFrom(index);
size--;
elementData[size] = null;
return oldValue;
}
// ์ฝ๋ ์ถ๊ฐ ์์์ index๋ถํฐ ๋ง์ง๋ง๊น์ง ์ผ์ชฝ์ผ๋ก ๋ฐ๊ธฐ
private void shiftLeftFrom(int index) {
for (int i = index; i < size - 1; i++) {
elementData[i] = elementData[i + 1];
}
}
public int indexOf(Object o) {
for (int i = 0; i < size; i++) {
if (o.equals(elementData[i])) {
return i;
}
}
return -1;
}
public String toString() {
return Arrays.toString(Arrays.copyOf(elementData, size)) + " size = " + size + ", capacity = " + elementData.length;
}
}
V3์ ํ๊ณ: Object ํ์ ์ ๋ฌธ์
MyArrayListV3 numberList = new MyArrayListV3();
numberList.add(1);
numberList.add(2);
numberList.add("๋ฌธ์3"); // ์๋ชป๋ ํ์
์
๋ ฅ ๊ฐ๋ฅ
- Object๋ก ๋ชจ๋ ํ์ ํ์ฉ → ํ์ ํผ๋ ๊ฐ๋ฅ
- ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ผ ๋ ํ๋ณํ(๋ค์ด์บ์คํ ) ํ์ → ClassCastException ์ํ
โ V4: ์ ๋ค๋ฆญ ์ ์ฉ (MyArrayListV4)
package com.example.collection.array;
import java.util.Arrays;
public class MyArrayListV4<E> {
private static final int DEFAULT_CAPACITY = 5;
private Object[] elementData;
private int size = 0;
public MyArrayListV4() {
elementData = new Object[DEFAULT_CAPACITY];
}
public MyArrayListV4(int initialCapacity) {
elementData = new Object[initialCapacity];
}
public int size() {
return size;
}
public void add(E e) {
// ์ฝ๋ ์ถ๊ฐ
if (size == elementData.length) {
grow();
}
elementData[size++] = e;
}
// ์ฝ๋ ์ถ๊ฐ
public void add(int index, E e) {
if (size == elementData.length) {
grow();
}
// ๋ฐ์ดํฐ ์ด๋
shiftRightFrom(index);
elementData[index] = e;
size++;
}
// ์ฝ๋ ์ถ๊ฐ, ์์์ ๋ง์ง๋ง๋ถํฐ index๊น์ง ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๊ธฐ
private void shiftRightFrom(int index) {
for (int i = size; i > index ; i--) {
elementData[i] = elementData[i - 1];
}
}
// ์ฝ๋ ์ถ๊ฐ
private void grow() {
int oldCapacity = elementData.length;
int newCapacity =oldCapacity * 2;
// ๋ฐฐ์ด์ ์๋ก๋ง๋ค๊ณ , ๊ธฐ์กด ๋ฐฐ์ด์ ์๋ก์ด ๋ฐฐ์ด์ ๋ณต์ฌ
elementData = Arrays.copyOf(elementData, newCapacity);
}
@SuppressWarnings("unchecked")
public E get(int index) {
return (E) elementData[index];
}
public E set(int index, Object e) {
E oldValue = get(index);
elementData[index] = e;
return oldValue;
}
// ์ฝ๋ ์ถ๊ฐ
public E remove(int index) {
E oldValue = get(index);
// ๋ฐ์ดํฐ ์ด๋
shiftLeftFrom(index);
size--;
elementData[size] = null;
return oldValue;
}
// ์ฝ๋ ์ถ๊ฐ ์์์ index๋ถํฐ ๋ง์ง๋ง๊น์ง ์ผ์ชฝ์ผ๋ก ๋ฐ๊ธฐ
private void shiftLeftFrom(int index) {
for (int i = index; i < size - 1; i++) {
elementData[i] = elementData[i + 1];
}
}
public int indexOf(E o) {
for (int i = 0; i < size; i++) {
if (o.equals(elementData[i])) {
return i;
}
}
return -1;
}
public String toString() {
return Arrays.toString(Arrays.copyOf(elementData, size)) + " size = " + size + ", capacity = " + elementData.length;
}
}
- E๋ ํ์ ํ๋ผ๋ฏธํฐ (๋ณดํต Element์ ์ค์๋ง)
- ๋ด๋ถ๋ ์ฌ์ ํ Object[] ๋ฐฐ์ด์ ์ฌ์ฉํ์ง๋ง, ์ ๋ ฅ/์ถ๋ ฅ ์ ํ์ ์์ ์ฑ ํ๋ณด
โ ๏ธ ์ Object ๋ฐฐ์ด์ ๊ทธ๋๋ก ์ธ๊น?
// ๋ถ๊ฐ๋ฅํ ์ฝ๋
E[] elementData = new E[DEFAULT_CAPACITY]; // ์ปดํ์ผ ์ค๋ฅ
// ์ค์ ๊ตฌํ
Object[] elementData = new Object[DEFAULT_CAPACITY];
- ์๋ฐ์ ์ ๋ค๋ฆญ์ ํ์ ์๊ฑฐ(type erasure) ๋๋ฌธ์ ๋ฐํ์์ ํ์ ์ ๋ณด๋ฅผ ์ ์ ์์
- ๋ฐ๋ผ์ Object[]๋ก ์์ฑํ๊ณ get์ ๊ฐ์ ์บ์คํ → ์์ ํ๊ฒ ์ฐ๋ ค๋ฉด E ํ์ ๋ง ๋ฃ๋๋ก ์ ํ
๐งน ์ฑ๋ฅ & ๋จ์ ์ ๋ฆฌ
| ์ฐ์ฐ | ์๊ฐ๋ณต์ก๋ |
| ๋ง์ง๋ง์ ์ถ๊ฐ | O(1) |
| ์/์ค๊ฐ์ ์ถ๊ฐ | O(n) |
| ๋ง์ง๋ง์ ์ญ์ | O(1) |
| ์/์ค๊ฐ์ ์ญ์ | O(n) |
| ์ธ๋ฑ์ค ์กฐํ | O(1) |
| ๊ฐ ๊ฒ์ | O(n) |
๋จ์
- ๋ฐฐ์ด ๊ธฐ๋ฐ → ์ด๊ธฐ ํฌ๊ธฐ ์ค์ ์ด๋ ค์ (ํฌ๊ธฐ ์ด๊ณผ ์ grow ํ์)
- ์ค๊ฐ ์ฝ์ /์ญ์ ์ ๋ฐ์ดํฐ ์ด๋ ํ์ → O(n)
์ถ์ฒ: ์ธํ๋ฐ ์๋ฐ ์ค๊ธ 2ํธ - ๊น์ํ
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์๋ฐ ์ค๊ธ 2ํธ - List(1) (1) | 2025.08.10 |
|---|---|
| ์๋ฐ ์ค๊ธ 2ํธ - LinkedList (2) | 2025.08.03 |
| ์๋ฐ ์ค๊ธ 2ํธ - ArrayList(2) (0) | 2025.07.19 |
| ์๋ฐ ์ค๊ธ 2ํธ - ArrayList(1) (0) | 2025.07.07 |
| ์๋ฐ ์ค๊ธ 2ํธ - ์ ๋ค๋ฆญ(4) (0) | 2025.06.01 |