Java Stream(์ŠคํŠธ๋ฆผ) ์™„์ „ ์ •๋ฆฌ

2026. 2. 12. 14:52ยท๐Ÿ‘ฉ‍๐Ÿ’ปDeveloper ๐Ÿ’ก/๐Ÿ’พBack-end๐Ÿ•Š๏ธ

๋ฐฐ์—ด/์ปฌ๋ ‰์…˜์„ “๊ฐ™์€ ๋ฐฉ์‹”์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ด์œ  + filter/map/sorted/forEach/sum/count/reduce๊นŒ์ง€

0) ์ŠคํŠธ๋ฆผ(Stream)์ด ๋ญ์•ผ?

์Šฌ๋ผ์ด๋“œ ์š”์•ฝ์„ ์•„์ฃผ ์‰ฝ๊ฒŒ ํ’€๋ฉด ์ด๊ฑฐ์•ผ:

  • ์ŠคํŠธ๋ฆผ(Stream) = “์—ฌ๋Ÿฌ ์ž๋ฃŒ(๋ฐฐ์—ด, ๋ฆฌ์ŠคํŠธ ๋“ฑ)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ(์—ฐ์‚ฐ)์„ ๋ชจ์•„๋‘” ํ๋ฆ„(ํŒŒ์ดํ”„๋ผ์ธ)”
  • ์ค‘์š”ํ•œ ํฌ์ธํŠธ:
    1. ๋ฐฐ์—ด์ด๋“  ์ปฌ๋ ‰์…˜์ด๋“  ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    2. “์ž๋ฃŒ ๊ตฌ์กฐ(๋ฐฐ์—ด/๋ฆฌ์ŠคํŠธ)๊ฐ€ ๋ญ๋ƒ”๋ณด๋‹ค “์–ด๋–ค ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ์‹ถ๋ƒ”์— ์ง‘์ค‘ํ•˜๊ฒŒ ํ•ด์คŒ
    3. ๋ฐ˜๋ณต๋ฌธ์„ ์ง์ ‘ ๋Œ๋ฆฌ๋Š” ๋Œ€์‹ , ์ŠคํŠธ๋ฆผ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ์ฒ˜๋ฆฌํ•จ(๋‚ด๋ถ€ ๋ฐ˜๋ณต)

โœ… ๋น„์œ 

  • ๋ฐฐ์—ด/๋ฆฌ์ŠคํŠธ = ์žฌ๋ฃŒ๊ฐ€ ๋‹ด๊ธด ๋ฐ•์Šค
  • ์ŠคํŠธ๋ฆผ = ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ(์ž‘์—… ๋ผ์ธ)
  • filter, map, sorted ๊ฐ™์€ ๊ฑด “์ž‘์—… ๊ธฐ๊ณ„”
  • ๋งˆ์ง€๋ง‰์— forEach, sum, count, reduce ๊ฐ™์€ “์ตœ์ข… ๋ฒ„ํŠผ”์„ ๋ˆŒ๋Ÿฌ์•ผ ์‹ค์ œ๋กœ ์ปจ๋ฒ ์ด์–ด๊ฐ€ ์›€์ง์ž„

1) ์ŠคํŠธ๋ฆผ์„ ์“ฐ๋ฉด ๋ญ๊ฐ€ ์ข‹์•„?

์Šฌ๋ผ์ด๋“œ ๋ฌธ์žฅ์„ ๊ทธ๋Œ€๋กœ “์˜๋ฏธ”๋กœ ํ’€๋ฉด:

โœ… (1) ์ž๋ฃŒ์˜ ๋Œ€์ƒ๊ณผ ๊ด€๊ณ„์—†์ด ๋™์ผํ•œ ์—ฐ์‚ฐ ์ˆ˜ํ–‰

  • ๋ฐฐ์—ด์ด๋“  ArrayList๋“  ๋˜‘๊ฐ™์ด:
    • .stream() ๋˜๋Š” Arrays.stream()๋กœ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค๊ณ 
    • .filter().map().sorted().forEach() ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

โœ… (2) ํ•œ ๋ฒˆ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•œ ์ŠคํŠธ๋ฆผ์€ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€ (์†Œ๋ชจ๋จ)

  • ์ŠคํŠธ๋ฆผ์€ “์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ํ•œ ๋ฒˆ ๋Œ๋ฆฌ๋ฉด ๋”์ด์•ผ.
  • ํ•œ ๋ฒˆ forEach() ๊ฐ™์€ ์ตœ์ข… ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ทธ ์ŠคํŠธ๋ฆผ์€ ๋์ด๋ผ์„œ ๋‹ค์‹œ ๋ชป ์จ.

โœ… (3) ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ์€ ๊ธฐ์กด ์ž๋ฃŒ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ

  • ์ŠคํŠธ๋ฆผ์€ ์›๋ณธ ๋ฐฐ์—ด/๋ฆฌ์ŠคํŠธ๋ฅผ “์ง์ ‘” ๋ฐ”๊พธ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ
    ์›๋ณธ์„ ์ฝ์–ด์„œ ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.
    (๋‹จ, ์•ˆ์—์„œ ์›๋ณธ ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๊ทธ๊ฑด ๋ณ„๊ฐœ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ)

โœ… (4) ์ค‘๊ฐ„์—ฐ์‚ฐ + ์ตœ์ข…์—ฐ์‚ฐ ๊ตฌ์กฐ

  • ์ค‘๊ฐ„์—ฐ์‚ฐ: filter, map, sorted …
    → “๊ฐ€๊ณต” ๋‹จ๊ณ„(์—ฌ๋Ÿฌ ๊ฐœ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ)
  • ์ตœ์ข…์—ฐ์‚ฐ: forEach, sum, count, reduce …
    → “๊ฒฐ๊ณผ ๋งŒ๋“ค๊ธฐ / ์ถœ๋ ฅ” ๋‹จ๊ณ„(๋งˆ์ง€๋ง‰์— 1๋ฒˆ๋งŒ)

2) ๋ฐ˜๋ณต๋ฌธ vs ์ŠคํŠธ๋ฆผ: ๊ฐ€์žฅ ๊ธฐ๋ณธ ์˜ˆ์ œ

2-1) ๋ฐ˜๋ณต๋ฌธ ๋ฒ„์ „

 

ํ•œ ์ค„์”ฉ ํ•ด์„

  • int[] arr = {1,2,3,4,5};
    • ์ •์ˆ˜ ๋ฐฐ์—ด ์ƒ์„ฑ
  • for (int i = 0; i < arr.length; i++)
    • ์ธ๋ฑ์Šค i๋ฅผ 0๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฆ๊ฐ€
  • System.out.println(arr[i]);
    • i๋ฒˆ์งธ ์š”์†Œ ์ถœ๋ ฅ

2-2) ์ŠคํŠธ๋ฆผ ๋ฒ„์ „

 

ํ•œ ์ค„์”ฉ ํ•ด์„(์™„์ „ ์ฐ์œผ๋กœ)

  • int[] arr = {1,2,3,4,5};
    • ๋ฐฐ์—ด ์ƒ์„ฑ(๋™์ผ)
  • Arrays.stream(arr)
    • arr ๋ฐฐ์—ด์„ IntStream(์ •์ˆ˜ ์ŠคํŠธ๋ฆผ) ์œผ๋กœ ๋ฐ”๊ฟˆ
    • ์ฆ‰, “๋ฐฐ์—ด ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ํ˜๋ ค๋ณด๋‚ผ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ” ์ƒ์„ฑ
  • .forEach(n -> System.out.println(n));
    • forEach๋Š” ์ตœ์ข…์—ฐ์‚ฐ
    • ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ(๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ˜๋ณต)
    • n์— ๋„ฃ๊ณ  → System.out.println(n) ์‹คํ–‰

โœ… ์—ฌ๊ธฐ์„œ ๋žŒ๋‹ค n -> System.out.println(n) ๋œป

  • n : ์š”์†Œ ํ•˜๋‚˜
  • -> : “์ด๊ฑธ๋กœ ์ด๋ ‡๊ฒŒ ์‹คํ–‰ํ• ๊ฒŒ”
  • System.out.println(n) : ์‹คํ–‰ ๋‚ด์šฉ
    ์ฆ‰, “์š”์†Œ ํ•˜๋‚˜ ๋“ค์–ด์˜ค๋ฉด ๊ทธ๊ฑธ ์ถœ๋ ฅํ•ด๋ผ”

3) ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์กฐ: ์ƒ์„ฑ → ์ค‘๊ฐ„์—ฐ์‚ฐ → ์ตœ์ข…์—ฐ์‚ฐ

์Šฌ๋ผ์ด๋“œ ๋นจ๊ฐ„ ๋ฐ•์Šค ๊ทธ๋Œ€๋กœ ๊ตฌ์กฐ๋Š” ์ด๊ฑฐ์•ผ:

 

3-1) stream() = ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ(์‹œ์ž‘์ )

  • sList.stream()
    → ๋ฆฌ์ŠคํŠธ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ “๋ฐ”๊ฟ”์„œ” ์š”์†Œ๋“ค์„ ํ˜๋ ค๋ณด๋‚ผ ์ค€๋น„

3-2) filter() = ์ค‘๊ฐ„์—ฐ์‚ฐ(๊ฑธ๋Ÿฌ๋‚ด๊ธฐ)

  • filter(s -> s.length() >= 5)
    • ์กฐ๊ฑด์„ ๋„ฃ๊ณ , ์กฐ๊ฑด์ด true์ธ ๊ฒƒ๋งŒ ๋‹ค์Œ์œผ๋กœ ํ†ต๊ณผ
    • s -> s.length() >= 5๋Š” “ํ•„ํ„ฐ ์กฐ๊ฑด์‹(ํŒ๋ณ„์‹)”

โœ… ๋น„์œ 

  • filter = “๊ฒ€๋ฌธ์†Œ”
  • ํ†ต๊ณผ ์กฐ๊ฑด = length >= 5

3-3) forEach() = ์ตœ์ข…์—ฐ์‚ฐ(์†Œ๋น„/์ถœ๋ ฅ)

  • forEach(s -> System.out.println(s))
    • ํ†ต๊ณผ๋œ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ์ถœ๋ ฅ
    • ์‹คํ–‰ํ•˜๋ฉด ์ŠคํŠธ๋ฆผ์ด ์†Œ๋ชจ(๋) ๋จ

4) map()์€ ๋ญ์•ผ? “ํ˜•ํƒœ ๋ณ€ํ™˜ / ์›ํ•˜๋Š” ๊ฐ’๋งŒ ๋ฝ‘๊ธฐ”

ํ•œ ์ค„์”ฉ ํ•ด์„

  • customerList.stream()
    • ๊ณ ๊ฐ ๊ฐ์ฒด๋“ค์ด ๋“ค์–ด์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ
  • .map(c -> c.getName())
    • ๊ณ ๊ฐ ๊ฐ์ฒด c๋ฅผ ๋ฐ›์•„์„œ → c.getName() ๊ฒฐ๊ณผ๋กœ ๋ฐ”๊ฟˆ
    • ์ฆ‰, Customer → String(์ด๋ฆ„) ์œผ๋กœ ๋ณ€ํ™˜
  • .forEach(s -> System.out.println(s))
    • ๋ณ€ํ™˜๋œ ์ด๋ฆ„(String)์„ ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅ

โœ… ๋น„์œ 

  • map = “ํฌ์žฅ ๋œฏ๊ธฐ”
  • ๊ณ ๊ฐ ๊ฐ์ฒด(๋ฐ•์Šค)๋ฅผ ๋œฏ์–ด์„œ ๊ทธ ์•ˆ์— ์žˆ๋Š” “์ด๋ฆ„”๋งŒ ๊บผ๋‚ด๋Š” ๋А๋‚Œ

5) ์ตœ์ข…์—ฐ์‚ฐ: sum(), count() ๊ทธ๋ฆฌ๊ณ  “count๊ฐ€ long์ธ ์ด์œ  + ์บ์ŠคํŒ…”

์Šฌ๋ผ์ด๋“œ ์˜ˆ์ œ(์ •์ˆ˜ ๋ฐฐ์—ด ํ•ฉ/๊ฐœ์ˆ˜):

ํ•œ ์ค„์”ฉ ํ•ด์„

  • int[] arr = {1,2,3,4,5};
    • ๋ฐฐ์—ด ์ƒ์„ฑ
  • int sumVal = Arrays.stream(arr).sum();
    • Arrays.stream(arr) : IntStream ์ƒ์„ฑ
    • .sum() : ์ตœ์ข…์—ฐ์‚ฐ
      → ์š”์†Œ๋“ค์„ ์ „๋ถ€ ๋”ํ•ด์„œ int๋กœ ๋ฐ˜ํ™˜
  • int count = (int) Arrays.stream(arr).count();
    • .count()๋Š” ์ตœ์ข…์—ฐ์‚ฐ
      → ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์„œ ๋ฐ˜ํ™˜
    • ๊ทผ๋ฐ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด long์ด์•ผ (long count())
    • ๊ทธ๋ž˜์„œ int ๋ณ€์ˆ˜์— ๋„ฃ์œผ๋ ค๋ฉด (int)๋กœ ๊ฐ•์ œ ํ˜• ๋ณ€ํ™˜(์บ์ŠคํŒ…) ํ•„์š”

โœ… ์™œ count()๋Š” long์ผ๊นŒ?
๋ฐฐ์—ด/์ปฌ๋ ‰์…˜ ํฌ๊ธฐ๊ฐ€ ์—„์ฒญ ํด ์ˆ˜ ์žˆ์ž–์•„.

  • int ์ตœ๋Œ€: ์•ฝ 21์–ต
  • ๋ฐ์ดํ„ฐ๊ฐ€ 21์–ต ๊ฐœ๋ฅผ ๋„˜์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์•ˆ์ „ํ•˜๊ฒŒ long์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด.

โœ… ์‹ค๋ฌด์ ์œผ๋กœ ๋” ์•ˆ์ „ํ•œ ์ฝ”๋“œ

6) “์ŠคํŠธ๋ฆผ์€ ํ•œ ๋ฒˆ ์“ฐ๋ฉด ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€”๋ฅผ ์ฝ”๋“œ๋กœ ํ™•์ธ

์Šฌ๋ผ์ด๋“œ ๋А๋‚Œ ๊ทธ๋Œ€๋กœ ์˜ˆ์‹œ๋ฅผ ์ •๋ฆฌํ•˜๋ฉด:

 

ํ•œ ์ค„์”ฉ ํ•ด์„

  • List<String> sList = new ArrayList<>();
    • ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
  • sList.add(...)
    • ์š”์†Œ ์ถ”๊ฐ€
  • Stream<String> stream = sList.stream();
    • ๋ฆฌ์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
    • (์•„์ง ์‹คํ–‰์€ ์•ˆ ๋จ)
  • stream.forEach(s -> System.out.print(s + " "));
    • ์ตœ์ข…์—ฐ์‚ฐ ์‹คํ–‰ → ์š”์†Œ ์ถœ๋ ฅํ•˜๋ฉด์„œ ์ŠคํŠธ๋ฆผ ์†Œ๋ชจ
  • System.out.println();
    • ์ค„๋ฐ”๊ฟˆ
  • sList.stream().sorted().forEach(...)
    • ์—ฌ๊ธฐ์„œ ์ƒˆ ์ŠคํŠธ๋ฆผ์„ ๋‹ค์‹œ ์ƒ์„ฑํ•จ (sList.stream()์„ ๋‹ค์‹œ ํ˜ธ์ถœํ–ˆ์ง€!)
    • ์™œ๋ƒ๋ฉด ์•„๊นŒ stream์€ ์ด๋ฏธ forEach๋กœ ์†Œ๋ชจ๋ผ์„œ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋‹ˆ๊นŒ

โœ… ๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด?

 
stream.sorted().forEach(...); // โŒ ์—๋Ÿฌ ๋ฐœ์ƒ(์ด๋ฏธ ์†Œ๋น„๋œ ์ŠคํŠธ๋ฆผ)

7) sorted()๋Š” ๋ญ์•ผ?

  • sorted()๋Š” ์ค‘๊ฐ„์—ฐ์‚ฐ
  • ์š”์†Œ๋“ค์„ ์ •๋ ฌํ•œ “์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ”์„ ๋งŒ๋“ค์–ด ์คŒ
  • ๋ฌธ์ž์—ด์ด๋ฉด ๊ธฐ๋ณธ ์ •๋ ฌ(์‚ฌ์ „์ˆœ/์œ ๋‹ˆ์ฝ”๋“œ ์ˆœ)

8) reduce() ์™„์ „ ์ •๋ณต: “๋ชจ๋“  ๊ฐ’์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ธฐ(๋ˆ„์ )”

์Šฌ๋ผ์ด๋“œ ์ •์˜:

 

8-1) reduce์˜ ํ•ต์‹ฌ ์˜๋ฏธ

  • identity : ์ดˆ๊ธฐ๊ฐ’(์‹œ์ž‘ ๊ฐ’)
  • accumulator : “๋‘ ๊ฐ’์„ ๋ฐ›์•„์„œ ํ•˜๋‚˜๋กœ ๋งŒ๋“œ๋Š” ๊ทœ์น™”

โœ… ๋น„์œ 

  • reduce = “๋ˆˆ๋ฉ์ด ๊ตด๋ฆฌ๊ธฐ”
  • identity = ์ฒ˜์Œ ์†์— ์ฅ” ์ž‘์€ ๋ˆˆ๋ฉ์ด(์ดˆ๊ธฐ ํฌ๊ธฐ)
  • accumulator = “์ƒˆ ๋ˆˆ์„ ๋ถ™์ด๋Š” ๋ฐฉ๋ฒ•(๊ทœ์น™)”

8-2) ์ •์ˆ˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ ์˜ˆ์‹œ (์Šฌ๋ผ์ด๋“œ)

 

ํ•œ ์ค„์”ฉ ํ•ด์„

  • Arrays.stream(arr)
    • ๋ฐฐ์—ด์„ IntStream์œผ๋กœ
  • .reduce(0, (a, b) -> a + b)
    • ์ดˆ๊ธฐ๊ฐ’ 0์—์„œ ์‹œ์ž‘
    • (a, b) -> a + b ๊ทœ์น™์œผ๋กœ ๊ณ„์† ๋ˆ„์ 

โœ… ๋‚ด๋ถ€์—์„œ ์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๋Š” ๋А๋‚Œ
arr์ด [1,2,3,4,5]๋ฉด:

  • ์‹œ์ž‘: a=0
  • a=0, b=1 → 1
  • a=1, b=2 → 3
  • a=3, b=3 → 6
  • a=6, b=4 → 10
  • a=10, b=5 → 15
    ๊ฒฐ๊ณผ 15

8-3) reduce๋Š” overload(ํ˜•ํƒœ)๊ฐ€ 2๊ฐ€์ง€๊ฐ€ ์ž์ฃผ ๋‚˜์˜ด

(A) identity ์žˆ๋Š” reduce → ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”๋กœ T

 
  • identity๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ “๋นˆ ๊ฒฝ์šฐ”์—๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋ฌด์กฐ๊ฑด ๋‚˜์™€์„œ String์œผ๋กœ ๋ฐ”๋กœ ๋ฐ˜ํ™˜

(B) identity ์—†๋Š” reduce → Optional<T>

 
  • ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ Optional๋กœ ๊ฐ์Œˆ
  • ๊ทธ๋ž˜์„œ .get()์„ ์“ฐ๊ฑฐ๋‚˜ orElse()๋ฅผ ์จ์•ผ ํ•จ

9) BinaryOperator ํด๋ž˜์Šค๋กœ reduce ๊ทœ์น™ ๋งŒ๋“ค๊ธฐ(์Šฌ๋ผ์ด๋“œ)

์Šฌ๋ผ์ด๋“œ ์š”์ง€:

  • BinaryOperator<T>๋Š” “T ๋‘ ๊ฐœ ๋ฐ›์•„์„œ T ํ•˜๋‚˜ ๋ฐ˜ํ™˜”
  • ์šฐ๋ฆฌ๊ฐ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜๋ฉด apply()๊ฐ€ ์ž๋™ ํ˜ธ์ถœ๋จ

9-1) ๊ฐ€์žฅ ๊ธด ๋ฌธ์ž์—ด ๊ณ ๋ฅด๋Š” ๊ทœ์น™ ํด๋ž˜์Šค(์Šฌ๋ผ์ด๋“œ ์Šคํƒ€์ผ)

 

ํ•œ ์ค„์”ฉ ํ•ด์„

  • class CompareString implements BinaryOperator<String>
    • ๋ฌธ์ž์—ด 2๊ฐœ ๋น„๊ตํ•ด์„œ “ํ•˜๋‚˜”๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ทœ์น™ ํด๋ž˜์Šค
  • public String apply(String s1, String s2)
    • reduce๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ณ„์† ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • s1.getBytes().length
    • ๋ฌธ์ž์—ด์˜ ๋ฐ”์ดํŠธ ๊ธธ์ด(ํ•œ๊ธ€์€ ๋ณดํ†ต 2~3๋ฐ”์ดํŠธ๋ผ ๊ธธ๊ฒŒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ)
  • ๋” ๊ธธ๋ฉด s1 ๋ฐ˜ํ™˜, ์•„๋‹ˆ๋ฉด s2 ๋ฐ˜ํ™˜
    → ๊ฒฐ๊ตญ reduce ๋๋‚˜๋ฉด “๊ฐ€์žฅ ๊ธธ์—ˆ๋˜ ๋ฌธ์ž์—ด”์ด ๋‚จ์Œ

9-2) reduce์— ์ ์šฉ(์Šฌ๋ผ์ด๋“œ)

 

ํ•œ ์ค„์”ฉ ํ•ด์„

  • Arrays.stream(greetings)
    • ๋ฌธ์ž์—ด ๋ฐฐ์—ด ์ŠคํŠธ๋ฆผ
  • .reduce(new CompareString())
    • identity ์—†๋Š” reduce → ๊ฒฐ๊ณผ๊ฐ€ Optional<String>
    • ๋‚ด๋ถ€์ ์œผ๋กœ apply(s1, s2)๋ฅผ ๊ณ„์† ํ˜ธ์ถœํ•ด “์ตœ์ข… 1๊ฐœ”๋งŒ ๋‚จ๊น€
  • .get()
    • Optional์—์„œ ์‹ค์ œ ๊ฐ’์„ ๊บผ๋ƒ„
    • โš ๏ธ ๋‹จ, ๋น„์–ด์žˆ์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์Œ
    • ์•ˆ์ „ํ•˜๊ฒŒ๋Š” .orElse("") ์ถ”์ฒœ
  • System.out.println(str);
    • ์ตœ์ข… ๊ฒฐ๊ณผ ์ถœ๋ ฅ

โœ… ์•ˆ์ „ ๋ฒ„์ „

 
String str = Arrays.stream(greetings) .reduce(new CompareString()) .orElse("");

10) ์‹ค์Šต ์˜ˆ์ œ: ์—ฌํ–‰ ๊ณ ๊ฐ(TravelCustomer) ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์Šฌ๋ผ์ด๋“œ ๋ฌธ์ œ ์š”๊ตฌ:

  1. ๊ณ ๊ฐ ๋ช…๋‹จ ์ถœ๋ ฅ
  2. ์—ฌํ–‰ ์ด ๋น„์šฉ ๊ณ„์‚ฐ
  3. 20์„ธ ์ด์ƒ ๊ณ ๊ฐ ์ด๋ฆ„์„ ์ •๋ ฌํ•ด์„œ ์ถœ๋ ฅ

10-1) TravelCustomer ํด๋ž˜์Šค(์Šฌ๋ผ์ด๋“œ ์ฝ”๋“œ ํ•ด์„)

 

ํฌ์ธํŠธ

  • private ๋ฉค๋ฒ„๋ณ€์ˆ˜ 3๊ฐœ: ์ด๋ฆ„/๋‚˜์ด/๊ฐ€๊ฒฉ
  • ์ƒ์„ฑ์ž๋กœ ํ•œ ๋ฒˆ์— ์„ธํŒ…
  • getter๋กœ ๊ฐ’ ๊บผ๋‚ด๊ธฐ
  • toString()์€ ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ์–ด๋–ค ๋ฌธ์ž์—ด๋กœ ๋ณด์ผ์ง€ ์ •ํ•จ

10-2) TravelTest(์Šฌ๋ผ์ด๋“œ ์ฝ”๋“œ ๊ธฐ๋ฐ˜ + ๋ณ€์ˆ˜๋ช… ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ ์ˆ˜์ •ํ•ด์„œ “์ •์ƒ ๋ฒ„์ „”)

์Šฌ๋ผ์ด๋“œ์—๋Š” customerLee ๋งŒ๋“ค์–ด๋†“๊ณ  customerDong์„ addํ•˜๋Š” ์‹์œผ๋กœ
๋ณ€์ˆ˜๋ช…์ด ์„ž์—ฌ ๋ณด์ด๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด์„œ, ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ •๋ฆฌํ•ด์ค„๊ฒŒ.

 

ํ•œ ์ค„์”ฉ “์˜๋ฏธ” ํ•ด์„

  • ๊ณ ๊ฐ 3๋ช… ๊ฐ์ฒด ์ƒ์„ฑ
    • ๊ฐ€๊ฒฉ 100/100/50 (์Šฌ๋ผ์ด๋“œ ์กฐ๊ฑด: 15์„ธ ์ด์ƒ 100๋งŒ์›, ๋ฏธ๋งŒ 50๋งŒ์›๊ณผ ๋งค์นญ)
  • List<TravelCustomer> customerList = new ArrayList<>();
    • ๊ณ ๊ฐ ๋ฆฌ์ŠคํŠธ ์ค€๋น„
  • customerList.add(...)
    • ๋ฆฌ์ŠคํŠธ์— ๊ณ ๊ฐ ๋„ฃ๊ธฐ

(1) ๊ณ ๊ฐ ๋ช…๋‹จ ์ถœ๋ ฅ

  • customerList.stream() : ๊ณ ๊ฐ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
  • map(c -> c.getName()) : ๊ณ ๊ฐ → ์ด๋ฆ„(String)์œผ๋กœ ๋ณ€ํ™˜
  • forEach(...) : ์ด๋ฆ„ ์ถœ๋ ฅ(์ตœ์ข…์—ฐ์‚ฐ)

(2) ์ด ๋น„์šฉ ํ•ฉ

  • mapToInt(c -> c.getPrice())
    • TravelCustomer → int(๊ฐ€๊ฒฉ)์œผ๋กœ ๋ฐ”๊ฟˆ
    • IntStream์ด ๋จ
  • sum() : ํ•ฉ๊ณ„ ๊ณ„์‚ฐ(์ตœ์ข…์—ฐ์‚ฐ)

(3) 20์„ธ ์ด์ƒ๋งŒ + ์ด๋ฆ„๋งŒ + ์ •๋ ฌ + ์ถœ๋ ฅ

  • filter(c -> c.getAge() >= 20) : 20์„ธ ์ด์ƒ๋งŒ ํ†ต๊ณผ
  • map(c -> c.getName()) : ์ด๋ฆ„๋งŒ ์ถ”์ถœ
  • sorted() : ์ •๋ ฌ(์ค‘๊ฐ„์—ฐ์‚ฐ)
  • forEach() : ์ถœ๋ ฅ(์ตœ์ข…์—ฐ์‚ฐ)

11) ์‹ค์Šต ๋ฌธ์ œ: Book ๋ฆฌ์ŠคํŠธ์—์„œ

โœ… ๋ชจ๋“  ์ฑ… ๊ฐ€๊ฒฉ์˜ ํ•ฉ
โœ… 20000์› ์ด์ƒ์ธ ์ฑ… ์ด๋ฆ„์„ ์ •๋ ฌํ•ด์„œ ์ถœ๋ ฅ
(์Šฌ๋ผ์ด๋“œ “LibraryTest” ์™„์„ฑ)

11-1) Book ํด๋ž˜์Šค (์Šฌ๋ผ์ด๋“œ ์Šคํƒ€์ผ ์œ ์ง€)

 

11-2) LibraryTest ์™„์„ฑ ์ฝ”๋“œ(์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ)

 
ใ…Š

ํ•œ ์ค„์”ฉ ํ•ด์„

(1) ํ•ฉ๊ณ„

  • bookList.stream() : ์ฑ… ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
  • mapToInt(book -> book.getPrice())
    • Book → ๊ฐ€๊ฒฉ(int)์œผ๋กœ ๋ณ€ํ™˜ → IntStream
  • sum() : ํ•ฉ๊ณ„(์ตœ์ข…์—ฐ์‚ฐ)

(2) 20000์› ์ด์ƒ + ์ด๋ฆ„ + ์ •๋ ฌ + ์ถœ๋ ฅ

  • filter(book -> book.getPrice() >= 20000) : 20000 ์ด์ƒ๋งŒ ๋‚จ๊น€
  • map(book -> book.getName()) : ์ด๋ฆ„๋งŒ ๋ฝ‘๊ธฐ
  • sorted() : ์ด๋ฆ„ ์ •๋ ฌ
  • forEach(System.out::println)๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ(๋ฉ”์„œ๋“œ ์ฐธ์กฐ),
    ์—ฌ๊ธฐ์„œ๋Š” ์ดํ•ด๋ฅผ ์œ„ํ•ด ๋žŒ๋‹ค๋กœ ์œ ์ง€:
    • forEach(name -> System.out.println(name))

12) ์˜ค๋Š˜์˜ ํ•ต์‹ฌ ์š”์•ฝ(์Šฌ๋ผ์ด๋“œ ์ „์ฒด ๋‚ด์šฉ ์••์ถ•)

  • ์ŠคํŠธ๋ฆผ์€ ๋ฐฐ์—ด/์ปฌ๋ ‰์…˜์„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” “๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ”
  • ์ŠคํŠธ๋ฆผ์€
    • ์›๋ณธ์„ ์ง์ ‘ ๋ฐ”๊พธ์ง€ ์•Š๊ณ 
    • ํ•œ ๋ฒˆ ์ตœ์ข…์—ฐ์‚ฐํ•˜๋ฉด ์†Œ๋ชจ๋˜์–ด ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • ์—ฐ์‚ฐ์€
    • ์ค‘๊ฐ„์—ฐ์‚ฐ(filter/map/sorted...) ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ
    • ์ตœ์ข…์—ฐ์‚ฐ(forEach/sum/count/reduce...) ๋งˆ์ง€๋ง‰์— 1๋ฒˆ
  • count()๋Š” ๊ฒฐ๊ณผ๊ฐ€ long → ํ•„์š”ํ•˜๋ฉด ์บ์ŠคํŒ…ํ•˜์ง€๋งŒ ๋ณดํ†ต long์œผ๋กœ ๋ฐ›๋Š” ๊ฒŒ ์•ˆ์ „
  • reduce()๋Š” “๋ˆ„์ ํ•ด์„œ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š”” ๊ฐ•๋ ฅํ•œ ์ตœ์ข…์—ฐ์‚ฐ
    • ์ดˆ๊ธฐ๊ฐ’(identity) ์žˆ์œผ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”๋กœ T
    • ์ดˆ๊ธฐ๊ฐ’ ์—†์œผ๋ฉด Optional ๋ฐ˜ํ™˜

'๐Ÿ‘ฉโ€๐Ÿ’ปDeveloper ๐Ÿ’ก > ๐Ÿ’พBack-end๐Ÿ•Š๏ธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Hello, jsp!  (0) 2026.03.12
์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„(WAS)  (1) 2026.03.12
JAVA ์Šค๋ ˆ๋“œ(Thread) ์™„์ „ ์ •๋ฆฌ  (0) 2026.02.12
Java ์ œ๋„ค๋ฆญ(Generic) ์™„์ „ ์ •๋ณต  (0) 2026.02.12
JAVA ์ปฌ๋ ‰์…˜ ์ž๋ฃŒ๊ตฌ์กฐ  (0) 2026.02.11
'๐Ÿ‘ฉ‍๐Ÿ’ปDeveloper ๐Ÿ’ก/๐Ÿ’พBack-end๐Ÿ•Š๏ธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Hello, jsp!
  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„(WAS)
  • JAVA ์Šค๋ ˆ๋“œ(Thread) ์™„์ „ ์ •๋ฆฌ
  • Java ์ œ๋„ค๋ฆญ(Generic) ์™„์ „ ์ •๋ณต
fulfilling_enjoyable yeona๐Ÿถ๐Ÿฆซ
fulfilling_enjoyable yeona๐Ÿถ๐Ÿฆซ
Quantitative Research Engineer & Quantitative Strategist | Multimodal Alpha (Price/News/On-chain) | Regime-aware, Cost-included Backtests | Remote-first ์—ฐ๋ฆฌ์˜ ๋‚œ ๋จธ๋‹ˆ๐Ÿ’ฐ๊ฐ€ ์ข‹์•„๐Ÿ’™๐Ÿฅณ ์ถฉ๋งŒํ•˜๊ฒŒ ๊ทธ๋ฆฌ๊ณ  ์ฆ๊ฒ๊ฒŒ ๐Ÿถ ๐Ÿฆซ ๐Ÿ’›
  • fulfilling_enjoyable yeona๐Ÿถ๐Ÿฆซ
    Yeona's Diary
    Quantitative Researcher & Engineer
    AboutMe ๋ชฉํ‘œ GitHub Blog
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿค ๐Ÿ˜Ž ์•ˆ๋…•โ˜ƒ๏ธ๐Ÿ’ž (95) N
      • ๐Ÿ’™ ๐Ÿค Diary๐Ÿฐ ๐ŸŽ€ ๐Ÿงธ (39) N
        • ๐Ÿ—ฝ๋ฏธ๊ตญ DS & CS ๋ฐ•์‚ฌ ์ด๋ฏผ๐Ÿ‹ (28)
        • ๐Ÿ›ซ์—ฌํ–‰ ์ด์•ผ๊ธฐ (1)
        • ๐Ÿ“’์˜ค๋Š˜ ์ด์•ผ๊ธฐ๐Ÿ’’๐Ÿซง๐ŸŒค๏ธ (6) N
        • ๐Ÿฐโ˜˜๏ธ๐Ÿป‍โ„๏ธ๊ฐ•์•„์ง€ ์œก์•„ (0)
      • ๐ŸฌActuary๐Ÿคธ‍โ™€๏ธโœจ (1)
      • ๐Ÿ‘ฉ‍๐Ÿ’ปDeveloper ๐Ÿ’ก (35)
        • โš’๏ธ์‚ฝ์งˆ ๊ธฐ๋ก๊ธฐ๐Ÿ“[TIL] (6)
        • ๐Ÿ–ผ๏ธFront-end๐ŸŽจ (3)
        • ๐Ÿ’พBack-end๐Ÿ•Š๏ธ (15)
        • ๐Ÿคน‍โ™€๏ธAlgorithm & Coding Test๐Ÿ’ƒ (5)
        • ๐Ÿ—ปData๐Ÿ”๏ธ (1)
        • ๐Ÿ“Project๐Ÿ• (1)
      • ๐Ÿ’ฐ๊ฒฝ์ œ์  ์ž์œ  ๋‹ฌ์„ฑโœŒ๏ธ๐ŸคŸ (8)
        • ๐Ÿ“ŠQuant๐Ÿ“ˆ๐Ÿ‘ (4)
        • ๐Ÿฐ๐Ÿ›’๐Ÿฅ‡ (1)
        • ๐Ÿ’Ž ํˆฌ์ž ์‹ค์ „ ๊ฒฝํ—˜ โ˜บ๏ธ (1)
        • ๐Ÿ… Bitcoin 15๊ฐœ ๋ชจ์œผ๊ธฐ : 2040๋…„ 200์–ต+ (0)
        • ๐ŸŒŽ๋ฏธ๊ตญ ์‹œ์žฅ๐Ÿฆ (0)
      • ๐ŸŒค๏ธCloud๐ŸŒค๏ธโ˜๏ธ (2)
        • AWS (1)
        • Kubernetes (0)
        • Google Cloud Professional (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • git
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    DS
    ๊ฐ€์„ํ•™๊ธฐ
    AWS
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    Java
    ์‹œ์นด๊ณ ๋Œ€
    ์‹œ์นด๊ณ ๋Œ€ํ•™๊ต
    ์‹œ์นด๊ณ 
    ๋ฏธ๊ตญ์œ ํ•™
    CS
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
fulfilling_enjoyable yeona๐Ÿถ๐Ÿฆซ
Java Stream(์ŠคํŠธ๋ฆผ) ์™„์ „ ์ •๋ฆฌ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”