백엔드 개발자 로드맵 따라가기 3. 입출력(IO / NIO)

박성수·2020년 11월 24일
0

입출력 IO 와 NIO

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

둘의 차이를 쉽게말하면 IO의 기능들을 개선하고 새로운 기능을 추가(대표적으로 비동기/Non-Blocking 지원)하여 나온 것이 NIO라고 생각하면 된다.

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

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

1. IO (Old IO)

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

1-1. File 클래스

  • 파일의 위치 정보를 가진다.
  • 파일의 내용이 아닌 파일 자체를 다룬다.
  • 파일 자체에 대한 정보를 가져오고 다루는 메서드를 포함하고있다.

File 정보를 String 타입으로 넣는것 보다 File 클래스의 인스턴스에 정보를 입력하고 사용하면 안전하게 작업할 수 있다.

1-2. Stream 클래스

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

Byte Stream

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

Character Stream

  • 문자 단위(2byte)로 데이터 입출력 수행

단방향이란 데이터를 0번지부터 끝까지 순서대로 가져오고, 한번 데이터를 읽고나면 다시 돌아갈 수 없음을 의미한다.

1-3. Buffer 클래스

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

데이터를 한번에 하나씩 처리하는 기본 스트림에 반해 Buffer는 데이터를 한번에 모아서 가져오기 때문에 속도와 성능면에서 크게 개선되었다.

2. NIO (New IO)

New IO라는 이름처럼 IO 패키지의 업그레이드 버전이다.
Java7에서 NIO2라고 새로 나왔는데 NIO와 NIO2를 구분하진 않겠다.

2-1. File 클래스

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

2-2. Channer 클래스

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

2-3. Buffer 클래스

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

allocateDirect() 로 생성하는 버퍼 외에는 모두 커널 버퍼가 아닌 JVM 내에서 생성되는 버퍼이다.

3. IO와 NIO의 차이점 정리

크게 아래와 같다.

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

4. Java에서 사용은?

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

<참고>
https://codevang.tistory.com/154

profile
Java 백엔드 개발자입니다. 제가 생각하는 개발자로서 가져야하는 업무적인 기본 소양과 현업에서 가지는 고민들을 같이 공유하고 소통하려고 합니다.

0개의 댓글