๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โŒจ๏ธ Language/Java

[Java] ArrayList vs LinkedList, HashSet vs TreeSet ๋น„๊ต

by hyebin (Helia) 2025. 6. 4.
๋ฐ˜์‘ํ˜•

 


๋ชฉ์ฐจ

     

     

    ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ์ด์ œ ์‹ค์ œ ๊ตฌํ˜„์ฒด๋“ค์˜ ์ฐจ์ด๋ฅผ ์‚ดํŽด๋ณผ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.

    ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋”๋ผ๋„ ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ ์„ฑ๋Šฅ ํŠน์„ฑ์ด ์™„์ „ํžˆ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์— ๋งž๋Š” ์„ ํƒ์ด ์ •๋ง ์ค‘์š”ํ•˜์ฃ .

     

    ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” List์˜ ๋Œ€ํ‘œ ๊ตฌํ˜„์ฒด์ธ ArrayList์™€ LinkedList, Set์˜ ๋Œ€ํ‘œ ๊ตฌํ˜„์ฒด์ธ HashSet๊ณผ TreeSet์˜ ํŠน์ง•๊ณผ ์„ฑ๋Šฅ์„ ์˜ˆ์ œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋น„๊ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


    ๐Ÿ“ฆ ArrayList vs LinkedList

    ArrayList

    ArrayList๋Š” ๋™์  ๋ฐฐ์—ด(Dynamic Array) ๊ตฌ์กฐ๋กœ, ๋‚ด๋ถ€์ ์œผ๋กœ Object ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด ์š”์†Œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

    List<String> arrayList = new ArrayList<>();
    arrayList.add("Apple");    // ์ธ๋ฑ์Šค 0
    arrayList.add("Banana");   // ์ธ๋ฑ์Šค 1
    arrayList.add("Cherry");   // ์ธ๋ฑ์Šค 2
    
    // ์ธ๋ฑ์Šค๋กœ ๋น ๋ฅธ ์ ‘๊ทผ
    String fruit = arrayList.get(1);  // "Banana" - O(1)

     

    ArrayList ๋‚ด๋ถ€ ๊ตฌ์กฐ

    [Apple] [Banana] [Cherry] [null] [null] [null] ...
       0        1        2       3      4      5

     

    โœ… ArrayList ํŠน์ง•

    • ๋น ๋ฅธ ์ธ๋ฑ์Šค ์ ‘๊ทผ (O(1))
    • ๋์— ์ถ”๊ฐ€๋Š” ๋น ๋ฆ„ (O(1)), ์ค‘๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ๋Š” ๋А๋ฆผ (O(n))
    • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์  (๋ฐฐ์—ด ๊ธฐ๋ฐ˜)

     

    LinkedList

    LinkedList๋Š” ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Doubly Linked List) ๊ตฌ์กฐ๋กœ, ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ด์ „/๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

    List<String> linkedList = new LinkedList<>();
    linkedList.add("Apple");
    linkedList.add("Banana");
    linkedList.add("Cherry");
    
    // ์ฒ˜์Œ์ด๋‚˜ ๋์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฌ์›€
    linkedList.addFirst("Apricot");  // ๋งจ ์•ž์— ์ถ”๊ฐ€
    linkedList.addLast("Date");      // ๋งจ ๋’ค์— ์ถ”๊ฐ€

     

    LinkedList ๋‚ด๋ถ€ ๊ตฌ์กฐ

    [Apricot] ↔ [Apple] ↔ [Banana] ↔ [Cherry] ↔ [Date]

     

    โœ… LinkedList ํŠน์ง•

    • ์–‘ ๋ ์‚ฝ์ž…/์‚ญ์ œ ๋น ๋ฆ„ (O(1))
    • ์ค‘๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ ๋А๋ฆผ (O(n))
    • ์ธ๋ฑ์Šค ์ ‘๊ทผ ๋А๋ฆผ (O(n))
    • ๋…ธ๋“œ ํฌ์ธํ„ฐ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ

     

    ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?

    ๐Ÿ”ธ ArrayList

    • ์ธ๋ฑ์Šค ์ ‘๊ทผ์ด ๋นˆ๋ฒˆํ•  ๋•Œ
    • ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€/์กฐํšŒ๊ฐ€ ๋งŽ๊ณ  ์ค‘๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ์ ์„ ๋•Œ
    • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•  ๋•Œ

    ๐Ÿ”ธ LinkedList

    • ์–‘ ๋ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ์žฆ์„ ๋•Œ
    • Queue, Stack ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ํ™œ์šฉํ•  ๋•Œ
    • ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ž์ฃผ ๋ณ€ํ•  ๋•Œ

    ๐Ÿ”„ HashSet vs TreeSet

    HashSet 

    HashSet์€ ํ•ด์‹œ ํ…Œ์ด๋ธ”(Hash Table) ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์†Œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

    Set<String> hashSet = new HashSet<>();
    hashSet.add("Banana");
    hashSet.add("Apple");
    hashSet.add("Cherry");
    
    System.out.println(hashSet);  // ์ˆœ์„œ ๋ณด์žฅ ์•ˆ๋จ (ํ•ด์‹œ๊ฐ’์— ๋”ฐ๋ผ ๊ฒฐ์ •)
    // ์ถœ๋ ฅ ์˜ˆ: [Cherry, Apple, Banana]

     

    โœ… HashSet์˜ ํŠน์ง•

    • ์ˆœ์„œ ๋ณด์žฅ ์•ˆ๋จ: ํ•ด์‹œ๊ฐ’์— ๋”ฐ๋ผ ์ €์žฅ ์œ„์น˜ ๊ฒฐ์ •
    • ๋น ๋ฅธ ์„ฑ๋Šฅ: ํ‰๊ท  O(1) ์‹œ๊ฐ„๋ณต์žก๋„
    • null ํ—ˆ์šฉ: null ๊ฐ’์„ ํ•˜๋‚˜ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ

     

    TreeSet 

    TreeSet์€ Red-Black Tree(์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ํ•œ ์ข…๋ฅ˜) ๊ตฌ์กฐ๋กœ ์š”์†Œ๋ฅผ ์ž๋™ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

    Set<String> treeSet = new TreeSet<>();
    treeSet.add("Banana");
    treeSet.add("Apple");
    treeSet.add("Cherry");
    
    System.out.println(treeSet);  // ์ž๋™ ์ •๋ ฌ๋จ
    // ์ถœ๋ ฅ: [Apple, Banana, Cherry]

     

    โœ… TreeSet์˜ ํŠน์ง•

    • ์ž๋™ ์ •๋ ฌ: ์š”์†Œ๋“ค์ด ์ž๋™์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ ์œ ์ง€
    • NavigableSet ๊ตฌํ˜„: ๋ฒ”์œ„ ๊ฒ€์ƒ‰, ๊ทผ์ ‘ ๊ฐ’ ์ฐพ๊ธฐ ๋“ฑ ๊ฐ€๋Šฅ
    • null ๋ถˆ๊ฐ€: null ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์—†์Œ

     

    ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?

    ๐Ÿ”ธ HashSet

    • ์ˆœ์„œ๋ณด๋‹ค ๋น ๋ฅธ ๊ฒ€์ƒ‰์ด ์ค‘์š”ํ•  ๋•Œ
    • ์ค‘๋ณต ์—†๋Š” ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

    ๐Ÿ”ธ TreeSet

    • ์ •๋ ฌ์ด ํ•„์š”ํ•  ๋•Œ
    • ๋ฒ”์œ„ ๊ฒ€์ƒ‰(๋ถ€๋ถ„์ง‘ํ•ฉ) ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๋•Œ

    โฑ๏ธ ์„ฑ๋Šฅ๊ณผ ์‹œ๊ฐ„๋ณต์žก๋„

    ์—ฐ์‚ฐ ArrayList LinkedList HashSet TreeSet
    ์ถ”๊ฐ€(๋) O(1) O(1) O(1) ํ‰๊ท  O(log n)
    ์‚ฝ์ž…/์‚ญ์ œ(์ค‘๊ฐ„) O(n) O(n) O(1) ํ‰๊ท  O(log n)
    ๊ฒ€์ƒ‰(contains) O(n) O(n) O(1) ํ‰๊ท  O(log n)
    ์ˆœํšŒ O(n) O(n) O(n) O(n)
    ์ •๋ ฌ๋œ ์ˆœํšŒ  O(n log n) O(n log n) O(n log n) O(n)

     

    ๐Ÿ’ก Tip

    • ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ๊ณ  ์ˆœ์„œ ์œ ์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ArrayList๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”.
    • ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•˜๋‹ค๋ฉด LinkedList๊ฐ€ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ค‘๋ณต ์ œ๊ฑฐ์™€ ๋น ๋ฅธ ๊ฒ€์ƒ‰์ด ํ•„์š”ํ•˜๋ฉด HashSet์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ํ•„์š”ํ•˜๋ฉด TreeSet์ด ์ข‹์Šต๋‹ˆ๋‹ค.

    ๐Ÿ™Œ ๋งˆ๋ฌด๋ฆฌ

    ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Java ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ArrayList, LinkedList, HashSet, TreeSet์˜ ๊ตฌ์กฐ์™€ ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•ด ๋ดค์Šต๋‹ˆ๋‹ค.

     

    ์ปฌ๋ ‰์…˜์„ ์„ ํƒํ•  ๋•Œ๋Š” ๋ฐ์ดํ„ฐ์˜ ์‚ฌ์šฉ ํŒจํ„ด(์กฐํšŒ, ์‚ฝ์ž…/์‚ญ์ œ, ๊ฒ€์ƒ‰, ์ •๋ ฌ ์—ฌ๋ถ€)์„ ๊ณ ๋ คํ•ด ์ ์ ˆํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

    ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ArrayList์™€ HashSet์œผ๋กœ ์‹œ์ž‘ํ•ด ๋ณด๊ณ , ํŠน๋ณ„ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

     

     

    ๋‹ค์Œ ๊ธ€์—์„œ๋Š” Java์˜ Map ๊ณ„์—ด(HashMap, TreeMap, LinkedHashMap)์˜ ๋น„๊ต์™€ ์‚ฌ์šฉ๋ฒ•์„ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    ๊ถ๊ธˆํ•œ ์ ์ด๋‚˜ ๋” ์•Œ๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š” ๐Ÿ˜Š

    ๋ฐ˜์‘ํ˜•