본문 바로가기
Java & Kotlin

자바의 IO와 (New)NIO란?

by Jammini 2023. 4. 9.
728x90

목차

  1. NIO(New Input/Output)
  1. IO와 NIO의 차이점

    2-1. 입출력 방식

    2-2. 버퍼 방식

    2-3. 동기 / 비동기 방식

    2-4. 블로킹 / 넌블로킹 방식

  1. 결론

1. NIO(New Input/Output)

  • 기존 java.io API와 다른 새로운 입출력 API를 말한다.
  • NIO는 JDK 1.4부터 제공 → 자바 7부터 네트워크 지원 강화된 NIO2 API 추가

2. IO와 NIO의 차이점

1. 입출력 방식

  • IO는 스트림(Stream) 방식
    • 입력스트림과 출력스트림이 구분되어 있고 별도로 생성하며 데이터가 단방향으로 전송된다.
  • NIO는 채널(Channel) 방식
    • 하나의 채널로 데이터를 읽고 쓰기가 가능한 양방향이다.

2. 버퍼 방식

  • IO는 넌버퍼(non-buffer)
    • 1바이트씩 읽고 출력하기때문에 느리다
    • 버퍼를 사용하지 않고 버퍼기능을 제공하기 위한 BufferdInputStream, BufferedOutputStream, BufferedReader, BufferedWriter와 같은 보조 스트림을 별도로 제공한다.
    • 스트림으로부터 입력된 전체 데이터를 별도로 저장하지 않는다면, 입력 데이터의 위치를 이동해가면서 자유롭게 이용할 수 없다.
  • NIO는 버퍼(buffer)
    • 기본적으로 버퍼를 사용해서 입출력하기 입출력 성능이 좋다
    • 읽은 데이터를 무조건 버퍼(메모리저장소)에 저장하기 때문에 버퍼내에서 데이터 위치를 이동해 가면서 필요한 부분만 읽고 쓸 수 있다.

3. 동기 / 비동기 방식

  • IO는 동기방식
    • IO에 있는 API를 호출하게되면 그 API가 작업을 다 끝내야 다음 코드로 실행이 가능하다.
  • NIO는 동기 / 비동기 방식 모두 지원
    • 둘다 지원하기 때문에 NIO에 API를 호출하고 나서 다른 작업이 가능하다.

4. 블로킹 / 넌블로킹 방식

  • IO는 블로킹 방식
    • 입력 스트림의 read()를 호출하면 데이터가 입력되기 전까지 스레드는 블로킹(대기상태)된다.
    • 출력 스트림의 write()를 호출하면 데이터가 출력되기 전까지 스레드는 블로킹된다.
    • 스레드가 블로킹되면 다른 일을 할 수가 없고 interrupt 해서 블로킹을 빠져나올 수도 없다.
    • 블로킹을 빠져나오는 유일한 방법은 스트림을 닫는 것이다
  • NIO는 블로킹 / 논블로킹 방식 모두 지원
    • IO 블로킹과의 차이점은 NIO 블로킹은 스레드를 interrupt로 빠져 나올 수 있다.
    • NIO는 넌블로킹을 지원하는데, 입출력 작업시 스레드가 블로킹되지 않는다.
구분IONIO
입출력 방식스트림 방식채널 방식
버퍼 방식넌버퍼(non-buffer)버퍼(buffer)
동기 / 비동기 방식동기 방식동기 / 비동기 방식 모두 지원
블로킹 / 넌블로킹 방식블로킹 방식블로킹 / 넌블로킹 방식 모두 지원

3. 결론

  • NIO가 IO보다 성능이 훨씬 좋지만 때에 따라 IO는 더 좋은 성능을 보일 수도 있다. 두가지를 비교해서 성능 테스트를 하면 가장 좋은 방법이겠지만 대게 일반적으로 아래와 같은 사항들을 고려하며 선택한다.
  • IO를 고려한다면, 연결 클라이언트 수가 적고 전송되는 데이터가 대용량이면서 순차적으로 처리될 필요성이 있을 경우 선택하라.
  • NIO를 고려한다며, 연결 클라이언트 수가 많고 전송되는 데이터 용량이 적으면서, 입출력 작업 처리가 빨리 끝나는 경우를 선택하라.

참고

반응형