Stream

์ŠคํŠธ๋ฆผ(Stream)์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

  • ์ž๋ฐ”์—์„œ๋Š” ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐฐ์—ด์ด๋‚˜ ์ปฌ๋ ‰์…˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.

  • ์ด๋ ‡๊ฒŒ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋ณต๋ฌธ์ด๋‚˜ ๋ฐ˜๋ณต์ž(iterator)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด Java 8 ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ API๋ฅผ ๋„์ž…ํ•œ๋‹ค.

  • ์ŠคํŠธ๋ฆผ API๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ๋‹ค๋ฃจ๋ฏ€๋กœ, ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๊ธฐ ์œ„ํ•œ ๊ณตํ†ต๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

  • ๋”ฐ๋ผ์„œ ์ŠคํŠธ๋ฆผ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด์ด๋‚˜ ์ปฌ๋ ‰์…˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒŒ์ผ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋„ ๋ชจ๋‘ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ŠคํŠธ๋ฆผ API ํŠน์ง•

  • ์ŠคํŠธ๋ฆผ์€ ์™ธ๋ถ€ ๋ฐ˜๋ณต์„ ํ†ตํ•ด ์ž‘์—…ํ•˜๋Š” ์ปฌ๋ ‰์…˜๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ํ†ตํ•ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • ์ŠคํŠธ๋ฆผ์€ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ปฌ๋ ‰์…˜๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ŠคํŠธ๋ฆผ์€ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์ŠคํŠธ๋ฆผ์˜ ์—ฐ์‚ฐ์€ ํ•„ํ„ฐ-๋งต(filter-map) ๊ธฐ๋ฐ˜์˜ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์—ฐ(lazy) ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•œ๋‹ค.

  • ์ŠคํŠธ๋ฆผ์€ parallelStream() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์†์‰ฌ์šด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.

  • ์˜คํ† ๋ฐฉ์‹ & ์–ธ๋ฐ•์‹ฑ์˜ ๋น„ํšจ์œจ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•œ๋‹ค.(IntStream, LongStream ๋“ฑ)

์ŠคํŠธ๋ฆผ API ๋™์ž‘ ํ๋ฆ„

  1. ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

    • Collections.stream(), Arrays.stream(), Stream.of(), Stream.iterate(), Stream.generate() ๋“ฑ์œผ๋กœ ์ƒ์„ฑ ๊ฐ€๋Šฅ

  2. ์ŠคํŠธ๋ฆผ ์ค‘๊ฐ„ ์—ฐ์‚ฐ(์ŠคํŠธ๋ฆผ์˜ ๋ณ€ํ™˜)

    • ์—ฐ์‚ฐ๊ฒฐ๊ณผ๊ฐ€ ์ŠคํŠธ๋ฆผ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ ์ฒด์ธ์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.(์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

    • ์ŠคํŠธ๋ฆผ์€ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ๋ˆ„์ ํ•˜๊ณ , ์ตœ์ข… ์—ฐ์‚ฐ์ด ํ˜ธ์ถœ๋  ๋•Œ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—(lazy) ์„ฑ๋Šฅ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

    • filter(), distinct(), map(), limit(), skip(), sorted(), peek() ๋“ฑ์ด ์žˆ๋‹ค.

  3. ์ŠคํŠธ๋ฆผ ์ตœ์ข… ์—ฐ์‚ฐ(์ŠคํŠธ๋ฆผ์˜ ์‚ฌ์šฉ)

    • ์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋ณ€ํ™˜๋œ ์ŠคํŠธ๋ฆผ์€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ตœ์ข… ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๊ฐ ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.(1๋ฒˆ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅ)

    • ์ฆ‰, ์ง€์—ฐ(lazy) ๋˜์—ˆ๋˜ ๋ชจ๋“  ์ค‘๊ฐ„ ์—ฐ์‚ฐ๋“ค์ด ์ตœ์ข… ์—ฐ์‚ฐ ์‹œ์— ๋ชจ๋‘ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

    • ์ด๋ ‡๊ฒŒ ์ตœ์ข… ์—ฐ์‚ฐ ์‹œ์— ๋ชจ๋“  ์š”์†Œ๋ฅผ ์†Œ๋ชจํ•œ ํ•ด๋‹น ์ŠคํŠธ๋ฆผ์€ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.(์ผํšŒ์šฉ)

    • forEach(), reduce(), findFirst(), anyMatch(), count(), max(), sum(), collect() ๋“ฑ์ด ์žˆ๋‹ค.

img_31.png

์ŠคํŠธ๋ฆผ API ์žฅ๋‹จ์ 

[์žฅ์ ]

  • ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ

    • ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๊ฐ€๋…์„ฑ๋„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ง€์›

    • ๋‚ด๋ถ€์ ์œผ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ๋ฉ€ํ‹ฐ์ฝ”์–ด ์‹œ์Šคํ…œ์—์„œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • ์ถ”์ƒํ™”

    • ์ŠคํŠธ๋ฆผ์€ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋ชฐ๋ผ๋„ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

    • ์ŠคํŠธ๋ฆผ์€ ์ง€์—ฐ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

[๋‹จ์ ]

  • ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ & ๋А๋ฆฐ ์ฒ˜๋ฆฌ ์†๋„

    • ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฌธ์ œ์™€ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋А๋ฆฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„  ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค.

  • ์–ด๋ ค์šด ๋””๋ฒ„๊น…

    • ์ŠคํŠธ๋ฆผ์€ ๋ฉ”์„œ๋“œ ์ฒด์ธ์„ ํ†ตํ•ด ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„ ์—ฐ์‚ฐ ๋˜๋Š” ์ตœ์ข… ์—ฐ์‚ฐ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฒฝ์šฐ ์ „์ฒด ๋ฉ”์„œ๋“œ ์ฒด์ธ์„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ๋””๋ฒ„๊น… ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ƒํƒœ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

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

์ŠคํŠธ๋ฆผ ์˜ˆ์‹œ

import java.util.ArrayList;
import java.util.List;

public class StreamMain3 {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();

        students.add(new Student("์•„์ด์œ ", "์—ฌ์ž", 95));
        students.add(new Student("์นด๋ฆฌ๋‚˜", "์—ฌ์ž", 100));
        students.add(new Student("๋ฐ•๋ณด๊ฒ€", "๋‚จ์ž", 92));
        students.add(new Student("์†ก์ค‘๊ธฐ", "๋‚จ์ž", 90));
        students.add(new Student("๊น€ํƒœ๋ฆฌ", "์—ฌ์ž", 85));
        students.add(new Student("์ „์ •๊ตญ", "๋‚จ์ž", 88));
        students.add(new Student("๋ฐฉํƒ„์†Œ๋…„๋‹จ", "๋‚จ์ž", 70));
        students.add(new Student("์ด์ง€์€", "์—ฌ์ž", 63));
        students.add(new Student("์œค์•„", "์—ฌ์ž", 68));
        students.add(new Student("ํ•˜์ •์šฐ", "๋‚จ์ž", 75));
        students.add(new Student("๊ณต์œ ", "๋‚จ์ž", 80));


        //90์  ์ด์ƒ ์‚ฌ๋žŒ์˜ ์ด๋ฆ„ ์ถœ๋ ฅํ•˜๊ธฐ
        students.stream()
                .filter(student -> student.getScore()>=90)
                .map(Student::getName)
                .forEach(System.out::println);

        //์ค‘์œ„๊ฐ’ ๊ตฌํ•˜๊ธฐ
        long size = students.stream().count();
        Integer medium = students.stream()
                                 .map(Student::getScore)
                                 .sorted()
                                 .skip(size / 2)
                                 .findFirst()
                                 .orElse(0);

        System.out.println("medium = " + medium);

    }
}

๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์ด๋ž€?

  • ์š”์†Œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(Parallel Operation) ๋ž€ ๋ฉ€ํ‹ฐ ์ฝ”์–ด CPU ํ™˜๊ฒฝ์—์„œ ์ „์ฒด ์š”์†Œ๋ฅผ ๋ถ„ํ• ํ•ด์„œ ๊ฐ๊ฐ์˜ ์ฝ”์–ด๊ฐ€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

  • ์š”์„œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์˜ ๋ชฉ์ ์€ ์ž‘์—… ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ์— ์žˆ๊ณ , ์ž๋ฐ”๋Š” ์š”์†Œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•œ๋‹ค.

๋™์‹œ์„ฑ๊ณผ ๋ณ‘๋ ฌ์„ฑ

  • ๋™์‹œ์„ฑ์€ ๋ฉ€ํ‹ฐ ์ž‘์—…์„ ์œ„ํ•ด ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ์ฝ”์–ด์—์„œ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉฐ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

  • ๋ณ‘๋ ฌ์„ฑ์€ ๋ฉ€ํ‹ฐ ์ž‘์—…์„ ์œ„ํ•ด ๋ฉ€ํ‹ฐ ์ฝ”์–ด๋ฅผ ๊ฐ๊ฐ ์ด์šฉํ•ด์„œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

img_7.png
  • ๋™์‹œ์„ฑ์€ ํ•œ ์‹œ์ ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์‹คํ–‰ํ•œ๋‹ค. ๋ฒˆ๊ฐˆ์•„ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋นจ๋ผ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ๋ฟ์ด๋‹ค.

  • ๋ณ‘๋ ฌ์„ฑ์€ ํ•œ ์‹œ์ ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ์„ฑ๋ณด๋‹ค๋Š” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ธ๋‹ค.

๋ณ‘๋ ฌ์„ฑ์€ ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ์„ฑ๊ณผ ์ž‘์—… ๋ณ‘๋ ฌ์„ฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ์„ฑ

  • ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•ด์„œ ์„œ๋ธŒ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋งŒ๋“ค๊ณ  ์ด ์„œ๋ธŒ ๋ฐ์ดํ„ฐ์…‹๋“ค์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•ด์„œ ์ž‘์—…์„ ๋นจ๋ฆฌ ๋๋‚ด๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

  • ์ž๋ฐ” ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ ๋ฒ™๋ ฌ์„ฑ์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

์ž‘์—… ๋ณ‘๋ ฌ์„ฑ

  • ์„œ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•˜๋ฉฐ, ์ž‘์—… ๋ณ‘๋ ฌ์„ฑ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋‹ค.

  • ์„œ๋ฒ„๋Š” ๊ฐ๊ฐ์˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญํ•œ ๋‚ด์šฉ์„ ๊ฐœ๋ณ„ ์“ฐ๋ ˆ๋“œ์—์„œ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

ํฌํฌ์กฐ์ธ ํ”„๋ ˆ์ž„์›Œํฌ

  • ์ž๋ฐ” ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์€ ์š”์†Œ๋“ค์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํฌํฌ์กฐ์ธ ํ”„๋ ˆ์ž„์›Œํฌ(ForkJoin Framework) ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ํฌํฌ ๋‹จ๊ณ„์—์„œ ์ „์ฒด ์š”์†Œ๋“ค์„ ์„œ๋ธŒ ์š”์†Œ์…‹์œผ๋กœ ๋ถ„ํ• ํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์„œ๋ธŒ ์š”์†Œ์…‹์„ ๋ฉ€ํ‹ฐ ์ฝ”์–ด์—์„œ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ์กฐ์ธ ๋‹จ๊ณ„์—์„œ๋Š” ์„œ๋ธŒ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํ•ฉํ•ด์„œ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

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

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

img_9.png

๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ ์˜ˆ์ œ

  • parallelStream() : ์ปฌ๋ ‰์…˜(List, Set)์œผ๋กœ ๋ถ€ํ„ฐ ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์„ ๋ฐ”๋กœ ๋ฆฌํ„ด

  • parallel() : ๊ธฐ์กด ์ŠคํŠธ๋ฆผ์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {

        Random random = new Random();

        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 100_000_000; i++) {
            list.add(random.nextInt(101)); // 0~100 ์‚ฌ์ด์˜ ์ •์ˆ˜ 1์–ต ๊ฐœ ์ €์žฅ
        }

        double avg = 0.0;
        long startTime = 0;
        long endTime = 0;
        long time = 0;

        /**
         * ์ผ๋ฐ˜ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ
         */
        Stream<Integer> stream = list.stream();
        startTime = System.nanoTime();

        avg = stream
                .mapToInt(Integer::intValue)
                .average()
                .getAsDouble();

        endTime = System.nanoTime();
        time = endTime - startTime;
        System.out.println("avg: " + avg + ", ์ผ๋ฐ˜ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„: " + time + "ns");


        /**
         * ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ
         */
        Stream<Integer> parallelStream = list.parallelStream();
        startTime = System.nanoTime();

        avg = parallelStream
                .mapToInt(Integer::intValue)
                .average()
                .getAsDouble();

        endTime = System.nanoTime();
        time = endTime - startTime;
        System.out.println("avg: " + avg + ", ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„: " + time + "ns");
    }
}
avg: 50.00432972, ์ผ๋ฐ˜ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„: 112810800ns
avg: 50.00432972, ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„: 42708400ns
  • 0~100 ์‚ฌ์ด์— 1์–ต ๊ฐœ์˜ ์ˆซ์ž์˜ ํ‰๊ท ์„ ๊ฐ๊ฐ ์ผ๋ฐ˜ ์ŠคํŠธ๋ฆผ๊ณผ ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

  • ํ™•์‹คํžˆ ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ๊ฐ€ ๋” ๋น ๋ฅธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ์„ฑ๋Šฅ ๋ฌธ์ œ

๊ทธ๋ ‡๋‹ค๋ฉด ์ผ๋ฐ˜ ์ŠคํŠธ๋ฆผ๋ณด๋‹ค ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์ด ์ข‹์€ ๊ฒƒ์ผ๊นŒ?

parallelStream()์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ œ์•ฝ์‚ฌํ•ญ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๋ฌธ์ œ์ ๋“ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์— ๋ฏธ์น˜๋Š” 3๊ฐ€์ง€ ์š”์ธ

  1. ์š”์†Œ์˜ ์ˆ˜์™€ ์š”์†Œ๋‹น ์ฒ˜๋ฆฌ ์‹œ๊ฐ„

    • ์ปฌ๋ ‰์…˜์— ์ „์ฒด ์š”์†Œ์˜ ์ˆ˜๊ฐ€ ์ ๊ณ  ์š”์†Œ๋‹น ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์งง์œผ๋ฉด ์ผ๋ฐ˜ ์ŠคํŠธ๋ฆผ์ด ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ๋ณด๋‹ค ๋น ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

    • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” ํฌํฌ ๋ฐ ์กฐ์ธ ๋‹จ๊ณ„๊ฐ€ ์žˆ๊ณ , ์“ฐ๋ ˆ๋“œ ํ’€์„ ์ƒ์„ฑํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  2. ์ŠคํŠธ๋ฆผ ์†Œ์Šค์˜ ์ข…๋ฅ˜

    • ArrayList๋‚˜ ๋ฐฐ์—ด ๊ฐ™์€ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๋กœ ์š”์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌํฌ ๋‹จ๊ณ„์—์„œ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์ ˆ์•ฝ๋œ๋‹ค.

    • ๋ฐ˜๋ฉด Set์ด๋‚˜ LinkedList ๊ฐ™์€ ๊ฒฝ์šฐ ์š”์†Œ ๋ถ„๋ฆฌ๊ฐ€ ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ๋Šฆ๋‹ค.

  3. ์ฝ”์–ด์˜ ์ˆ˜

    • CPU ์ฝ”์–ด์˜ ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด ๋งŽ์„์ˆ˜๋ก ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์˜ ์„ฑ๋Šฅ์€ ์ข‹์•„์ง„๋‹ค.

    • ํ•˜์ง€๋งŒ ์ฝ”์–ด์˜ ์ˆ˜๊ฐ€ ์ ์„ ๊ฒฝ์šฐ์—๋Š” ์ผ๋ฐ˜ ์ŠคํŠธ๋ฆผ์ด ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

    • ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์€ ์“ฐ๋ ˆ๋“œ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜์—ฌ ๋™์‹œ์„ฑ์ด ๋งŽ์ด ์ผ์–ด๋‚˜๋ฏ€๋กœ ์˜คํžˆ๋ ค ๋А๋ ค์ง„๋‹ค.

๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ ์‹œ ์˜ˆ์ƒ ๋ฌธ์ œ์ 

  • ๋™๊ธฐํ™” ๋ฌธ์ œ

    • ๋™์‹œ์— ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์—์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋ฉด์„œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

  • ๋ฐ์ดํ„ฐ ์ˆœ์„œ ๋ฌธ์ œ

    • ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์—์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

    • ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ๊ด€๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€

    • ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์€ ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ๋ฅผ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์—์„œ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

    • ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ ์ค‘์— ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด์˜ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ  ์ด๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ 

Last updated