๐Ÿงช [Java] Collection toArray ์™€ Stream toArray ์‚ฌ์šฉ๋ฒ• ๋ฐ ์„ฑ๋Šฅ ๋น„๊ต

์ด์„œยท2023๋…„ 9์›” 18์ผ
0

โ˜•๏ธ Java ํ”ผํŠธ์Šคํ†ฑ

๋ชฉ๋ก ๋ณด๊ธฐ
1/1

์•ˆ๋…•ํ•˜์„ธ์š” ์ด์„œ์ž…๋‹ˆ๋‹ค. Collection์˜ toArray ๋ฉ”์„œ๋“œ์™€ Stream์˜ toArray ๋ฉ”์„œ๋“œ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ ์ž ํ•ด์š”.๐Ÿง

Collection ์ธํ„ฐํŽ˜์ด์Šค๋Š” toArray ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, Stream ์ธํ„ฐํŽ˜์ด์Šค ๋˜ํ•œ toArray ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๊ณ  ์žˆ์–ด์š”.

Collection์˜ toArray ๋ฉ”์„œ๋“œ

Collection ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” toArray ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์š”.

  1. Object[] toArray(): ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ Object ํƒ€์ž…์˜ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด์š”.

  2. <T> T[] toArray(T[] a): ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด์˜จ a๋ฐฐ์—ด์— Collection์— ๋“ค์–ด์žˆ๋Š” ์š”์†Œ๋ฅผ ๋‹ด์•„์„œ a๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค˜์š”. ํ•˜์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด์˜จ a๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ Collection์— ๋“ค์–ด์žˆ๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜(size)๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์š”.

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    Integer[] myIntegers1 = new Integer[0]; // list์˜ size๋ณด๋‹ค ์ž‘์•„์š”.
    Integer[] myIntegers2 = new Integer[list.size()];
    
    Integer[] integers1 = list.toArray(myIntegers1);
    Integer[] integers2 = list.toArray(myIntegers2);
    
    System.out.println(myIntegers1 == integers1); // false
    System.out.println(myIntegers2 == integers2); // true

Collection์˜ toArray๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ System.arraycopy๋ฅผ ์‚ฌ์šฉํ•ด์š”. System.arraycopy๋Š” native ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์ ์œผ๋กœ ์šฐ์ˆ˜ํ•ด์š”. ๋ฟ๋งŒ์•„๋‹ˆ๋ผ, ๋‚ด๋ถ€์ ์œผ๋กœ Arrays.copyOf ์‚ฌ์šฉ๋˜์–ด์ง€๋Š”๋ฐ, Arrays.copyOf ๋˜ํ•œ ๋‚ด๋ถ€์ ์œผ๋กœ System.arraycopy๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ๊ฐ€์ ธ์š”. ์•„๋ž˜์˜ System.arraycopy์™€ Arrays.copyOf์˜ ๋ฐด์น˜๋งˆํฌ ๊ฒฐ๊ณผ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

Baeldung์—์„œ ์ง„ํ–‰ํ•œ System.arraycopy์™€ Arrays.copyOf์˜ ๋ฐด์น˜๋งˆํฌ ๊ฒฐ๊ณผ

Benchmark                                          (SIZE)  Mode  Cnt        Score       Error  Units
ObjectsCopyBenchmark.arraysCopyOfBenchmark             10  avgt  100        8.535 ยฑ     0.006  ns/op
ObjectsCopyBenchmark.arraysCopyOfBenchmark        1000000  avgt  100  2831316.981 ยฑ 15956.082  ns/op
ObjectsCopyBenchmark.systemArrayCopyBenchmark          10  avgt  100        9.278 ยฑ     0.005  ns/op
ObjectsCopyBenchmark.systemArrayCopyBenchmark     1000000  avgt  100  2826917.513 ยฑ 15585.400  ns/op
PrimitivesCopyBenchmark.arraysCopyOfBenchmark          10  avgt  100        9.172 ยฑ     0.008  ns/op
PrimitivesCopyBenchmark.arraysCopyOfBenchmark     1000000  avgt  100   476395.127 ยฑ   310.189  ns/op
PrimitivesCopyBenchmark.systemArrayCopyBenchmark       10  avgt  100        8.952 ยฑ     0.004  ns/op
PrimitivesCopyBenchmark.systemArrayCopyBenchmark  1000000  avgt  100   475088.291 ยฑ   726.416  ns/op

Performance of System.arraycopy() vs. Arrays.copyOf() | Baeldung

๐Ÿšจ ์ข…์ข… ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ ๊ธ€์—์„œ Arrays.copyOf์˜ ์„ฑ๋Šฅ์ด System.arraycopy๋ณด๋‹ค ์šฐ์ˆ˜ํ•˜๋‹ค๊ณ (๋งŽ๊ฒŒ๋Š” 2๋ฐฐ ์ด์ƒ) ์ž‘์„ฑํ•ด ๋†“์€ ๊ธ€์ด ๋ณด์ด๋Š”๋ฐ ์ด๋Š” ํ‹€๋ฆฐ ๋‚ด์šฉ์ด์—์š”! Arrays.copyOf๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ System.arraycopy๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— System.arraycopy ๋ณด๋‹ค ์„ฑ๋Šฅ์ ์œผ๋กœ ํฌ๊ฒŒ ์šฐ์ˆ˜ํ•  ์ˆ˜ ์—†์–ด์š”.

Stream์˜ toArray ๋ฉ”์„œ๋“œ

Stream ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” toArray ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์š”.

  1. Object[] toArray(): ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ Object ํƒ€์ž…์˜ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด์š”.

  2. <A> A[] toArray(IntFunction<A[]> generator) : generator ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ A[] ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ด์š”.

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    Integer[] integers = list.stream().toArray(Integer[]::new);

list.stream().toArray(Integer[]::new)๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ์ปฌ๋ ‰์…˜ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์—†์–ด์š”. ๋”ฐ๋ผ์„œ Stream์˜ toArray ๋ฉ”์„œ๋“œ๋Š” ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  ๊ฐ’์„ ์ˆ˜์ง‘ํ•œ ๋‹ค์Œ ๋ฐฐ์—ด์„ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ๋ฐฐ์—ด์— ๋ณต์‚ฌํ•ด์š”.

๋”ฐ๋ผ์„œ Stream์˜ toArray ๋ฉ”์„œ๋“œ๋Š” Collection์˜ toArray๋ณด๋‹ค ํ›จ์”ฌ ๋А๋ฆฌ๊ณ  ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋น„ํ•ด์š”. Stream์˜ Object[] toArray() ๋ฉ”์„œ๋“œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ˆ์š”. ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” Stream์˜ Object[] toArray()์˜ ๊ตฌํ˜„ ์ฝ”๋“œ์—์š”.

// Stream์˜ Object[] ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” toArray() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„
@Override
public final Object[] toArray() {
	return toArray(Object[]::new);
}

๊ฒฐ๋ก 

๋”ฐ๋ผ์„œ ๋‹จ์ˆœํ•˜๊ฒŒ Collection์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๋ ค ํ•œ๋‹ค๋ฉด Stream์˜ toArray๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค, Collection์˜ toArray๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด์—์š”.

profile
๐ŸŽ๏ธ๐Ÿ’จ Beep Beep

0๊ฐœ์˜ ๋Œ“๊ธ€