“์—ฐ์†๋œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค”๋Š” ์˜๋ฏธ

 

์ž๋ฐ”์˜ Stream API๋Š” ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ํ•œ ์ค„๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

์ฆ‰, ๋ฐฐ์—ด(List, Set, Map ๋“ฑ ์ปฌ๋ ‰์…˜)์ด๋‚˜ ํŒŒ์ผ, ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ๋“ฑ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ๊ณ  ๊ฐ€๊ณตํ•˜๋Š” ๊ณผ์ •์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.


 

1.  “์—ฐ์†๋œ ๋ฐ์ดํ„ฐ ํ๋ฆ„”์ด๋ž€?

 

“๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ, ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•˜๋Š” ํ๋ฆ„”์„ ์˜๋ฏธํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๊ฐ€ List<Integer>๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด:

 

์ผ๋ฐ˜์ ์ธ for๋ฌธ ๋ฐฉ์‹

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = new ArrayList<>();

for (int num : list) {
    result.add(num * 2); // ๊ฐ ์š”์†Œ๋ฅผ 2๋ฐฐ๋กœ ๋ณ€ํ™˜
}
System.out.println(result); // [2, 4, 6, 8, 10]

 ํ•˜๋‚˜์”ฉ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ณ , result ๋ฆฌ์ŠคํŠธ๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•จ.

 

๐Ÿ“Œ ํ•˜์ง€๋งŒ Stream์„ ์‚ฌ์šฉํ•˜๋ฉด?

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream()
                           .map(num -> num * 2) // ์š”์†Œ๋ฅผ 2๋ฐฐ๋กœ ๋ณ€ํ™˜
                           .collect(Collectors.toList()); // ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜
System.out.println(result); // [2, 4, 6, 8, 10]

 ๋ฐ์ดํ„ฐ๊ฐ€ “์—ฐ์†์ ์œผ๋กœ ํ๋ฅด๋“ฏ์ด” ํ•œ ์ค„๋กœ ์ฒ˜๋ฆฌ๋จ.

map()์€ ๊ฐ ์š”์†Œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด๊ณ , collect()๋Š” ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ์ˆ˜์ง‘.


2. ์–ด๋–ค ๊ฒฝ์šฐ์— Stream์„ ์‚ฌ์šฉํ• ๊นŒ?

 

2.1 ๋ฐฐ์—ด์ด๋‚˜ ์ปฌ๋ ‰์…˜์„ ๋‹ค๋ฃฐ ๋•Œ

๋ฐฐ์—ด, List, Set, Map ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ํ•œ ๋ฒˆ์— ๊ฐ€๊ณตํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

 

 ์˜ˆ์ œ: ์ง์ˆ˜๋งŒ ํ•„ํ„ฐ๋งํ•˜๊ธฐ

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream()
                                   .filter(n -> n % 2 == 0) // ์ง์ˆ˜๋งŒ ๋‚จ๊ธฐ๊ธฐ
                                   .collect(Collectors.toList());

System.out.println(evenNumbers); // [2, 4, 6]

โœ” filter() → ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๋งŒ ๋‚จ๊น€

โœ” collect() → ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜


 

2.2. ์ •๋ ฌ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•  ๋•Œ

๋ฐฐ์—ด์ด๋‚˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•  ๋•Œ๋„ Stream์ด ์œ ์šฉํ•˜๋‹ค.

 

 ์˜ˆ์ œ: ์ˆซ์ž ์ •๋ ฌํ•˜๊ธฐ

int[] arr = {5, 2, 9, 1, 3};

int[] sortedArr = Arrays.stream(arr)
                        .sorted() // ์ •๋ ฌ
                        .toArray(); // ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜

System.out.println(Arrays.toString(sortedArr)); // [1, 2, 3, 5, 9]

โœ” sorted() → ์ •๋ ฌ ์ˆ˜ํ–‰

โœ” toArray() → ๋‹ค์‹œ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜


 3.3 ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ (Mapping)

๊ฐ ์š”์†Œ๋ฅผ ๋ณ€ํ™˜ํ•  ๋•Œ๋„ Stream์ด ๊ฐ•๋ ฅํ•˜๋‹ค.

 

 ์˜ˆ์ œ: ๋ชจ๋“  ์ˆซ์ž๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

List<Integer> numbers = Arrays.asList(1, 2, 3);

List<String> stringNumbers = numbers.stream()
                                    .map(n -> "Number: " + n) // ๋ฌธ์ž์—ด ๋ณ€ํ™˜
                                    .collect(Collectors.toList());

System.out.println(stringNumbers); // [Number: 1, Number: 2, Number: 3]

โœ” map() → ์š”์†Œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

 

 

 3.4  ๋ฐ์ดํ„ฐ ์ง‘๊ณ„ (sum, count, average ๋“ฑ)

 

์˜ˆ์ œ: ํ‰๊ท ๊ฐ’ ๊ตฌํ•˜๊ธฐ

List<Integer> numbers = Arrays.asList(10, 20, 30, 40);

double avg = numbers.stream()
                    .mapToInt(n -> n) // IntStream์œผ๋กœ ๋ณ€ํ™˜
                    .average() // ํ‰๊ท  ๊ณ„์‚ฐ
                    .orElse(0); // ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ 0 ๋ฐ˜ํ™˜

System.out.println(avg); // 25.0

โœ” mapToInt()  Stream<Integer>๋ฅผ IntStream์œผ๋กœ ๋ณ€ํ™˜

โœ” average() → ํ‰๊ท ๊ฐ’ ๋ฐ˜ํ™˜

โœ” orElse(0) → ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •


 3.5. ์ตœ๋Œ€/์ตœ์†Œ๊ฐ’ ์ฐพ๊ธฐ

 ์˜ˆ์ œ: ์ตœ๋Œ€๊ฐ’ ์ฐพ๊ธฐ

List<Integer> numbers = Arrays.asList(3, 6, 2, 8, 5);

int max = numbers.stream()
                 .mapToInt(n -> n) // IntStream ๋ณ€ํ™˜
                 .max() // ์ตœ๋Œ“๊ฐ’ ์ฐพ๊ธฐ
                 .orElse(-1); // ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ -1 ๋ฐ˜ํ™˜

System.out.println(max); // 8

โœ” max() → ์ตœ๋Œ“๊ฐ’ ๋ฐ˜ํ™˜

โœ” orElse(-1) → ๊ฐ’์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •

 


  3.6 ์ค‘๋ณต ์ œ๊ฑฐ

 ์˜ˆ์ œ: ์ค‘๋ณต๋œ ๊ฐ’ ์ œ๊ฑฐํ•˜๊ธฐ

List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);

List<Integer> distinctNumbers = numbers.stream()
                                       .distinct() // ์ค‘๋ณต ์ œ๊ฑฐ
                                       .collect(Collectors.toList());

System.out.println(distinctNumbers); // [1, 2, 3, 4, 5]

โœ” distinct() → ์ค‘๋ณต ์š”์†Œ ์ œ๊ฑฐ

 

 


3. Stream์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ 

1. ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•œ Stream์€ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ!

Stream<Integer> stream = Arrays.asList(1, 2, 3).stream();
stream.forEach(System.out::println); // ๊ฐ€๋Šฅ
stream.forEach(System.out::println); // ERROR! (Stream์€ 1ํšŒ์„ฑ)

๐Ÿ“Œ ํ•ด๊ฒฐ์ฑ…: ์ƒˆ๋กœ Stream์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

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

 

๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ (parallelStream())์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ํ–ฅ์ƒ๋จ.

list.parallelStream().map(n -> n * 2).collect(Collectors.toList());

๐Ÿ“Œ ๋‹จ, ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์˜ ๊ฒฝ์šฐ CPU ์ฝ”์–ด ์ˆ˜์™€ ์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•ด์•ผ ํ•จ.

 

3. Stream์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ˜๋ณต์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, ๋ช…์‹œ์ ์ธ ๋ฐ˜๋ณต(for๋ฌธ)๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ์Œ.

โœ” ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ → Stream ์‚ฌ์šฉ

โœ” ๋ณต์žกํ•œ ์—ฐ์‚ฐ  for๋ฌธ์ด ๋” ๋ช…ํ™•ํ•  ์ˆ˜๋„ ์žˆ์Œ.

 


 ์ •๋ฆฌ: Stream์€ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ?

์ƒํ™ฉ์ „ํ†ต์ ์ธ for๋ฌธStream ์‚ฌ์šฉ

๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง if๋ฌธ์œผ๋กœ ๊ฑธ๋Ÿฌ์•ผ ํ•จ filter()
๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ง์ ‘ ๋ณ€ํ™˜ ํ›„ ์ €์žฅ map()
์ •๋ ฌ Arrays.sort() ๋“ฑ ํ•„์š” sorted()
๋ฆฌ์ŠคํŠธ ๋ณ€ํ™˜ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ถ”๊ฐ€ collect()
ํ•ฉ๊ณ„, ํ‰๊ท  for๋ฌธ์„ ๋Œ๋ฉฐ ๊ณ„์‚ฐ sum(), average()

โœ” ๋ฐ˜๋ณต๋ฌธ์„ ์ค„์ด๊ณ  ํ•œ ์ค„๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Stream ์‚ฌ์šฉ!

โœ” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜, ํ•„ํ„ฐ๋ง, ์ •๋ ฌ, ์ง‘๊ณ„ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉ!

 


์ตœ์ข… ๊ฒฐ๋ก 

 ์—ฐ์†๋œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด๋ž€ ๋ฐฐ์—ด, ๋ฆฌ์ŠคํŠธ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •.

 Stream API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•„ํ„ฐ๋ง, ๋ณ€ํ™˜, ์ •๋ ฌ, ์ง‘๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ.

 ์ฝ”๋“œ๊ฐ€ ์งง๊ณ  ์ง๊ด€์ ์ด์ง€๋งŒ, ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ง•์ด ์žˆ์Œ.

 ์ ์ ˆํ•œ ๊ฒฝ์šฐ for๋ฌธ๋ณด๋‹ค Stream์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Œ.

 

์ฆ‰, ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ Stream์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค! 

+ Recent posts