현재 서버에서 대용량 파일을 업로드하고 이후 로직을 최적화해야하는 상황이다.
어떻게 하면 File IO/비동기 및 병렬 처리를 효율적으로 할 수 있을지에 대해 고민하며 공부한 내용을 적어보았다
개요
File I/O에 대해서 알아보기 전에, 우선 Java의 입출력 I/O에 대해서 알아보자
프로그램에서는 어떻게 파일, 키 입력 등의 데이터를 입력하고 처리하는걸까 ?
컴퓨터의 데이터 처리 단위
1. Bit & Byte
사람이 언어를 통해 의사소통을 주고받듯이, 컴퓨터도 연산을 이해하기 위한 언어가 존재한다.
그 최소 단위가 Bit
와 Byte
이다.
1.1. Bit란 ?
비트(bit)는 Binary Digit의 줄임말로 컴퓨터에서 처리하는 정보의 최소 표현 단위이다.
비트는 2진수로서, on/off를 의미하는 0과 1의 두 가지 값만 가질 수 있다.
1.2. Byte란 ?
바이트는 정보의 최소 단위인 bit가 모여 구성된 기본 단위로, 일반적으로 8개의 bit가 모여 한 개의 byte를 구성하게 된다.
- 1 Byte = 8 bits (ex: 01010101)
바이트는 디스크에 데이터가 저장될 때, 컴퓨터가 데이터를 표현하는 가장 작은 단위이다.
1비트가 0/1 총 두 개의 데이터를 담을 수 있었기 때문에,
1Byte = 8Bit = 2^8 = 256개의 데이터를 나타낼 수 있다.
2. Stream ?
스트림이란 데이터, 패킷, 비트, 바이트 등의 일련의 연속성을 갖는 흐름을 의미한다.
즉 Stream은 Byte 단위로 데이터를 읽고 쓰는 역할을 수행하는, Byte 데이터를 다루는 추상화된 개념이다.
데이터를 처리할 때Bit Stream
, Byte Stream
, Character Stream
등 여러 방식으로 처리할 수 있는데 차이는 말 그대로 데이터를 처리하는 단위이다.
Bit Stream | Byte Stream | Character Stream | |
---|---|---|---|
설명 | 비트 단위(0/1)로 처리 | Byte 단위 | 문자들의 연속된 집합, 여러 개의 Byte로 구성 |
크기 | 1 bit | 8bit = 1byte | 2byte 이상 |
데이터 단위 | 0, 1 | 문자, 숫자 등 단일 데이터 | 여러 개의 문자 |
사용 예시 | 데이터 압축, 암호화 및 데이터에 대한 세밀한 제어가 필요한 특수 프로그램에서 사용 | 일반적으로 byte로 구성된 파일들을 처리 | 주로 텍스트 파일 데이터를 처리 |
그렇다면 내가 입력하는 데이터를 컴퓨터는 어떻게 해석하는 것일까 ?
3. ASCII 코드
3.1. ASCII 코드란?
컴퓨터가 사람의 언어를 해석하는 방식은 ASCII 코드를 보면 조금 이해하기 수월할 것이다.
위와 같이 생긴 표를 한 번쯤은 본 적이 있을 것이다.
아스키코드란 문자나 기호를 컴퓨터가 이해할 수 있도록 숫자로 매핑한 코드이다.
표를 살펴보면 0~127의 숫자마다 의미하는 키값이 있는 것을 볼 수 있는데, 위에서 비트에 대해 공부한 우리는 기본적인 아스키코드가 7비트를 사용하여 문자를 표현한다는 것을 알 수 있다!
⭐️ 참고하기
- 아스키코드를 표현하기에는 7비트로 충분하지만, 바이트 단위로 데이터를 처리해야 하므로 7비트로 표현되는 값도
1바이트에 맞춰 저장된다. 이 추가된 1비트는 보통 0으로 채워 저장된다.
- ASCII는 7비트 또는 8비트를 사용하여 문자들을 표현한다.
기본적으로 0부터 127까지의 숫자값을 사용하며, 확장 ASCII는 128부터 255까지 값을 사용한다.
3.2. 컴퓨터가 알파벳을 이해하는 과정
아스키코드에 대해서 확인했다면, 이번에는 우리가 키보드를 입력하면 컴퓨터가 이를 어떻게 이해하는지 쉽게 이해할 수 있을 것이다.
A
라는 문자를 키보드로 누르면 A
의 아스키코드 값인 65가 입력된다.
이 값이 이진수로 변환되고, 변환된 1Byte 크기의 이진 데이터는 컴퓨터의 메모리 공간에 저장된다.
'A' -> 65 (ASCII) -> 01000001 (이진수) -> 1 Byte -> 0x01(저장)
- 메모리 예시
- 메모리 주소
0x01
에 1바이트 데이터 01000001 (문자 'A')가 저장
- 메모리 주소
입력한 값인 (A)를 다시 출력하고 싶을 때는 해당 값이 저장된 0x01
을 참조,
해당 바이트에서 이진수 값을 읽고 다시 알파벳으로 변환하여 컴퓨터와 사람이 서로의 언어를 해석할 수 있게 되는 것이다.
0x01 -> 01000001 -> 65 (ASCII) -> 'A'
마치며...
오늘은 컴퓨터의 기본 데이터 처리 단위인 Bit와 Byte, 그리고 Stream에 대해서 알아보았다.
다음 포스팅에서는 byte와 stream을 프로그램에서는 어떻게 읽고 쓰는지에 대해서 알아볼 예정이다.
(InputStream과 OutputStream, 그리고 이를 Java 코드에서 구현하는 방식)
나중을 위한 포스팅 주제 : 컴퓨터의 이진 데이터 연산 과정 이해(CPU/MEM과 FileI/O 프로세스 이해)