stream

2020. 4. 28. 19:32인프런/웹개발 코스 [JAVA 개발언어]

스트림(Stream)

자바 8에서 추가한 스트림은 람다식을 활용할 수 있는 기술 중 하나입니다 자바 8 이전에는 배열 또는 컬랙션 인스턴스를 다루는 방법은 for 또는 foreach은 돌리면서 하나씩 꺼내서 다루는 방법이었습니다 간단한 경우라면 상관이 없지만 로직이 복잡해질수록 코드의 양이 많아져 여러 로직이 섞이게 되고 메서드를 나눌경우 루프를 여러 번 도는 경우가 발생합니다.

 

스트림은 데이터의 흐름입니다 배열또는 컬렉션 인스턴스에 함수 여러 개를 조합하여 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있습니다 또한 람다식을 이용하여 코드의 양을 줄이고 간결하게 표현할 수 있습니다 즉 배열과 컬렉션을 함수형으로 처리할 수 있습니다.

 

또 하나의 장점은 간단하게 병렬처리가 가능하다는 점과 하나의 작업을 둘 이상의 작업으로 잘게 나워 동시에 진행하는 것을 병력 처리라고 합니다 즉 스레드를 이용하여 많은 요소들을 빠르게 처리할 수 있습니다.

자바 입출력과 스트림(Stream)

데이터 입출력

프로그램에서는 데이터를 외부에서 읽고 다시 외부로 출력하는 작업이 빈번하게 일어납니다. 데이터는 사용자로부터 키보드, 마우스 등을 통해 입력될 수도 있고, 파일 또는 네트워크를 통해 입력될 수도 있습니다. 또 반대로 데이터를 사용자에게 모니터나 파일 등으로 출력할 수도 있습니다.

자바 입출력과 스트림(Stream)

자바에서 데이터는 스트림(Stream)을 통해 입출력 됩니다. 스트림은 단일 방향으로 연속적으로 흘러가는 것을 말하는데 물이 높은 곳에서 낮은 곳으로 흐르듯이 데이터는 출발지에서 나와 도착지로 흘러간다는 개념입니다.

 

프로그램이 출발지냐 또는 도착지냐에 따라서 스트림의 종류가 결정되는데, 프로그램이 데이터를 입력받을 때에는 입력(InputStream)이라고 부릅니다. 입력 스트림의 출발지는 키보드, 파일, 네트워크 상의 프로그램이 될 수 있고, 출력 스트림의 도착지는 모니터, 파일, 네트워크 상의 프로그램이 될 수 있습니다.

프로그램끼리의 데이터 입출력

항상 프로그램을 기준으로 데이터가 들어오면 입력스트림이고 데이터가 나가면 출력 스트림이라고 생각하시면 됩니다. 그리고 프로그램이 네트워크 상의 다른 프로그램과 데이터를 교환을 하기 위해서는 양쪽 모두 입력 스트림과 출력 스트림이 따로 필요하며 스트림은 단방향 통신을 한다는 특징이 있으므로 하나의 스트림으로 입출력을 동시에 할 수 없기 때문입니다.

Java.io 패키지

자바의 기본적인 데이터 입출력은 Java.io 패키지에서 제공합니다. java.io 패키지에서는 파일 시스템의 정보를 얻기 위한 File클래스와 데이터를 입출력하기 위한 다양한 입출력 스트림 클래스를 제공합니다.

바이트 단위 입출력 스트림 : 그림, 멀티미디어, 문자등 모든 종류의 데이터들을 주고받을 수 있습니다.

문자 단위 입출력 스트림 : 오로지 문자만 주고받을 수 있게 특화되어 있습니다.

 

InputStream

 

InputStream은 바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스입니다. 모든 바이트 기반 입력 스트림은 이 클래스를 상속받아서 만들어집니다. InputStream 클래스에는 바이트 기반 입력 스트림이 기본적으로 가져야 할 메서드들이 정의되어 있습니다.

OutputStream

 

OutputStream은 바이트 기반 출력 스트림의 최상위 클래스로 추상클래스입니다. 모든 바이트 기반 출력 스트림 클래스는 이 클래스를 상속받아서 만들어집니다. OutputStream 클래스에는 모든 바이트 기반 출력 스트림이 기본적으로 가져야 할 메서드가 정의되어 있습니다.

Stream 얻기

모든 스트림에서 사용할 수 있는 공통 메소드들은 BaseStream에 정의되어 있으며 Stream은 객체 요소를 처리하는 스트림, IntStream, LongStream, DoubleStream은 각각 기본 타입인 int, long, double 요소를 처리하는 스트림입니다.

컬렉션으로부터 스트림 얻기

다음은 컬렉션으로부터 스트림을 얻어봅니다

List<String> list = Arrays.asList("가", "나", "다");
Stream<String> stream = list.stream(); // Collection . stream()

위의 코드는 컬렉션을 사용하여 리스트를 지정해주고 스트림에서 리스트 값을 얻어올 수 있습니다

배열로부터 스트림 얻기

다음은 배열로부터 스트림을 얻어봅니다

String[] strArray = {"가", "나", "다"};
Stream<String> stream = Arrays.stream(strArray); // 문자열
int[] intArray = {1, 2, 3, 4};
IntStream intStream = Arrays.stream(intArray); // 정수

위의 코드는 문자가 담긴 배열과 숫자가 담긴 배열을 스트림에서 배열 값을 얻어올 수 있습니다

숫자 범위로부터 스트림 얻기

다음은 숫자 범위로부터 스트림을 얻는 것입니다.

IntStream stream = IntStream.rangeClosed(1, 100);

처음에는 1부터 100까지 갖는 IntStream을 리턴합니다.

rangeClosed(int startInclusive, int endExclusive)

 

위의 코드는 첫 번째 매개 값부터, 두 번째 매개 값까지 순차적으로 제공하는 IntStream을 리턴합니다.

range(int startInclusive, int endInclusive)

 

위의 코드는 rangeClosed와 같지만 두 번째 매개 값은 포함하지 않습니다.

파일로부터 스트림 얻기

Files의 메서드인lines(), BufferedReader의 메서드인 이용하여 문자 파일의 내용을 스트림을 통해 읽습니다.

public static void main(String[] args) throws IOException{
        // 파일 내용을 소스로 하는 스트림
        Path path = Paths.get("src/stream/list.txt");

        // Files.lines() 메소드 이용
        Stream<String> stream = Files.lines(path, Charset.defaultCharset()); // 운영체제 기본 문자셋
        stream.forEach(System.out :: println);
        System.out.println();

        // BufferedReader의 lines() 메소드 이용
        File file = path.toFile();
        FileReader fileReader = new FileReader(file);
        BufferedReader br = new BufferedReader(fileReader);
        stream = br.lines();
        stream.forEach(System.out :: println);
}

실행하면 list.txt안의 데이터가 두 번 console에 찍히게 됩니다

디렉터리로부터 스트림 얻기

Files의 메서드인list()를 이용하여 디렉터리의 내용을 스트림을 통해 읽는다.

public static void main(String[] args) throws IOException{
        Path path = Paths.get("c://");
        Stream<Path> stream = Files.list(path);
        stream.forEach(p -> System.out.println(p.getFileName()));
}

출력 시 C:드라이브 안에 있는 디렉터리를 보여줍니다

'인프런 > 웹개발 코스 [JAVA 개발언어]' 카테고리의 다른 글

싱글톤 패턴  (0) 2020.04.28
스레드  (0) 2020.04.28
Collection  (0) 2020.04.28
열거형  (0) 2020.04.27
내부 클래스  (0) 2020.04.27