Unix / Linux - 표준 입출력 스트림

안녕하세요, 미래의 리눅스 마법사 여러분! 오늘 우리는 Unix와 리눅스의 표준 입출력 스트림의 마법의 세계로 뛰어들어 보겠습니다. 프로그래밍에 처음 도전하는 분이라면 걱정하지 마세요 - 저는 여러분의 친절한 안내자로서 이 모험을 함께할 것입니다. 수많은 학생들을 가르친 연수 동안 저와 함께한 많은 학생들처럼 말입니다. 그럼 가상의 등을 메고, 함께 탐험해 보겠습니다!

Unix / Linux - Standard I/O Streams

표준 입출력 스트림이란?

먼저, 표준 입출력 스트림이 무엇인지 이해해 보겠습니다. 이를 특별한 채널로 생각해 보세요. 프로그램이 외부 세계와 소통할 수 있는 통로입니다. 우리 인간이 다양한 방법으로 상호작용하는 것처럼 - 말하기, 듣기, 문제가 생기면 소리 지르기 - 우리의 프로그램도 이러한 스트림을 가지고 있습니다.

세 가지 주요 스트림이 있습니다:

  1. 표준 입력 (stdin)
  2. 표준 출력 (stdout)
  3. 표준 오류 (stderr)

이들을 하나씩 알아보겠습니다.

표준 입력 (stdin)

표준 입력, 일반적으로 stdin으로 축약되는 것은 프로그램의 귀입니다. 프로그램이 사용자나 다른 소스로부터 정보를 듣는 방법입니다.

예제 1: stdin에서 읽기

#include <stdio.h>

int main() {
char name[50];
printf("이름이 뭐야? ");
scanf("%s", name);
printf("안녕하세요, %s!\n", name);
return 0;
}

이 예제에서 scanf는 stdin에서 읽고 있습니다. 이 프로그램을 실행하면, 사용자가 무엇을 입력하고 Enter를 누르기를 기다립니다. 이것이 stdin이 작동하는 방식입니다!

표준 출력 (stdout)

표준 출력, 또는 stdout은 프로그램의 입입니다. 프로그램이 우리에게 결과나 메시지를 보여주는 방법입니다.

예제 2: stdout에 쓰기

#include <stdio.h>

int main() {
printf("안녕하세요, 세상!\n");
fprintf(stdout, "이것도 stdout으로 갑니다.\n");
return 0;
}

printffprintf(stdout, ...) 모두 stdout에 쓰고 있습니다. 이 프로그램을 실행하면 터미널에 두 메시지가 출력됩니다.

표준 오류 (stderr)

표준 오류, 또는 stderr는 프로그램이 문제가 발생했을 때 소리 지르는 방법입니다. 이는 오류 메시지와 진단에 사용됩니다.

예제 3: stderr 사용

#include <stdio.h>

int main() {
FILE *file = fopen("nonexistent.txt", "r");
if (file == NULL) {
fprintf(stderr, "오류: 파일을 열 수 없습니다!\n");
return 1;
}
// 나머지 코드...
return 0;
}

여기서 파일이 존재하지 않으면 fprintf(stderr, ...)를 사용하여 오류 메시지를 출력합니다.

스트림 리디렉션

이제 흥미로운 부분이 시작됩니다! Unix/Linux에서는 이러한 스트림을 리디렉션할 수 있습니다. 프로그램의 귀나 입을 다르게 주는 것과 같은 이야기입니다. 어떻게 하는지 보여드리겠습니다:

stdin 리디렉션

$ ./program < input.txt

이 명령은 input.txt에서 입력을 받습니다.

stdout 리디렉션

$ ./program > output.txt

이 명령은 출력을 output.txt에 보냅니다.

stderr 리디렉션

$ ./program 2> error.txt

이 명령은 오류 메시지를 error.txt에 보냅니다.

파이프: 프로그램 연결

여기에 또 하나의 훌륭한 트릭이 있습니다: 하나의 프로그램의 출력을 다른 프로그램의 입력으로 연결할 수 있습니다. 파이프 (|)를 사용하여 이를 할 수 있습니다. 프로그램들이 전화 아저씨 놀이를 하고 있는 것 같은 느낌입니다!

$ echo "안녕하세요, 세상!" | wc -w

이 명령은 "안녕하세요, 세상!"의 단어 수를 세입니다. echo의 출력이 wc의 입력이 됩니다.

표준 입출력 함수

이제 이러한 스트림을 사용하는 일반적인 함수를 살펴보겠습니다:

함수 설명 스트림
scanf 형식화된 입력 읽기 stdin
printf 형식화된 출력 쓰기 stdout
fprintf 형식화된 출력을 스트림에 쓰기 모두
fgets 문자열 읽기 모두
fputs 문자열 쓰기 모두
fread 이진 데이터 읽기 모두
fwrite 이진 데이터 쓰기 모두

개인적인 이야기

처음 이 개념을 가르쳤을 때, 한 학생이 물었습니다. "하지만 교수님, 왜 다른 스트림이 필요한가요? 하나로 모든 것을 할 수 없나요?" 나는 미소를 지으며 대답했습니다. "음식점에서 시끄러울 때, 음식 주문을 하고, 주문이 준비되었는지 듣고, 주문에 문제가 있으면 소리 지르는 것과 같은 이유입니다. 각 스트림은 그 목적이 있습니다!"

결론

표준 입출력 스트림을 이해하는 것은 프로그램 소통의 ABC를 배우는 것과 같습니다. 이는 프로그래밍 여정에서 만나게 될 더 복잡한 개념의 기초가 됩니다. 기억하세요, 모든 훌륭한 프로그래머는 여러분이 현재 있는 위치에서 시작했습니다. 꾸준히 연습하고, 호기심을 가지고 있으면, 곧 프로처럼 데이터를 스트리밍할 수 있을 것입니다!

미래의 기술 스타 여러분, 즐겁게 코딩하세요! ?

Credits: Image by storyset