Buffer(버퍼)란 뭘까?
버퍼란 데이터의 임시 저장 공간을 의미하는 용어입니다.
A와 B가 서로 입출력을 수행하는데 있어 속도 차이가 발생할 때 이를 극복하기 위해 사용하는 임시 저장 공간을 의미합니다.
그러면 버퍼는 왜 사용할까?
위에서 말했듯이 서로 다른 장치가 입출력을 수행하는데 있어 속도 차이가 발생할 때 이를 극복하기 위해 사용합니다.
예를 들어, HDD(하드디스크)와 CPU를 생각해보겠습니다. (CPU와 하드디스크가 바로 연결되어 있다고 가정합니다)
1초 동안 CPU는 하드디스크보다 엄청나게 많은 데이터를 처리할 수 있습니다. 즉, CPU는 1초에 100개의 데이터를 처리할 수 있지만 하드디스크는 1초에 3개의 데이터만 처리할 수 있다면 CPU 입장에서는 97개 만큼 효율성이 떨어진다는 의미입니다.
만약 CPU와 하드디스크 사이에 RAM이라는 버퍼가 있다고 가정해보겠습니다. RAM은 CPU보다는 느리지만 하드디스크보다 훨씬 빠른 주기를 갖고 있습니다.
하드디스크는 RAM(버퍼)에 데이터를 보냅니다. CPU는 다른 할 일을 처리하다가 버퍼에 데이터가 어느 정도 쌓이면 한꺼번에 가져와서 처리합니다.
결론적으로 CPU는 쉬는 순간이 없이 엄청난 효울로 연산을 할 수 있습니다.
이렇게 버퍼는 속도 차이가 큰 두 대상이 입출력을 수행할 때 효율성을 위해 사용하는 임시 저장 공간이라고 할 수 있습니다.
c++ 버퍼와 스트림
그러면 c++에서는 어떤 형식으로 버퍼에 대한 기능을 제공하는지 알아보겠습니다.
c++는 c언어와 마찬가지로 입출력에 관한 기능을 언어에서 기본적으로 제공하지 않습니다.
그 이유는 컴파일러를 만들 때 입출력 기능을 해당 하드웨어에 가장 적합한 형태로 만들 수 있도록 컴파일러 개발자에게 권한을 주기 위해서입니다.
하지만 대부분의 c++ 컴파일러는 iostream과 fstream 헤더 파일에 정의되어 있는 클래스 라이브러리를 제공합니다.
iostream과 fstream 클래스 라이브러리의 중요 개념 중 하나가 바로 스트림(stream)입니다.
스트림(stream)이란?
c++ 프로그램은 파일이나 콘솔의 입출력을 직접 다루지 않고, 스트림(stream)이라는 흐름을 통해 다룹니다.
스트림이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미합니다.
즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 합니다.
버퍼(buffer)
스트림은 내부에 위에서 말한 버퍼(Buffer)라는 임시 메모리 공간을 가지고 있습니다.
이러한 버퍼를 이용하면 입력과 출력을 좀 더 효율적으로 처리할 수 있습니다.
버퍼를 사용하면 문자를 하나씩 전달하는 것이 아닌 묶어서 한 번에 전달하므로, 전송 시간이 적게 걸려 성능이 향상되고, 사용자가 문자를 잘못 입력했을 경우 수정을 할 수 있습니다.
하지만 입력 작업에 버퍼를 사용하는 것이 반드시 좋은 것만은 아닙니다.
빠른 반응이 요구되는 게임과 같은 프로그램에서는 키를 누르는 즉시 바로 전달되어야만 합니다.
이렇게 버퍼를 사용하는 입력과 버퍼를 사용하지 않는 입력은 서로 다른 용도로 사용됩니다.
따라서 자신의 목적에 맞게 버퍼의 사용 여부를 판단해야 합니다.
대부분의 c++ 프로그램은 입력 시에는 사용자가 Enter 키를 누르면 입력 버퍼를 비우고, 출력 시에는 개행 문자를 전달받으면 출력 버퍼를 비우게 됩니다.