๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java] ArrayList ์‚ฌ์šฉ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ 

์ถœ์ฒ˜

ChatGPT


1. ์ดˆ๊ธฐ ์šฉ๋Ÿ‰ ์ง€์ •

ArrayList์˜ ๊ธฐ๋ณธ ์šฉ๋Ÿ‰์€ 10์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ๊ธฐ๋ณธ ์šฉ๋Ÿ‰์„ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ, ArrayList๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ์กด ๋ฐฐ์—ด์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•œ๋‹ค. ์ด ๊ณผ์ •์€ ๋น„์‹ผ ์—ฐ์‚ฐ์œผ๋กœ, ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ 

๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ArrayList๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

List<String> list = new ArrayList<>(100); // ์˜ˆ์ƒ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰ ์„ค์ •

 

 

2. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๊ณผ ์ œ๊ฑฐ

ArrayList๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์š”์†Œ๋“ค์„ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌ์ŠคํŠธ์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ํ•ด๋‹น ์œ„์น˜๋ฅผ null๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ 

์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ ArrayList๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ null๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

list.remove(index);
list.set(index, null); // ์š”์†Œ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ช…์‹œ์ ์œผ๋กœ null๋กœ ์„ค์ •

 

 

Java 8 ArrayList ์˜ remove() ์†Œ์Šค ์ฝ”๋“œ ๋‚ด๋ถ€์˜ ๊ตฌํ˜„ ์‚ฌํ•ญ์„ ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์— ์˜๋ฌธ์ด ์ƒ๊ธด๋‹ค. 

1. index๊ฐ€ ๋งจ ๋ ์š”์†Œ์ผ ๊ฒฝ์šฐ : remove ๋‚ด๋ถ€์—์„œ ๋งจ ๋ ๊ณต๊ฐ„์— null์„ ํ• ๋‹นํ•œ๋‹ค. ๊ตฌ์ง€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

2. index๊ฐ€ ๋งจ ๋ ์š”์†Œ๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ : index ๋’ค์— ์žˆ๋Š” ์š”์†Œ๋“ค์ด ๋‹ค ํ•œ ์นธ์”ฉ ์•ž์œผ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค. ๋งˆ์ง€๋ง‰ ๊ณต๊ฐ„์€ null์ด ํ• ๋‹น๋˜๊ณ  ์‚ฌ์šฉ ์‚ฌ์ด์ฆˆ(์ ‘๊ทผ ๊ฐ€๋Šฅ ํฌ๊ธฐ)๋„ ํ•œ ์นธ ์ค„์–ด๋“ ๋‹ค. ์ด ์ƒํƒœ์—์„œ index ์นธ์˜ ์š”์†Œ๋ฅผ null ์ฒ˜๋ฆฌ ํ•˜๋Š” ๊ฑด, ์ด๋ฏธ ์˜ฎ๊ฒจ์ง„ ๊ฐ’์„ ๋Œ€์ฒดํ•ด null์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋ผ์„œ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ•๊ณผ๋Š” ์ „ํ˜€ ์ƒ๊ด€์—†๋‹ค.

ArrayList์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋Š” ์žˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹Œ ๊ฑฐ ๊ฐ™๋‹ค.

 

 

 ArrayList ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ

1. ArrayList์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ

ArrayList๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Object[] ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ด ๋ฐฐ์—ด์€ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•จ์— ๋”ฐ๋ผ ํฌ๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š”๋ฐ, ๋ฐฐ์—ด์ด ๊ฝ‰ ์ฐจ๋ฉด ํ˜„์žฌ ํฌ๊ธฐ์˜ 1.5๋ฐฐ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ํ• ๋‹นํ•˜๊ณ  ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ดˆ๊ธฐ ์šฉ๋Ÿ‰์ด 10์ธ ArrayList๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ์—ฌ๊ธฐ์— 10๊ฐœ์˜ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์šฉ๋Ÿ‰์ด ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋œ๋‹ค. 11๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ArrayList๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋” ํฐ ๋ฐฐ์—ด(15๊ฐœ ํฌ๊ธฐ)์„ ํ• ๋‹นํ•˜๊ณ , ๊ธฐ์กด ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ƒˆ ๋ฐฐ์—ด๋กœ ๋ณต์‚ฌํ•œ ํ›„ ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

ArrayList์˜ ํฌ๊ธฐ ์ฆ๊ฐ€ ๋ฐฐ์œจ

  • ava 1.4 ์ดํ•˜: Java 1.4 ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ArrayList์˜ ํฌ๊ธฐ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ๋งˆ๋‹ค 2๋ฐฐ๋กœ ์ฆ๊ฐ€ํ–ˆ๋‹ค.
  • Java 1.5 ์ดํ›„: Java 1.5๋ถ€ํ„ฐ๋Š” ํฌ๊ธฐ ์ฆ๊ฐ€ ์ •์ฑ…์ด ๋ณ€๊ฒฝ๋˜์–ด, ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ๋งˆ๋‹ค ํ˜„์žฌ ๋ฐฐ์—ด ํฌ๊ธฐ์˜ 1.5๋ฐฐ๋กœ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ณต์‹์ ์œผ๋กœ๋Š” (oldCapacity * 3) / 2 + 1 ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•˜์—ฌ ๋Š˜๋ฆฌ๋„๋ก ๋˜์–ด ์žˆ๋‹ค.

 

2. ์š”์†Œ ์ œ๊ฑฐ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฌธ์ œ

ArrayList์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  • ArrayList์—์„œ ํŠน์ • ์œ„์น˜์˜ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ํ•ด๋‹น ์š”์†Œ ๋’ค์— ์žˆ๋Š” ๋ชจ๋“  ์š”์†Œ๋“ค์„ ์•ž์œผ๋กœ ํ•œ ์นธ์”ฉ ์ด๋™์‹œ์ผœ ๋นˆ ๊ณต๊ฐ„์„ ๋ฉ”์šด๋‹ค.
  • ์ด๋•Œ ArrayList๋Š” ๋‹จ์ˆœํžˆ ์š”์†Œ๋“ค์„ ์ด๋™์‹œํ‚ฌ ๋ฟ์ด๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ฑฐ๋‚˜ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

์ด ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์€, ArrayList๊ฐ€ null์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ œ๊ฑฐ๋œ ์š”์†Œ๊ฐ€ ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leak)๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์œผ๋กœ, ํŠนํžˆ ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฐ์ฒด๋ฅผ ๋งŽ์ด ํฌํ•จํ•˜๋Š” ArrayList์—์„œ๋Š” ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์‹œ

import java.util.ArrayList;

public class Example {
    public static void main(String[] args) {
        ArrayList<Object> list = new ArrayList<>(10);
        
        // 10๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€
        for (int i = 0; i < 10; i++) {
            list.add(new Object());
        }
        
        // 5๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐ
        for (int i = 0; i < 5; i++) {
            list.remove(0);
        }
        
        // ์ด ์‹œ์ ์—์„œ ArrayList๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ 10๊ฐœ์˜ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ,
        // ํ˜„์žฌ 5๊ฐœ์˜ ์š”์†Œ๋งŒ ์ €์žฅํ•˜๊ณ  ์žˆ์Œ
        System.out.println("ArrayList size: " + list.size()); // 5 ์ถœ๋ ฅ
    }
}

 

์œ„ ์ฝ”๋“œ์—์„œ ArrayList๋Š” ์ฒ˜์Œ์— 10๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ 5๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๋ถ€ ๋ฐฐ์—ด ํฌ๊ธฐ๋Š” ์—ฌ์ „ํžˆ 10์ด๋ฉฐ, ์ œ๊ฑฐ๋œ 5๊ฐœ์˜ ์ž๋ฆฌ๋Š” null๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ์ œ๊ฑฐ๋œ ๊ฐ์ฒด๊ฐ€ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

3. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์œ„ํ—˜์„ฑ

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leak)๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ๋‚จ์•„ ์žˆ๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค. ArrayList์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ๋นˆ๋ฒˆํ•œ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝ์šฐ, ์ œ๊ฑฐ๋œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณ„์† ์‚ฌ์šฉ๋œ ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ๊ฒŒ ๋œ๋‹ค.

2. ๋กฑ๋Ÿฐ(long-running) ํ”„๋กœ๊ทธ๋žจ

์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ฒ˜๋Ÿผ ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ ์  ์Œ“์—ฌ ์„ฑ๋Šฅ์— ์‹ฌ๊ฐํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

4. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ์น˜

1. null ํ• ๋‹น

ํ•„์š” ์—†๋Š” ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ, ์ˆ˜๋™์œผ๋กœ null์„ ํ• ๋‹นํ•˜์—ฌ ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ€์‹  null ๊ฐ’ ํ™•์ธ์„ ์•ˆํ•˜๋ฉด NPE๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์„œ ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค.

list.remove(index);
list.set(index, null); // ๋ช…์‹œ์ ์œผ๋กœ null ํ• ๋‹น

 

2.  ArrayList์˜ ์šฉ๋Ÿ‰ ์ค„์ด๊ธฐ

์š”์†Œ๋ฅผ ๋งŽ์ด ์ œ๊ฑฐํ•œ ํ›„, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด trimToSize() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

list.trimToSize();

 

3. WeakReference ์‚ฌ์šฉ

ํฐ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ๋•Œ, ๊ฐ•ํ•œ ์ฐธ์กฐ ๋Œ€์‹  WeakReference๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์‚ฌ์šฉ

ArrayList๋Š” ํฌ๊ธฐ ์กฐ์ •์ด ๋นˆ๋ฒˆํ•œ ๊ฒฝ์šฐ ์ ์ ˆํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ LinkedList์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ

ArrayList๋Š” ๋น„๋™๊ธฐ์ ์ด๋ฉฐ, ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ArrayList๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ConcurrentModificationException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฃผ์˜ํ•  ์ 

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ArrayList๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, Collections.synchronizedList ๋ฉ”์„œ๋“œ๋กœ ๋™๊ธฐํ™”๋œ ๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.

List<String> syncList = Collections.synchronizedList(new ArrayList<>());

๋˜๋Š” CopyOnWriteArrayList์™€ ๊ฐ™์€ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•œ ๋Œ€์•ˆ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. ์„ฑ๋Šฅ ์ตœ์ ํ™”

ArrayList์—์„œ์˜ ์š”์†Œ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ ์กฐ์ •๊ณผ ์ด๋™ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์–ด O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ, ๋ฆฌ์ŠคํŠธ์˜ ์ค‘๊ฐ„์— ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ 

  • ๋ฆฌ์ŠคํŠธ์˜ ๋์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งŒ ArrayList๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ์š”์†Œ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ LinkedList์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

5. Null ์š”์†Œ

ArrayList๋Š” null ์š”์†Œ๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฆฌ์ŠคํŠธ์— null์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Œ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉด NullPointerException์ด ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ 

๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๊ฑฐ๋‚˜ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ, null ์š”์†Œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•œ๋‹ค.

 

6. ๋ฐฐ์—ด ๋ณต์‚ฌ ๋น„์šฉ

ArrayList๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฐ์—ด์ด ๊ฐ€๋“ ์ฐจ๋ฉด, ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ (์ตœ์‹  ๋ฒ„์ „์—์„œ)  1.5 ๋ฐฐ๋กœ ๋Š˜๋ฆฌ๊ณ  ๊ธฐ์กด์˜ ๋ฐฐ์—ด์„ ์ƒˆ ๋ฐฐ์—ด์— ๋ณต์‚ฌํ•œ๋‹ค. ์ด ๋ฐฐ์—ด ๋ณต์‚ฌ ์ž‘์—…์€ O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ํฐ ๋ฐฐ์—ด์—์„œ๋Š” ์ƒ๋‹นํ•œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ 

 

  • ์˜ˆ์ƒ๋˜๋Š” ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ ˆํ•œ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰์„ ์„ค์ •ํ•˜์—ฌ ๋ฐฐ์—ด ๋ณต์‚ฌ๋ฅผ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•œ๋‹ค.
  • ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ๋กœ์ง์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

7. Boxing๊ณผ Unboxing ๋น„์šฉ

ArrayList๋Š” ๊ฐ์ฒด ํƒ€์ž…๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์›์‹œ ํƒ€์ž…(int, char ๋“ฑ)์„ ์ €์žฅํ•˜๋ ค๋ฉด ๋ž˜ํผ ํด๋ž˜์Šค(Integer, Character ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ Boxing๊ณผ Unboxing์ด ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด๋Š” ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ 

์›์‹œ ํƒ€์ž…์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ArrayList ๋Œ€์‹  ์›์‹œ ํƒ€์ž…์„ ์ง€์›ํ•˜๋Š” ์ปฌ๋ ‰์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: Trove4j, FastUtil ๋“ฑ)๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

 

8. UnsupportedOpertationException

ArrayList๋ฅผ ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ์—์„œ ์ƒ์„ฑํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Arrays.asList()๋กœ ์ƒ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ArrayList๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๊ฒฝ์šฐ UnsupportedOperationException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ 

๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ ์‹œ ๋ช…ํ™•ํžˆ ์ƒˆ๋กœ์šด ArrayList ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));

 

Arrays.asList()์™€ ArrayList์˜ ์ฐจ์ด์ 

1. Arrays.asList() ๋ฉ”์„œ๋“œ

 

  • ์ด ๋ฉ”์„œ๋“œ๋Š” ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ด ๋ฆฌ์ŠคํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ๋ฐฑ์—…์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋ฆฌ์ŠคํŠธ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ(set() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ), ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ(add(), remove(), ๋“ฑ)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด UnsupportedOperationException์ด ๋ฐœ์ƒํ•œ๋‹ค.

์˜ˆ์‹œ

String[] array = {"a", "b", "c"};
List<String> list = Arrays.asList(array); // ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ
list.set(0, "x");  // ๊ฐ€๋Šฅ, ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ
list.add("d");     // UnsupportedOperationException ๋ฐœ์ƒ

 

 

2. ArrayList ํด๋ž˜์Šค

 

  • ArrayList๋Š” ๋™์  ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ์ฒด ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, add(), remove(), set(), ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ์™€ ํฌ๊ธฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ

ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("a"); // ๊ฐ€๋Šฅ
arrayList.add("b"); // ๊ฐ€๋Šฅ
arrayList.remove("a"); // ๊ฐ€๋Šฅ

 

 

Arrays.asList()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ArrayList๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ์˜ ๋ฌธ์ œ์ 

 

๋ถˆ๋ณ€ ๋ฆฌ์ŠคํŠธ์˜ ์ƒ์„ฑ

Arrays.asList()๋กœ ์ƒ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ๋Š” ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๋‹ค. ์ด ๋ฆฌ์ŠคํŠธ๋Š” ์›๋ณธ ๋ฐฐ์—ด์˜ ๋ทฐ ์—ญํ• ์„ ํ•˜๋ฉฐ, ์›๋ณธ ๋ฐฐ์—ด๊ณผ ๋™์ผํ•œ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๊ฐ™์€ ์š”์†Œ๋“ค์„ ๊ณต์œ ํ•œ๋‹ค.

 

์›๋ณธ ๋ฐฐ์—ด์˜ ๋ทฐ๋ผ๋Š” ์˜๋ฏธ

์›๋ณธ ๋ฐฐ์—ด์„ ์ง์ ‘ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ. ์›๋ณธ ๋ฐฐ์—ด๊ณผ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋ฐฐ์—ด์˜ ์š”์†Œ๋„ ๋ณ€๊ฒฝ๋˜๊ณก, ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ์—์„œ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

UnsupportedOperationException ๋ฐœ์ƒ

๋งŒ์•ฝ Arrays.asList()๋กœ ์ƒ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ArrayList๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด, ์ด ๋ฆฌ์ŠคํŠธ๋Š” ์—ฌ์ „ํžˆ ์›๋ณธ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ทฐ์ด๋ฏ€๋กœ add()๋‚˜ remove()์™€ ๊ฐ™์€ ํฌ๊ธฐ ๋ณ€๊ฒฝ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ UnsupportedOperationException์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

์˜ˆ์‹œ

List<String> list = Arrays.asList("a", "b", "c");
List<String> arrayList = new ArrayList<>(list); // `ArrayList`๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ์ „ํžˆ ๊ณ ์ •๋œ ํฌ๊ธฐ
arrayList.add("d"); // ๊ฐ€๋Šฅ, ArrayList๋Š” ์ƒˆ๋กœ์šด ๋™์  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•จ

List<String> fixedSizeList = Arrays.asList("x", "y", "z");
fixedSizeList.add("w"); // UnsupportedOperationException ๋ฐœ์ƒ

 

 

ArrayList๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

Arrays.asList()๋กœ ์ƒ์„ฑ๋œ ๊ณ ์ • ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์™„์ „ํ•œ ๋™์  ArrayList๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ArrayList์˜ ์ƒ์„ฑ์ž์— ๊ณ ์ • ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. ์ด ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋Š” ์›๋ณธ ๋ฐฐ์—ด๊ณผ ๋…๋ฆฝ์ ์ด๋ฉฐ, ๊ณ ์œ ์˜ ๋™์  ํฌ๊ธฐ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

String[] array = {"a", "b", "c"};
List<String> fixedSizeList = Arrays.asList(array); // ๊ณ ์ • ํฌ๊ธฐ ๋ฆฌ์ŠคํŠธ
List<String> dynamicArrayList = new ArrayList<>(fixedSizeList); // ์ƒˆ๋กœ์šด ๋™์  ArrayList ์ƒ์„ฑ
dynamicArrayList.add("d"); // ๊ฐ€๋Šฅ, ๋™์  ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ

 

์ด ์ฝ”๋“œ๋Š” fixedSizeList์˜ ์š”์†Œ๋“ค์„ ๊ฐ–๋Š” ์ƒˆ๋กœ์šด ArrayList๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋Š” ์›๋ณธ ๋ฐฐ์—ด๊ณผ ๋…๋ฆฝ์ ์ด๋ฉฐ, ํฌ๊ธฐ ์กฐ์ • ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ UnsupportedOperationException์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

์ฃผ์˜์ ๊ณผ Best Practice

1. ์›๋ณธ ๋ฐฐ์—ด๊ณผ์˜ ๋…๋ฆฝ์„ฑ

Arrays.asList()๋Š” ์›๋ณธ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๋ทฐ์ด๋ฏ€๋กœ, ๋ฐฐ์—ด์˜ ๋ณ€๊ฒฝ์ด ๋ฆฌ์ŠคํŠธ์—๋„ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋…๋ฆฝ์ ์ธ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ArrayList๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

2. ๋ถˆ๋ณ€ ๋ฆฌ์ŠคํŠธ์™€ ์ˆ˜์ • ๊ฐ€๋Šฅ ๋ฆฌ์ŠคํŠธ์˜ ์ฐจ์ด

Arrays.asList()๋กœ ์ƒ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ๋Š” ํฌ๊ธฐ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ถˆ๋ณ€ ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ์ด ์ ์„ ๋ช…ํ™•ํžˆ ์ธ์ง€ํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ๋‹ค.

3. ๋ฐฐ์—ด์˜ ์‚ฌ์šฉ ์‹œ์ 

๋งŒ์•ฝ ๊ณ ์ • ํฌ๊ธฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Arrays.asList()๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ข‹์ง€๋งŒ, ํฌ๊ธฐ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ์ƒˆ๋กœ์šด ArrayList๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•ด๋ผ.