Jiyong's STUDY

버퍼와 데이터의 이동 본문

프로그래밍

버퍼와 데이터의 이동

Kingjiyong 2018. 5. 14. 23:58

입출력 스트림


프로그램과 그 환경(기기) 사이에서 입출력이 이루어질 때,

데이터의 이동이 직접(direct) 되는 것이 아니라 스트림(stream)이라는 매개체를 거쳐 이동된다.


표준 스트림에는 3가지가 있는데


표준 입력 스트림 (stdin) 

표준 출력 스트림 (stdout)

표준 에러 스트림 (stderr)


일반적으로 표준 입력 스트림은 키보드에서 받아오며,

표준 출력 스트림과 표준 에러 스트림은 모니터로 출력한다.

이는 별도의 리다이렉션을 통해서 변경할 수 있다.


일반적일 때,


키보드 >>> (입력 스트림) >>> 프로그램 >>> (출력 스트림 or 에러 스트림) >>> 모니터


의 형식으로 이어지게 된다.


버퍼(buffer)


버퍼는 쉽게 생각하면 임시 저장소라고 생각하면 된다.


프로그램에서 입출력이 일어날 때에, 스트림과 마찬가지로 데이터는 스트림을 통해서 직접 이동하지 않는다.

입출력 버퍼라는 것을 거치게 되는데, 이는 프로그램의 효율성을 위한 것이다.

작은 문자 하나를 입력 받아 출력하는 과정이 소스코드를 볼 때엔 아주 단순하게 보이지만

많은 과정을 거쳐 입력부터 출력까지 이루어지게 된다.

그러므로  버퍼라는 임시 저장소에 데이터를 묶어서 연산의 효율을 높이는 것이다.


입출력 버퍼에 데이터가 전송되는 시점


출력버퍼의 경우에는 데이터가 완벽히 전송 된 시점에, 호출된 출력함수가 반환된다.

입력버퍼의 경우에는 키보드에 입력한 데이터가 입력버퍼에 완벽히 전송 된 시점에, 호출된 입력함수가 반환된다.


이 내용이 중요한 이유는 함수의 반환시점을 혼동할 수 있기 때문이다.

입력의 경우에는 엔터를 누른 즉시 반환된다고 착각할 수 있고,

출력의 경우에는 모니터에 출력 된 즉시 반환된다고 착각할 수 있다. 


#include <stdio.h>

int fflush(FILE *stream);


출력버퍼를 지우는 fflush 함수.


보통 fflush 함수는 fflush(stdin)과 같은 방식으로 함수를 호출하게 된다.

하지만 fflush 함수는 입력버퍼를 비우기 위한 함수가 아니라 출력버퍼를 비우기 위한 함수이다.


입력버퍼를 지운다는 의미는 버퍼의 데이터를 삭제한다는 의미인데,

출력버퍼를 비운다는 의미는 버퍼의 데이터를 삭제하는 것이 아니라,

최종 목적지로 데이터를 전송한다는 의미이다.


그러므로 출력버퍼를 비우기 위한 fflush 함수에 stdin을 인자로 전달하는 것은 위험성이 있으며, 결과를 보장 받지 못한다.

컴파일러, 운영체제마다 fflush(stdin)을 대하는 반응이 다른데, Windows + Visual Studio 에서만 정상 작동한다.

그렇다고 해도 사용을 하지 않는 것이 바람직하다.


왜냐하면


void ClearBuffer(){

while(getchar()!='\n');

}


강제로 출력시켜야 비워지는 출력버퍼와는 다르게

입력버퍼는 함수가 읽어들이기만 하면 지워지기 때문에 다른 함수를 통해서 비울 수 있기 때문이다.

'프로그래밍' 카테고리의 다른 글

우아한테크코스 4기 모집 시작  (0) 2021.10.05
3항 연산자  (0) 2018.03.19
비트단위연산자  (0) 2018.03.19
연산자  (0) 2015.11.20