백엔드

[백엔드 로드맵] 입출력(IO / NIO)

do_hyuk 2024. 1. 11. 21:35

입출력 IO와 NIO

Java의 입출력 관련 클래스는 너무나 많은데, 크게 Java.io 패키지와 java.nio 패키지로 구분할 수 있다.

 

둘의 차이를 쉽게 말하면 IO의 기능들을 개선하고 새로운 기능을 추가(대표적으로 비동기 / Non-Blocking 지원)하여

나온 것이 NIO라고 생각하면 된다.

 

그럼 무조건 IO보다 NIO가 좋은가?

답은 아니다. NIO가 많은 기능을 개성한 것은 사실이나 특정 상황에서는 IO보다 성능이 떨어지는 경우도 있다.


[1] IO (Old IO)

대략적인 IO 패키지 구조이다.

 

1. File 클래스

  • 파일의 위치 정보를 가진다.
  • 파일의 내용이 아닌 파일 자체를 다룬다.
  • 파일 자체에 대한 정보를 가져오고 다루는 메서드를 포함하고 있다.
File 정보를 String 타입으로 넣는 것보다 File 클래스의 인스턴스에 정보를 입력하고 사용하면 안전하게 작업할 수 있다.

2. Stream 클래스

IO 패키지에서는 스트림이라는 단방향 통로를 사용하여 외부 데이터와 통신한다.

 

Byte Stream

  • 1 byte 단위로 데이터 입출력 수행

Character Stream

  • 문자 단위(2 byte)로 데이터 입출력 수행
단방향이란 데이터를 0번지부터 끝까지 순서대로 가져오고, 한 번 데이터를 읽고나면 다시 돌아갈 수 없음을 의미한다.

3. Buffer 클래스

  • 기본 스트림에 Buffer 개념을 도입해 속도를 개선했다.
  • 기본 스트림의 인스턴스를 생성자로 하며, 단독으로 외부 데이터와 연결될 수 없다.

데이터를 한 번에 하나씩 처리하는 기본 스트림에 반해 Buffer는 데이터를 한번에 모아서 가져오기 때문에

속도와 성능면에서 크게 개선되었다.


[2] NIO (New IO)

New IO라는 이름처럼 IO 패키지의 업그레이드 버전이다.

Java7에서 NIO2라고 새로 나왔는데 NIO와 NIO2를 구분하진 않겠다.

 

1. File 클래스

  • IO 패키지의 File 클래스를 대체할 수 있는 파일 작업 가능하다.
  • 단, 워낙 기능이 다양하고 사용법도 복잡한 편이므로 간단한 작업은 IO 패키지의 File 클래스를 사용하는 것이 편하다.

2. Channer 클래스

  • IO 패키지의 스트림과 달리 양방향 통로를 의미한다.
  • 하나의 채널로 입출력을 동시에 진행한다.
  • 스트림 대비 속도가 빠르다.
  • Non-Blocking 방식으로 자원 사용의 효율이 높다.

3. Buffer 클래스

  • IO 패키지의 Buffer와 같은 역할을 한다.
  • boolean 타입을 제외한 원시타입의 버퍼 클래스들이 존재한다.
  • allocateDirect() 메서드를 사용하면 시스템의 커널 버퍼를 사용할 수 있어 입출력 속도가 향상된다.
allocateDirect()로 생성하는 버퍼 외에는 모두 커널 버퍼가 아닌 JVM 내에서 생성되는 버퍼이다.


[3] IO와 NIO의 차이점 정리

  • 양방향 채널 사용(입출력 통로를 따로 가지지 않음)
  • 기본적으로 Buffer를 사용하므로 속도 개선
  • 비동기 지원(메서드 호출 시점과 결과 출력 시점이 다름)
  • Non-Blocking 지원(I/O를 수행하는 동안 노는 스레드가 없도록 함)


[4] Java에서 사용은?

File을 다루는 것의 차이는 아래와 같다.

이외에도 너무 많은 클래스와 메서드들이 있기 때문에 필요에 따라 상황에 따라 적절한 입출력 패키지를 사용하면 될 것이다.