본문 바로가기
~2024.10

[Android] Java.Nio 패키지 정리 글

by HJfan 2024. 3. 19.

01. Java.Nio

풀네임은 Java.New Input/Output으로 시스템을 위한 클래스와 인터페이스를 제공하는 패키지이다.


02. 기존의 io와 Nio의 차이

이미지 출처 : https://brunch.co.kr/@myner/47

 

 

스트림 방식이란? 데이터가 단방향으로 전송되는 것(입력 스트림/출력 스트림을 사용)

채널 방식이란? 하나의 채널로 데이터를 읽고 쓰기가 가능. 즉, 양방향

이미지 출처 : https://www.youtube.com/watch?v=ReZGUG0f2Zs

 

스트림의 방식의 경우 입력 스트림과 출력 스트림으로 구분되어 있기에 단방향으로만 통신이 가능하다.

채널 방식은 채널을 통해 입/출력이 가능하기에 양방향 통신이 가능하다.

그리고, IO에는 버퍼가 없기에 입력받은 데이터를 별도로 저장하지 않았다면, 재사용이 불가능하다.

NIO는 입력되거나 출력할 데이터를 바로 받고, 보내는 것이 아닌 Buffer에 우선 저장을 했다가 입력하거나

출력할 때 사용한다. 그렇기에 Buffer 내에서 데이터 위치를 이동해 가며 필요한 부분만 사용할 수도 있다.

 

 

동기 방식 : 예를 들어, IO의 API를 호출했을 경우 작업이 완료되기 전까지 다음 코드가 실행되지 않음

비동기 방식 : NIO의 API를 호출 후 작업이 완료되기 전 다른 작업을 수행할 수 있음

 

 

블로킹 방식 : 어떤 작업을 할 때, 해당 작업이 완료될 때까지 대기하는 것

논블로킹 방식 : 어떤 작업을 할 때, 해당 작업이 완료될 때까지 대기하지 않아도 됨

 

IO에서는 블로킹 방식만 지원하는데, 만약 read() 메서드를 호출했을 경우 데이터가 입력되기 전까지

스레드는 블로킹(대기) 상태가 되고, write() 메서드를 호출했을 경우 데이터가 출력되기 전까지 스레드는

블로킹(대기) 상태가 된다. 스레드가 블로킹 상태가 되면, 다른 작업을 할 수 없고, Interrupt 해서 블로킹을

빠져나올 수도 없다. 블로킹을 해제하는 방법은 스트림을 닫는 것뿐이다.

 

NIO 역시 블로킹 방식을 지원하지만, IO의 블로킹 방식과 다른 점이라면, 스레드가 블로킹 상태가 되더라도

Interrupt을 통해 빠져나올 수가 있다. 그리고, NIO에서 지원하는 논블로킹 방식에서는 입/출력 시 스레드가

블로킹되지 않는다.

 

 

IO와 NIO를 선택하는 분기

    연결 클라이언트의 수가 적고, 전송되는 데이터가 대용량이며, 순차적으로 처리될 필요가 있을 경우 IO를

    연결 클라이언트의 수가 많고, 전성되는 데이터가 저용량이며, 입출력 작업 처리가 빨리 끝날 경우 NIO를

    선택하면 된다.


03. 핵심 구성 요소

[1] Channel(채널)

     데이터의 소스 또는 목적지로의 연결을 나타낸다. 파일, 네트워크 소켓 등 다양한 데이터 소스와 채널을 통해

     처리할 수 있다. 채널은 기본적으로 비동기적으로 데이터를 읽거나 쓸 수 있다.

 

[2] Buffer(버퍼)

     데이터를 저장하는 메모리 공간이다. 버퍼를 통해 데이터를 읽거나 쓰기 전 임시로 데이터 저장이 가능하다.

     ByteBuffer, CharBuffer, IntBuffer 등 다양한 타입의 버퍼가 있다.

     ※ Buffer의 주요 속성

         ㆍcapacity(용량) : 버퍼가 담을 수 있는 데이터의 최대 양. 생성 시에 설정하고, 변경이 불가능

         ㆍposition(위치) : 다음에 읽거나 쓸 요소의 인덱스. 데이터를 읽거나 쓸 때마다 이 값이 변경됨

         ㆍlimit(한계) : (아직 뭔지 모르겠음)

 

[3] Selector(셀렉터)

     하나의 셀렉터로 여러 채널의 이벤트를 모니터링할 수 있다. 이를 통해 단일 스레드로 여러 네트워크 연결을

     관리할 수 있으며, 이벤트가 발생했을 경우에만 작업을 처리하여 효율성을 높일 수 있다.


참조 문헌 및 영상

-https://www.youtube.com/watch?v=ReZGUG0f2Zs

-https://brunch.co.kr/@myner/47