C언어 학습 노트 : 3. 표준 입출력#

1. HCI (인간-컴퓨터 상호작용)#

  • CLI (Command Line Interface)

    • 텍스트 명령어를 통해 사용자와 컴퓨터가 상호작용하는 방식이다.
  • GUI (Graphical User Interface)

    • 그래픽 요소를 활용하여 사용자와 컴퓨터가 상호작용하는 방식이다.

2. 주요 함수#

(1) getchar()#

  • 한 문자를 입력받는 함수이다.
  • 입력은 버퍼(buffer)를 거쳐 처리된다.
  • 버퍼가 비어 있으면 입력을 기다리고, 버퍼에 데이터가 있으면 첫 번째 문자 하나만 반환한다.
  • 반환값은 int형으로, EOF 처리를 위해 char가 아닌 int로 정의된다.
#include <stdio.h>

int main(void) {
    int c;
    printf("문자를 입력하세요: ");
    c = getchar();
    printf("입력한 문자: %c\n", c);
    return 0;
}

(2) scanf()#

  • 서식 지정자(format specifier)에 맞추어 입력을 받는 함수이다.

    • 예: %d (정수), %s (문자열)
  • 버퍼 오버플로우 등의 보안 취약점이 존재한다.

  • 안전한 대안으로 scanf_s() 사용이 권장된다.


(3) gets()#

  • 문자열을 한 줄 단위로 입력받는 함수이다.
  • 입력 크기를 제한하지 않아 심각한 보안 문제가 발생한다.
  • C11 표준에서 완전히 제거되었으며, gets_s() 사용이 권장된다.

(4) puts()#

  • 매개변수로 전달된 문자열을 출력한다.
  • 출력 후 자동으로 개행 문자를 추가한다.

(5) fflush()#

  • 버퍼를 비우는 함수이다.
  • 예: fflush(stdout); → 표준 출력 버퍼를 즉시 비운다.

3. 입출력의 원리#

  • 입출력은 사용자 모드(user mode)가 아닌 커널 모드(kernel mode) 에서 수행된다.
  • 사용자 모드와 커널 모드 간 연결 단위는 파일(file) 이다.
  • 네트워크 통신에 사용되는 소켓(socket) 또한 파일의 일종으로 취급된다.

4. 버퍼(Buffer)#

  • 버퍼는 데이터를 임시 저장하는 메모리 영역이다.
  • ‘완충기’라는 의미를 가지며, 입출력 속도의 불균형을 보완한다.

5. DMA (Direct Memory Access)#

  • DMA는 데이터 전송 시 CPU 개입을 최소화하는 방식이다.
  • 장치가 메모리에 직접 접근하여 데이터를 전송하므로 속도가 향상된다.

6. int 자료형의 범위#

  • 부호 있는 32비트 int형: -2,147,483,648 ~ 2,147,483,647

  • 범위를 초과하면 오버플로우가 발생한다.

    • 예: 2,147,483,648-2,147,483,648
    • 예: 2,147,483,649-2,147,483,647
  • 부호 없는 unsigned int: 0 ~ 4,294,967,295 (2^32 - 1)


학습 포인트 정리#

  • getchar()는 문자를 입력받고 int형으로 반환한다.
  • scanf()gets()는 보안 문제로 사용이 권장되지 않으며, scanf_s(), gets_s()를 대체로 사용한다.
  • puts()는 문자열 출력 시 자동으로 개행을 추가한다.
  • fflush()는 출력 버퍼를 비운다.
  • 모든 입출력은 커널 모드에서 처리되며, 파일과 소켓은 동일한 추상 개념으로 다뤄진다.
  • int 자료형은 32비트 기준으로 -2^31 ~ 2^31 - 1까지 표현 가능하다.