[java] 비동기 IO와 동기 IO의 차이점

개요

IO (입출력) 작업은 프로그램에서 매우 중요한 부분입니다. 데이터를 읽고 쓰는 동안 프로그램의 실행이 멈추게 되는 경우, 효율성과 성능에 영향을 미칠 수 있습니다. 이러한 이유로 비동기 IO와 동기 IO라는 두 가지 접근 방식이 개발되었습니다.

동기 IO

동기 IO는 데이터를 읽거나 쓰는 동안 프로그램의 실행을 일시 중지합니다. IO 작업이 완료되기 전까지 다른 작업을 수행할 수 없으며, 작업이 완료되면 결과를 반환합니다. 이러한 특징으로 인해 동기 IO는 단순하고 이해하기 쉽습니다.

다음은 동기 IO의 예시입니다.

InputStream input = new FileInputStream("file.txt");
byte[] data = new byte[1024];
int bytesRead = input.read(data);
input.close();

위의 예시에서 input.read(data) 메서드는 데이터를 읽을 때까지 블로킹되며, 읽은 데이터의 길이를 반환합니다.

동기 IO의 가장 큰 단점은 IO 작업이 끝날 때까지 다른 작업을 수행하지 못하고 기다려야 한다는 것입니다. 이는 대규모 시스템에서 많은 사용자를 동시에 처리해야 할 때 성능 문제를 일으킬 수 있습니다.

비동기 IO

비동기 IO는 데이터를 읽거나 쓰는 동안 프로그램의 실행을 멈추지 않고 다른 작업을 수행할 수 있도록 합니다. 비동기 IO 작업은 백그라운드에서 처리되며, 작업이 완료되면 이벤트나 콜백을 통해 결과를 반환합니다. 이러한 특징으로 인해 비동기 IO는 대규모 시스템에서 성능과 확장성을 향상시킬 수 있습니다.

다음은 비동기 IO의 예시입니다.

AsynchronousFileChannel channel = AsynchronousFileChannel.open(Paths.get("file.txt"), StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);
channel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() {
    @Override
    public void completed(Integer result, ByteBuffer attachment) {
        // 데이터를 성공적으로 읽은 후에 수행할 작업
    }
    @Override
    public void failed(Throwable exc, ByteBuffer attachment) {
        // IO 작업 실패 시 수행할 작업
    }
});

비동기 IO의 핵심은 작업이 완료되는 시점에 콜백 함수가 호출되며, 이를 통해 결과를 처리하게 됩니다.

요약

참고 자료