PostIT

[Java] Java Stream의 개념과 종류 본문

Java

[Java] Java Stream의 개념과 종류

shun10114 2017. 4. 24. 23:44

[Java] Java Stream의 개념과 종류, 그리고 예제를 통한 차이점 이해하기


- 최근 수정일 : 2017.04.27


- IDE : Spring Tool Suite

- OS : OSX Sierra (10.12.3)

- Lang : JAVA 1.8



## 1. 배경과 목적


- FileUpload, Socket 통신 등 다방면에서 Stream API를 사용하게 된다. 하지만, 예제를 보면서 혹은 여러가지 검색을 통해서 구현한다지만 정착 중요한 Stream들 간의 차이를 이해하지 못한다는 생각이 들었다. 이번 학습을 통해 Stream의 종류를 이해하고 차이를 분석하고자 한다.



## 2. 내용


### 1) Stream이란?

Stream은 '데이터 입출력 처리의 중간자 역할'을 수행합니다. 그래서, Stream은 입력과 출력이 관련된 곳이면 어디서든 동작합니다.


스트림은 쉽게 아래와 그림으로 이해할 수 있습니다.



위 그림처럼 스트림은 외부에서 들어오는 데이터를 입력받고(input) 출력(out)하는 '터널'과 같은 중간자 역할을 수행합니다. 

중요한 점은 '단방향'으로 데이터를 송수신 하기 때문에 Input과 Output을 구분하여 사용합니다.



### 2) Stream의 종류

먼저, Stream은 크게 문자 단위 Stream과 Byte 단위의 Stream으로 나뉠 수 있습니다.


- 문자 스트림의 구성도

△ 입력 문자 스트림은 Reader라는 단어가 붙어있습니다.





 클래스

설 명 

 Stream

Reader

 바이트 입력 스트림을 위한 추상 클래스 

 2차 Stream 

 BufferedReader

 문자 버퍼 입력, 라인 해석 

2차 Stream

 LineNumberReader

 문자 입력시 라인 번호를 유지 

2차 Stream

 CharArrayReader

 문자 배열에서 읽어들임 

1차 Stream

 InputStreamReader

 바이트 스트림을 문자 스트림으로 변환 

2차 Stream

 FileReader

 파일에서 바이트를 읽어들여 문자 스트림으로 변환 

1차 Stream

 FilterReader

 필터 적용(filtered) 문자 입력을 위한 추상 클래스 

2차 Stream

 PushbackReader

 읽어들인 문자를 되돌림 (pushback) 

2차 Stream

 PipedReader

 PipedWriter에서 읽어들임 

1차 Stream

 StringReader

 문자열에서 읽어들임 

1차 Stream




△ 출력 문자 스트림은 Writer라는 단어가 붙어있습니다.




 클래스

설 명 

 Stream

Writer

 문자 출력 스트림을 위한 추상 클래스

 2차 Stream

BufferedWriter

 문자 스트림에 버퍼 출력, 줄바꿈 사용

 2차 Stream

CharArrayWriter 

 문자 스트림에 문자배열 출력 

 1차 Stream

OutputStreamWriter 

 문자 스트림을 바이트 스트림으로 변환 

 2차 Stream

FileWriter

 문자 스트림을 바이트 파일로 변환

 1차 Stream

FilterWriter 

 필터 적용(filtered) 문자 출력을 위한 추상 클래스 

 2차 Stream

PipedWriter 

 PipedReader에 출력 

 1차 Stream

StringWriter 

 문자열 출력 

 1차 Stream

PrintWriter 

 Writer 값과 객체를 프린트 

 2차 Stream



- 바이트 스트림의 구성도


△ 입력 바이트 스트림은 InputStream라는 단어가 붙어있습니다.




 클래스

설 명 

 Stream

InputStream 

 바이트 입력 스트림을 위한 추상 클래스 

2차 Stream 

FileInputStream

 파일에서 바이트를 읽어들여 바이트 스트림으로 변환 

1차 Stream 

PipedInputStream 

 PipedOutputStream에서 읽어들임 

1차 Stream

FilterInputStream 

 필터 적용(filtered) 바이트 입력을 위한 추상 클래스 

2차 Stream

LineNumberInputStream 

 바이트 입력시 라인 번호를 유지 (비추천)

2차 Stream

DataInputStream 

 기본 자료형 데이터를 바이트로 입력

2차 Stream

BufferedInputStream 

 바이트 버퍼 입력

2차 Stream

PushbackInputStream 

 읽어들인 바이트를 되돌림 (pushback) 

2차 Stream

ByteArrayInputStream 

 바이트 배열에서 읽어들임 

1차 Stream

SequenceInputStream

 t서로 다른 InputStream을 입력받은 순서대로 이어줌

2차 Stream

StringBufferInputStream 

 문자열에서 읽어들임 (비추천)

1차 Stream

ObjectInputStream 

 객체로 직렬화된 데이터를 역직렬화 하여 읽는다. 

2차 Stream





△ 출력 바이트 스트림은 OutputStream라는 단어가 붙어있습니다. (아닌 것도 있지만 대부분 이 형식에 따름)




 클래스

설 명 

 Stream

OutputStream 

 바이트 출력 스트림을 위한 추상 클래스 

2차 Stream 

FileOutputStream

 바이트 스트림을 바이트 파일로 변환 

1차 Stream 

PipedOutputStream 

 PipedOutputStream에 출력

1차 Stream

FilterOutputStream 

 필터 적용(filiterd) 바이트 출력을 위한 추상 클래스 

2차 Stream

DataOutputStream 

 바이트를 기본자료형으로 출력

2차 Stream

BufferedOutputStream 

 바이트 스트림에 버퍼 출력

2차 Stream

PrintStream

 Stream 값과 객체를 프린트

2차 Stream

ByteArrayOutputStream 

 바이트 스트림에 바이트 배열 출력

1차 Stream

ObjectputStream 

 데이터를 객체로 직렬화 하여 출력

2차 Stream



## 3. 결론


  • 먼저, 위의 다양한 스트림의 종류를 외우지 않더라도, 각각의 기능을 이해하고 알고있으면 필요할 때 원하는 스트림을 쓸 수 있을 것으로 판단합니다. 그리고, 가장 중요한 것은, 문자열이냐 바이트 형식이냐에 따라 각각의 API의 용도와 방식의 차이를 알아야 하는 것이 중요하다고 생각합니다.
  • 간단한 예로 파일 업로드를 보겠습니다.

BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile));

byte[] bytes = fileDataList.get(j).getFileByte();

stream.write(bytes);

stream.close();


FileOutputStream을 1차로 BufferedOutputStream을 통해 해당 파일경로에 바이트파일을 구성하여 파일을 업로드 하는 것입니다. 이 외에도 소켓통신에서도 소켓의 바이트 데이터를 문자열로 바꾸기 위한 BufferedReader와 PrintWriter가 사용됨을 알 수 있습니다.


BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);


위처럼, 많은 상황에서 우리는 Stream을 자연스럽게 사용하고 있습니다.. Stream의 이해와 공부가 개인적으로 더 필요할 것으로 생각되지만, 현재는 이 부분에서 정리를 마치고자 합니다. 각각의 스트림을 통해 잘 이용하도록 공부한 후 더 필요한 정보를 올리겠습니다.


## 4. 참조

 - http://elena90.tistory.com/m/entry/Java-%ED%8C%8C%EC%9D%BC-%EC%9E%85%EC%B6%9C%EB%A0%A5%EC%8A%A4%ED%8A%B8%EB%A6%BCInputStreamOutputStreamReaderWriter

http://hyeonstorage.tistory.com/250






Comments