자바 스트림(Stream) | 자바 입문강좌 53

자바 스트림

스트림(Stream)이란 물이 흘러가는 듯한 흐름을 뜻합니다. 컴퓨터 소프트웨어에서 스트림이라는 용어를 사용할 때는 몇가지 경우가 있습니다. 여기서 말하는 스트림은 콜렉션 프레임워크와 함께 사용하는 스트림을 말합니다.

스트림이란 단어 자체가 추상화(Abastraction)이기 때문에 그다지 와닿지 않습니다. 예제를 간단히 훑고 지나가겠습니다.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] myArray = {2,4,6,8,10};
        System.out.println("[--------- Stream foreach ---------]");
        Arrays.stream(myArray).forEach(a -> System.out.print(a + ", "));

        System.out.println("\n[-------- Stream sum, count -------]");
        System.out.println("-- sum   : " + Arrays.stream(myArray).sum());
        System.out.println("-- count : " + Arrays.stream(myArray).count());


        System.out.println("[-------- Stream max, min -------]");
        System.out.println("-- max : " + Arrays.stream(myArray).max());
        System.out.println("-- min : " + Arrays.stream(myArray).min());
    }
}
[--------- Stream foreach ---------]
2, 4, 6, 8, 10, 
[-------- Stream sum, count -------]
-- sum   : 30
-- count : 5
[-------- Stream max, min -------]
-- max : OptionalInt[10]
-- min : OptionalInt[2]

위의 예제는 배열과 함께 사용한 스트림입니다. forEach(), sum(), count() 메소드 등을 배열과 함께 사용했습니다. 원래 문법대로 같은 기능을 구현하려면 몇줄이 더 필요한 코드들을 스트림 기능을 활용하면 한번에 해결됩니다.

스트림에 미리 구현된 메소드들로 연산을 할 수 있습니다.

다음은 콜렉션의 스트림 클래스를 사용한 예제입니다.

콜렉션의 Stream은 유용합니다. 어떤 콜렉션 자료구조라도 같은 방식으로 적용할 수 있는 스트림 연산을 사용할 수 있습니다.

또 스트림의 메소드 체이닝(연달아 메소드 호출)을 사용하면 원래는 여러줄이 걸리는 복잡한 메소드도 한줄에 연결시킬 수 있습니다.

package com.kay;

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

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

        List<String> myList = new ArrayList<String>();
        myList.add("apple");
        myList.add("kiwi");
        myList.add("mango");
        myList.add("banana");
        myList.add("watermelon");
        myList.add("lime");
        myList.add("orange");
        myList.add("strawberry");

        Stream<String> myStream = myList.stream();
        myStream.forEach(str -> System.out.print(str + ", "));
        System.out.println();

        myList.stream().sorted().forEach(str-> System.out.println(str));

    }
}
apple, kiwi, mango, banana, watermelon, lime, orange, strawberry, 
apple
banana
kiwi
lime
mango
orange
strawberry
watermelon

요약

이번 포스팅은 자바 스트림에 대하여 수박겉핥기를 해봤습니다.

이전 학습의 람다식(Lambda Expression)도 그렇고 스트림도 그런데 코드를 줄이면서 코딩 과정이 간결해집니다. 물론 내부적으로는 향상되긴 하는데 결국 긴 코드를 사용했을때와 비슷한 처리가 일어납니다.

코딩을 오래하다 보면 결국은 긴 코드가 싫어집니다. 회사같은 조직에서 간결한 보고를 원하는 것과 비슷합니다. 이미 수도없이 들은 이야기와 상황을 굳이 다시 들을 필요가 없기 때문이죠.

자바의 초급단계가 일단 자바가 굴러가는 원리를 파악하고 실습하는 것이었다면 중급 단계에 들어서면 똑같은 결과도 더 빨리 더 간단히 가는 길을 찾게됩니다. 자바의 바이블인 Effective Java (효과적인 자바) 같은 교재에서 다루는 내용입니다.

초보를 지나면 프로그래밍의 목적이 생기면 어떻게든 거기까지 가는 것은 다 할 수 있게 됩니다. 그런데 더 효율적으로 빨리 가는 것은 별개의 문제입니다. 드롭박스의 창업자 드류 휴스턴은 프로그래밍을 악기연주에 비유하곤 했는데요. 예를들어 피아노를 연주하기 위해서 초보때는 한곡을 치는 것 자체가 일입니다. 그런데 일단 어느정도 연주를 하기 시작하면 그 다음 부터는 더 잘하는 방법이나 어려운 테크닉도 연습하게 되고 나중에는 하루종일도 할 수 있도록 쉽게 연주하는 방법을 추구하게 됩니다.

어떻게 보면 악기라는 것은 머리로만 생각해서 하는 것은 아니죠. 연주를 하면서 몸이 본능적으로 반응하는 부분도 있습니다.

처음엔 믿기 어렵지만 컴퓨터 프로그래밍도 몸이 활성화되는 본능적인 영역이 있습니다. 악기를 배우는 것도 어려운 일이지만 이 프로그래밍은 중급단계까지 가는 것도 어렵고 중급레벨을 넘어서는 것은 더 많은 시간과 노력이 필요합니다.

사람에 따라 다르겠지만 보통 사람이라면 중급정도는 넘어야 프로그래밍 뇌감각이 활성화 될 것입니다. 그 때는 본능에 따라 프로그래밍을 짤 수 있습니다. 그런 사람들은 컴퓨터 앞에 몇시간 앉아있다가 일어서면 프로그램 하나가 뚝딱 만들어집니다.

이제 자바 입문강좌가 50회가 넘어서 코스의 후반부이고 이름은 초급이지만 중급으로 넘어가는 단계라 볼 수 있습니다. 초급은 그냥 따라가는 것만 해도 충분하지만 중급의 수준은 스스로 과제를 발견하고 배운 지식을 응용해야 합니다.

응용력을 기르기 위해서는 잘 정제된 온라인 문서들을 많이 읽어야 합니다. 새로운 프로그램을 만들때 이 온라인 문서들을 활용하는 것은 매우 유용합니다.

영문에는 제대로된 온라인 문서들이 많습니다. 참고 문서에 적어둡니다. 다 같은 주제를 두고 이렇게 저렇게 여러가지 설명을 합니다. 하나의 지식을 얻는 것은 그렇습니다. 같은 주제에 대하여 다양한 글을 읽고 본인의 해석을 가질 때 비로소 충분한 이해를 한 것 입니다. 본인이 그 주제를 다른 사람에게 충분히 설명하고 표현할 수 있을 때 비로소 지식은 나를 매개체로 전달이 됩니다.

그런데 처음에는 다들 서툴죠. 그렇기 때문에 더 다양하게 많이 읽어 보고 그 중에 골라서 테스트도 해봐야 합니다.

참고문서

A Guide to Java Streams in Java 8: In-Depth Tutorial With Examples – Stackify

The Java 8 Stream API Tutorial | Baeldung

Java 8 – Streams – Tutorialspoint

Java Stream API(자바 스트림 API) (jenkov.com)

Java 8 Stream Tutorial (beginnersbook.com)

Leave a Comment