๐ ์ปดํ์ผ ํ์(Compile Time) vs ๋ฐํ์(Runtime) ์์กด๊ด๊ณ
- ์ปดํ์ผ ํ์(Compile Time)
- ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ ์์
- ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ๋ณด๋ ์์กด๊ด๊ณ
- ํด๋์ค ์์ค ์ฝ๋ ์์ ์ ์ ์ผ๋ก ๋ณด์ด๋ ์์กด๊ด๊ณ
- ์คํํ์ง ์์๋ ๋ณด์ด๋ ๊ด๊ณ
- ๋ฐํ์(Runtime)
- ํ๋ก๊ทธ๋จ ์คํ ์์
- ์ค์ ์์ฑ๋ ์ธ์คํด์ค๋ค์ด ์๋ก ์ฐธ์กฐํ๋ ๋์ ์ธ ์์กด๊ด๊ณ
- ์คํ ์ค์ ๋ณ๊ฒฝ๋ ์ ์์
์ปดํ์ผ ํ์ ์์กด๊ด๊ณ
public class BatchProcessor {
private final MyList<Integer> list; // ์ธํฐํ์ด์ค ํ์
์๋ง ์์กด
public BatchProcessor(MyList<Integer> list) {
this.list = list;
}
public void logic(int size) {
for (int i = 0; i < size; i++) {
list.add(0, i);
}
}
}
- BatchProcessor๋ ์ฝ๋์ MyList ์ธํฐํ์ด์ค๋ง ์์กด
- MyArrayList๋ MyLinkedList ๊ตฌ์ฒด ํด๋์ค์ ๋ํ ์ ๋ณด๋ ์ฝ๋์ ์์
- ์ด ์ํ๋ฅผ ์ปดํ์ผ ํ์ ์์กด๊ด๊ณ๋ผ๊ณ ํจ
๋ฐํ์ ์์กด๊ด๊ณ
MyArrayList<Integer> list = new MyArrayList<>();
BatchProcessor processor = new BatchProcessor(list); // ์ฃผ์
processor.logic(50_000);
- ์คํ ์์ ์ MyList์ ๊ตฌํ์ฒด๋ก MyArrayList ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์ฃผ์
- ๊ฒฐ๊ณผ์ ์ผ๋ก ์คํ ์ค์๋ BatchProcessor๊ฐ MyArrayList ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ
MyLinkedList<Integer> list = new MyLinkedList<>();
BatchProcessor processor = new BatchProcessor(list); // ์ฃผ์
processor.logic(50_000);
- ๋ฐํ์์ MyLinkedList๋ฅผ ์ฃผ์ ํ๋ฉด ์คํ ์์ ์์กด๊ด๊ณ๊ฐ ๋ณ๊ฒฝ๋จ
- ์ฝ๋๋ ์์ ์์ด ๊ตฌํ์ฒด๋ฅผ ๊ต์ฒด ๊ฐ๋ฅ
์ปดํ์ผ ํ์ ์์กด๊ด๊ณ
- ํด๋์ค ์ฝ๋์์ ์ด๋ค ํ์ (ํด๋์ค, ์ธํฐํ์ด์ค)์ ์์กดํ๋์ง ๋ํ๋
- BatchProcessor๋ MyList ์ธํฐํ์ด์ค์๋ง ์์กด → ๊ตฌํ ๋ณ๊ฒฝ์ด ์์ ๋ก์
๋ฐํ์ ์์กด๊ด๊ณ
- ํ๋ก๊ทธ๋จ ์คํ ์์ ์ ์ด๋ค ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ์ค์ ๋ก ์ฃผ์ ๋๊ณ ์ฌ์ฉ๋๋์ง
- DI(Dependency Injection)๋ฅผ ํตํด ์ ์ฐํ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅ
์ฅ์
- OCP(๊ฐ๋ฐฉ-ํ์ ์์น) ์ค์ → ์ฝ๋ ์์ ์์ด ์๋ก์ด ๊ตฌํ์ฒด ํ์ฅ ๊ฐ๋ฅ
- ๋ฐํ์์ ์ ๋ต(์๊ณ ๋ฆฌ์ฆ)์ ๊ต์ฒดํ๋ ์ ๋ต ํจํด ์ ์ฉ ๊ฐ๋ฅ
. ์ ๋ต ํจํด(Strategy Pattern)
- ์ ๋ต(Strategy) = ์๊ณ ๋ฆฌ์ฆ ์ธํฐํ์ด์ค (MyList)
- ๊ตฌ์ฒด ์ ๋ต(Concrete Strategy) = ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ฒด (MyArrayList, MyLinkedList)
- ์ปจํ ์คํธ(Context) = ์ ๋ต์ ์ฌ์ฉํ๋ ํด๋์ค (BatchProcessor)
- ์ ๋ต ํจํด์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋ ๋ณ๊ฒฝ ์์ด ์๊ณ ๋ฆฌ์ฆ ๊ต์ฒด ๊ฐ๋ฅ
MyArrayList vs MyLinkedList ์ฑ๋ฅ๋น๊ต
package com.example.collection.list;
public class MyListPerformanceTest {
public static void main(String[] args) {
int size = 50_000;
System.out.println("== MyArrayList ์ถ๊ฐ ==");
addFirst(new MyArrayList<>(), size);
addMid(new MyArrayList<>(), size); // ๋ฐ์ดํฐ ์ฐพ๋๋ฐ O(1), ๋ฐ์ดํฐ ์ถ๊ฐ(๋ฐ๊ธฐ) O(n)
MyArrayList<Integer> list = new MyArrayList<>(size);
addLast(list, size); // ์ฐพ๋๋ฐ O(1), ๋ฐ์ดํฐ ์ถ๊ฐ O(1)
int loop = 10000;
System.out.println("== MyArrayList ์กฐํ ==");
getIndex(list, loop, 0); // ์ ์กฐํ
getIndex(list, loop, size / 2); //์ค๊ฐ ์กฐํ
getIndex(list, loop, size - 1); // ๋ง์ง๋ง ์กฐํ
System.out.println("== MyArrayList ๊ฒ์ ==");
search(list, loop, 0); // ์ ์กฐํ
search(list, loop, size / 2); //์ค๊ฐ ์กฐํ
search(list, loop, size - 1); // ๋ง์ง๋ง ์กฐํ
System.out.println("== MyLinkedList ์ถ๊ฐ ==");
addFirst(new MyLinkedList<>(), size);
addMid(new MyLinkedList<>(), size); // ์ฐพ๋๋ฐ O(n), ๋ฐ์ดํฐ ์ถ๊ฐ O(1)
MyLinkedList<Integer> list1 = new MyLinkedList<>();
addLast(list1, size); // ์ฐพ๋๋ฐ O(n), ๋ฐ์ดํฐ ์ถ๊ฐ O(1)
System.out.println("== MyLinkedList ์กฐํ ==");
getIndex(list1, loop, 0); // ์ ์กฐํ
getIndex(list1, loop, size / 2); //์ค๊ฐ ์กฐํ
getIndex(list1, loop, size - 1); // ๋ง์ง๋ง ์กฐํ
System.out.println("== MyLinkedList ๊ฒ์ ==");
search(list1, loop, 0); // ์ ์กฐํ
search(list1, loop, size / 2); //์ค๊ฐ ์กฐํ
search(list1, loop, size - 1); // ๋ง์ง๋ง ์กฐํ
}
private static void addFirst(MyList<Integer> list, int size) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < size; i++) {
list.add(0, i);
}
long endTime = System.currentTimeMillis();
System.out.println("์์ ์ถ๊ฐ - ํฌ๊ธฐ : " + size + ", ๊ณ์ฐ ์๊ฐ : " + (endTime - startTime) + "ms");
}
private static void addMid(MyList<Integer> list, int size) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < size; i++) {
list.add(i / 2, i);
}
long endTime = System.currentTimeMillis();
System.out.println("ํ๊ท ์ถ๊ฐ - ํฌ๊ธฐ : " + size + ", ๊ณ์ฐ ์๊ฐ : " + (endTime - startTime) + "ms");
}
private static void addLast(MyList<Integer> list, int size) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < size; i++) {
list.add(i);
}
long endTime = System.currentTimeMillis();
System.out.println("๋ค์ ์ถ๊ฐ - ํฌ๊ธฐ : " + size + ", ๊ณ์ฐ ์๊ฐ : " + (endTime - startTime) + "ms");
}
private static void getIndex(MyList<Integer> list, int loop, int index) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
list.get(index);
}
long endTime = System.currentTimeMillis();
System.out.println("index : " + index +", ๋ฐ๋ณต : " + loop + ", ๊ณ์ฐ์๊ฐ : " + (endTime - startTime) + "ms");
}
private static void search(MyList<Integer> list, int loop, int findValue) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
list.indexOf(findValue);
}
long endTime = System.currentTimeMillis();
System.out.println("findValue : " + findValue +", ๋ฐ๋ณต : " + loop + ", ๊ณ์ฐ์๊ฐ : " + (endTime - startTime) + "ms");
}
}
โค ์ถ๊ฐ(์ฝ์ ) ์ฑ๋ฅ
- ์์ ์ถ๊ฐ
- MyArrayList: O(n) → 1349ms
- MyLinkedList: O(1) → 2ms
- ํ๊ท (์ค๊ฐ) ์ถ๊ฐ
- MyArrayList: O(n) → 638ms
- MyLinkedList: O(n) → 1066ms
- ๋ค์ ์ถ๊ฐ
- MyArrayList: O(1)→ 2ms
- MyLinkedList: O(n) → 2169ms (๋จ์ผ ์ฐ๊ฒฐ + ๊ผฌ๋ฆฌ ํฌ์ธํฐ ์์)
โค ์กฐํ(์ธ๋ฑ์ค ์ ๊ทผ) ์ฑ๋ฅ
- MyArrayList: index 0/์ค๊ฐ/๋ ๋ชจ๋ ≈0ms (O(1))
- MyLinkedList: index 0 1ms, ์ค๊ฐ 438ms, ๋ 873ms (O(n))
โค ๊ฒ์(๊ฐ ํ์) ์ฑ๋ฅ
- MyArrayList: 0 0ms, ์ค๊ฐ 115ms, ๋ 222ms (O(n))
- MyLinkedList: 0 0ms, ์ค๊ฐ 492ms, ๋ 983ms (O(n))
| ๊ธฐ๋ฅ | ๋ฐฐ์ด ๋ฆฌ์คํธ(MyArrayList) | ์ฐ๊ฒฐ ๋ฆฌ์คํธ(MyLinkedList) |
| ์์ ์ถ๊ฐ/์ญ์ | O(n) – 1369ms | O(1) – 2ms |
| ํ๊ท (์ค๊ฐ) ์ถ๊ฐ/์ญ์ | O(n) – 651ms | O(n) – 1112ms |
| ๋ค์ ์ถ๊ฐ/์ญ์ | O(1) – 2ms | O(n) – 2195ms |
| ์ธ๋ฑ์ค ์กฐํ | O(1) – 1ms | O(n) – ํ๊ท 438ms |
| ๊ฒ์ | O(n) – ํ๊ท 115ms | O(n) – ํ๊ท 492ms |
๐์ ๋ฆฌ
- ์ง์ ๊ตฌํ ๋ฒ์ ๊ธฐ์ค, ์์ฝ์ ์ LinkedList๊ฐ ์๋์ , ๋ค์ฝ์ ์ ArrayList๊ฐ ๋งค์ฐ ์ ๋ฆฌ.
- ์ค๊ฐ ์ฝ์ ์ ์ด๋ก ์ ๋น์ทํด๋ ์ค์ธก์์ ArrayList๊ฐ ๋ ๋น ๋ฅผ ๊ฐ๋ฅ์ฑ์ด ๋์(์บ์/๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ์ต์ ํ ๋๋ฌธ).
- ์กฐํ๋ ๋ฌด์กฐ๊ฑด ArrayList ๊ฐ์ธ.
- ์ค๋ฌด์์ ArrayList ๊ธฐ๋ณธ, ํน์ ์ผ์ด์ค(์์ฝ์ ๋น๋ฒ)๋ง LinkedList ๊ณ ๋ ค
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์๋ฐ ์ค๊ธ 2ํธ - Hash (0) | 2025.08.12 |
|---|---|
| ์๋ฐ ์ค๊ธ 2ํธ - List(3) (3) | 2025.08.10 |
| ์๋ฐ ์ค๊ธ 2ํธ - List(1) (1) | 2025.08.10 |
| ์๋ฐ ์ค๊ธ 2ํธ - LinkedList (2) | 2025.08.03 |
| ์๋ฐ ์ค๊ธ 2ํธ - ArrayList(3) (0) | 2025.07.20 |