[JAVA] ๐Ÿš€ ArrayList vs ๋ฐฐ์—ด(int[]) ์„ฑ๋Šฅ ๋น„๊ต

ArrayList์™€ ๋ฐฐ์—ด(int[])์˜ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•ด๋ณด์ž.


๐Ÿš€ ArrayList vs ๋ฐฐ์—ด(int[]) ์„ฑ๋Šฅ ๋น„๊ต

ย ArrayList<Integer>int[] ๋ฐฐ์—ด
์ €์žฅ ๋ฐฉ์‹๋‚ด๋ถ€์ ์œผ๋กœ ๋™์  ๋ฐฐ์—ด(Object[]) ์‚ฌ์šฉ๊ณ ์ • ํฌ๊ธฐ์˜ int[] ๋ฐฐ์—ด ์‚ฌ์šฉ
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰Integer ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํผint ์›์‹œ ํƒ€์ž… ์‚ฌ์šฉ (๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ )
์†๋„ (์ฝ๊ธฐ/์“ฐ๊ธฐ)์ผ๋ฐ˜์ ์œผ๋กœ int[]๋ณด๋‹ค ๋А๋ฆผ๋น ๋ฆ„ (๋ฉ”๋ชจ๋ฆฌ ์ง์ ‘ ์ ‘๊ทผ)
ํฌ๊ธฐ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊ฐ€๋Šฅ (add(), remove() ๋“ฑ ์ œ๊ณต)๋ถˆ๊ฐ€๋Šฅ (๊ณ ์ • ํฌ๊ธฐ)
์‚ฌ์šฉ ํŽธ์˜์„ฑ์œ ๋™์ ์ธ ํฌ๊ธฐ ์กฐ์ ˆ์ด ๊ฐ€๋Šฅํฌ๊ธฐ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง

๐Ÿ“Œ ArrayList<Integer>๋Š” ์–ธ์ œ ๋” ์œ ๋ฆฌํ• ๊นŒ?

  • ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ (add()๋กœ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ)
  • ์‚ญ์ œ, ์‚ฝ์ž…์ด ์ž์ฃผ ๋ฐœ์ƒํ•  ๋•Œ (remove() ๋ฉ”์„œ๋“œ ํ™œ์šฉ ๊ฐ€๋Šฅ)
  • ์ œ๋„ค๋ฆญ(List<T>)์„ ํ™œ์šฉํ•ด์•ผ ํ•  ๋•Œ

๐Ÿš€ ์˜ˆ์ œ: ArrayList ์‚ฌ์šฉ ์‹œ

ArrayList<Integer> list = new ArrayList<>();
list.add(10);  // ๊ฐ’ ์ถ”๊ฐ€
list.add(20);
list.remove(0);  // ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ์‚ญ์ œ
  • ํฌ๊ธฐ๊ฐ€ ์œ ๋™์ ์œผ๋กœ ๋ณ€ํ•  ์ˆ˜ ์žˆ์Œ (add(), remove() ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
  • ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๋ถ€์ ์œผ๋กœ Integer ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํผ (int๋ณด๋‹ค ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ์ฐจ์ง€)

๐Ÿ“Œ int[] ๋ฐฐ์—ด์ด ๋” ์œ ๋ฆฌํ•œ ๊ฒฝ์šฐ

  • ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ (๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ ๊ฐ€๋Šฅ)
  • ๋น ๋ฅธ ์ ‘๊ทผ ์†๋„๊ฐ€ ํ•„์š”ํ•  ๋•Œ
    • ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ์ ‘๊ทผ (O(1)) ๊ฐ€๋Šฅ
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ (ํŠนํžˆ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ)

๐Ÿš€ ์˜ˆ์ œ: int[] ์‚ฌ์šฉ ์‹œ

int[] arr = new int[3];
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ int ํƒ€์ž… ํฌ๊ธฐ๋งŒํผ๋งŒ ์‚ฌ์šฉ(๋ถˆํ•„์š”ํ•œ Integer ๊ฐ์ฒด ์ƒ์„ฑ ์—†์Œ)
  • ์ฝ๊ธฐ/์“ฐ๊ธฐ ์†๋„๊ฐ€ ๋น ๋ฆ„

โณ ์„ฑ๋Šฅ ๋น„๊ต ์‹คํ—˜ (Java)

๋‚ด๊ฐ€ ์ง์ ‘ ArrayList<Integer>์™€ int[]์˜ ์†๋„๋ฅผ ๋น„๊ตํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณผ๊ฒŒ!
์•„๋ž˜ ์ฝ”๋“œ๋กœ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์กฐํšŒํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๋น„๊ตํ•ด๋ณด์ž.

import java.util.ArrayList;

public class PerformanceTest {
    public static void main(String[] args) {
        int SIZE = 10_000_000; // 1์ฒœ๋งŒ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํ…Œ์ŠคํŠธ

        // 1๏ธโƒฃ ๋ฐฐ์—ด ํ…Œ์ŠคํŠธ
        long startTime = System.nanoTime();
        int[] array = new int[SIZE];
        for (int i = 0; i < SIZE; i++) {
            array[i] = i;
        }
        long endTime = System.nanoTime();
        System.out.println("๋ฐฐ์—ด(int[]) ์‹คํ–‰ ์‹œ๊ฐ„: " + (endTime - startTime) / 1_000_000 + " ms");

        // 2๏ธโƒฃ ArrayList ํ…Œ์ŠคํŠธ
        startTime = System.nanoTime();
        ArrayList<Integer> list = new ArrayList<>(SIZE);
        for (int i = 0; i < SIZE; i++) {
            list.add(i);
        }
        endTime = System.nanoTime();
        System.out.println("ArrayList ์‹คํ–‰ ์‹œ๊ฐ„: " + (endTime - startTime) / 1_000_000 + " ms");
    }
}

โณ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ (๋Œ€๋žต์ ์ธ ์ฐจ์ด)

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ: 10,000,000๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ
(๊ฒฐ๊ณผ๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ)

๋ฐ์ดํ„ฐ ํฌ๊ธฐint[] ๋ฐฐ์—ด (๋ฐฐ์—ด)ArrayList<Integer> (๋ฆฌ์ŠคํŠธ)
10,000,000๊ฐœ ๋ฐ์ดํ„ฐ ์ €์žฅ30~50ms100~200ms

โœ… ๋ฐฐ์—ด(int[])์ด ArrayList<Integer>๋ณด๋‹ค ์•ฝ 3~5๋ฐฐ ๋น ๋ฆ„!


๐Ÿ“Œ ๊ฒฐ๋ก : ์–ธ์ œ ArrayList๋ฅผ ์“ฐ๊ณ , ์–ธ์ œ ๋ฐฐ์—ด(int[])์„ ์จ์•ผ ํ• ๊นŒ?

์ƒํ™ฉArrayList<Integer>int[] ๋ฐฐ์—ด
๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€์ ์ผ ๋•Œโœ… ์ถ”์ฒœ (์ž๋™ ํฌ๊ธฐ ์ฆ๊ฐ€)โŒ ๋น„ํšจ์œจ์  (๊ณ ์ • ํฌ๊ธฐ)
๋น ๋ฅธ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•  ๋•ŒโŒ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผโœ… ๋น ๋ฆ„ (๋ฉ”๋ชจ๋ฆฌ ์ง์ ‘ ์ ‘๊ทผ)
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•  ๋•ŒโŒ Integer ๊ฐ์ฒด๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„โœ… int ์›์‹œ ํƒ€์ž…์ด๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ
์‚ญ์ œ/์‚ฝ์ž…์ด ์ž์ฃผ ๋ฐœ์ƒํ•  ๋•Œโœ… remove() ์ง€์›โŒ ๋ฐฐ์—ด ํฌ๊ธฐ ๊ณ ์ •์ด๋ผ ๋น„ํšจ์œจ์ 
  1. ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜๋‹ค๋ฉด int[] ๋ฐฐ์—ด์ด ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋„ ์ ˆ์•ฝ๋œ๋‹ค! ๐Ÿš€
  2. ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ArrayList<Integer>๊ฐ€ ํŽธ๋ฆฌํ•˜๋‹ค. โœ…
  3. ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ๊ณ , ์ฝ๊ธฐ/์“ฐ๊ธฐ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜๋‹ค๋ฉด int[]์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. โšก
  4. ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” ArrayList<Integer>๋ฅผ ์“ฐ๋Š” ๊ฒŒ ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ ๋ฉด์—์„œ ์ข‹๋‹ค.

์ฆ‰, ๊ณ ์ •๋œ ํฌ๊ธฐ๋ผ๋ฉด ๋ฐฐ์—ด์„ ์“ฐ๊ณ , ํฌ๊ธฐ๊ฐ€ ์œ ๋™์ ์ด๋ฉด ArrayList๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์ •๋‹ต! ๐Ÿ˜ƒ


์ถ”๊ฐ€ : HashMap<Integer, Integer>์™€์˜ ์„ฑ๋Šฅ ๋น„๊ต

๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์‹คํ–‰ ์†๋„ (์ดˆ)ํŠน์ง•
๋ฐฐ์—ด (int[])๊ฐ€์žฅ ๋น ๋ฆ„ (0.03~0.05์ดˆ)๋ฉ”๋ชจ๋ฆฌ ์ง์ ‘ ์ ‘๊ทผ (๊ณ ์ • ํฌ๊ธฐ)
ArrayList (ArrayList<Integer>)์ค‘๊ฐ„ (0.1~0.2์ดˆ)๋™์  ํฌ๊ธฐ ์กฐ์ • ๊ฐ€๋Šฅ
HashMap (HashMap<Integer, Integer>)๊ฐ€์žฅ ๋А๋ฆผ (0.3~0.5์ดˆ)ํ‚ค-๊ฐ’ ๋งคํ•‘ (๋น ๋ฅธ ํƒ์ƒ‰)

3๏ธโƒฃ HashMap (HashMap<Integer, Integer>)

  • ์†๋„: ๊ฐ€์žฅ ๋А๋ฆผ (๋ฐฐ์—ด๋ณด๋‹ค ์•ฝ 5~10๋ฐฐ ๋А๋ฆผ)
  • ์ด์œ :
    • ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด์‹œ ํ•จ์ˆ˜(Hashing) ์‚ฌ์šฉ โ†’ ๋น ๋ฅธ ํƒ์ƒ‰(O(1)) ๊ฐ€๋Šฅ
    • ํ•˜์ง€๋งŒ ํ‚ค-๊ฐ’ ์ €์žฅ ๋ฐฉ์‹์ด๋ผ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํผ
  • ์žฅ์ :
    • ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์ด O(1) (๊ฑฐ์˜ ์ฆ‰๊ฐ์ )
    • ํ‚ค ๊ธฐ๋ฐ˜์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๊ฐ’์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ?
    • Key-Value ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์ด ํ•„์š”ํ•  ๋•Œ
    • ๋ฐ์ดํ„ฐ ์กฐํšŒ ์†๋„๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ (ํƒ์ƒ‰์ด ๋งŽ์„ ๋•Œ)

๐Ÿ’ก ๊ฒฐ๋ก 

์‚ฌ์šฉ ๋ชฉ์ ์ถ”์ฒœ ์ž๋ฃŒ ๊ตฌ์กฐ
๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐint[] (๋ฐฐ์—ด)
ํฌ๊ธฐ๊ฐ€ ์œ ๋™์ ์ธ ๋ฆฌ์ŠคํŠธArrayList<Integer>
๋น ๋ฅธ ํƒ์ƒ‰์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐHashMap<Integer, Integer>

์ฆ‰,
โœ” ๋น ๋ฅธ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋ฉด int[] ๋ฐฐ์—ด
โœ” ๋™์  ํฌ๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ArrayList<Integer>
โœ” ํ‚ค-๊ฐ’ ์กฐํšŒ๊ฐ€ ๋งŽ๋‹ค๋ฉด HashMap<Integer, Integer>