지난 포스팅에서는 콘솔 출력의
실습을 해봤습니다.
입력과 출력은 어떤 언어라도
함께 짝지어져 있습니다.
여기서 입력과 출력이란 말은
표준 입력과 출력 즉
Standard Input and Output 입니다.
일반적인 시스템이라면 Input 은 키보드
Output은 모니터의 스크린을 의미합니다.
간단한 개념이지만 대부분의
컴퓨터 교재가 대체적으로 불친절하기
때문에 초기에 제대로 의미를
이해하지 못하면 계속 어려움을
겪게 됩니다.
기본적인 개념이 없는 상태에서
입출력 스트림같은 접근 방식이
나오면 깝깝하게 느껴집니다.
컴퓨터 공학은 노력하면 어느정도
수준에는 다다를 수 있습니다.
허나 이것도 재능의 영역이라서
어떤 이는 MS사의 빌게이츠 처럼
컴퓨터란 단어가 생소한 시대에
살면서 어린 시절에 이미 원리를
꿰뚫기도 합니다.
문과적 머리로도 훈련을 통해서
프로그래밍이 충분히 가능하지만
공대적인 뇌라는 것은 어느정도
본성적인 자질이 좌우하기도 합니다.
이렇게 모두가 쉽게 컴퓨터를
이해할 수 있는 것은 아니지만
미래 산업에는 컴퓨터 공학과
IT기술이 모든 사회 시스템의
근간이 되기 때문에 적어도
프로그래밍을 배우는 사람이라면
원리를 완벽하게 이해하려고
노력하려는 자세가 필요합니다.
*******
입력과 출력은 서로 상호작용을
통해서 진행이 됩니다.
입력과 출력에는 여러가지
종류가 있는데 여기서 설명하는
입력은 사람이 키보드를 치는
입력과 스크린에 표시되는 출력입니다.
매우 당연해 보이지만 입력은
꼭 사람이 하지 않아도 됩니다.
파일로 입력을 할 수 있고
네트워크의 스트림을 통해서
입력을 할 수도 있습니다.
지진파 같은 측정기로
입력할 수도 있습니다.
또 마이크 같이 음성입력이라던가
동영상을 촬영하는 카메라의 입력에는
빛을 디지털화하여 0과1로 입력합니다.
동영상을 편집하기 위해서는
동영상의 프레임 데이터를
다시 입력으로 사용할 수 있습니다.
마이크로 하게 보면 CPU에는
연산을 위한 레지스터가 있습니다.
메모리에서 가져온 값을
이 레지스터에 값을 저장하면
CPU입장에서는 입력이고
레지스터를 연산한 값을 메모리로
전송하면 출력입니다.
이렇듯 입력은 컴퓨터 내부에서
상대적으로 주고 받는 관계로
항상 이루어지고 있습니다.
CPU는 복잡한 칩이지만
작동 원리는 단순하기 때문에
사람이 키보드에 입력하는 것을
처리하듯이 다른 입력도 처리합니다.
단지 그 속도가 너무나 빨라서
우리의 일상생활의 인식 범위에서는
한참 벗어나고 이해가 어려울 뿐입니다.
예를 들어 웹소설을 쓰는 작가들을
하루에 1만자의 글을 쓴다고 합니다.
컴퓨터적으로 표현하면 유니코드
1만개를 파일에 입력하는 것 입니다.
이것이 인간이 작업하는 속도입니다.
글자 1개를 2바이트로 잡으면
2만 Byte로 약 19KB가 됩니다.
저장장치인 SSD의 쓰기 속도로
비교하면 540MB/s 로 사람이
하루에 입력할 수 있는 양보다
SSD가 1초에 하드드라이브에
저장하는 속도가 약 3만배 빠릅니다.
메모리나 CPU의 레지스터의 속도는
말할 필요조차 없습니다.
*******
이렇게 느린 사람에게
왜 입력을 받는가?
라는 의문이 생긴다면
순수하게 입력과 출력에 대한
개념을 생각하고 있는 것 입니다.
일단 컴퓨터는 사람이 사용하기
때문이라고 볼 수 있습니다.
사람이 사용하기 위해서
만드는 응용 프로그램이 많기 때문에
사람에게 입력을 받습니다.
컴퓨터는 사람이 아니라
다양한 장치로부터 입력을 받습니다.
하지만 그 모든 입력을 처리해주는
사람의 역할이 역시 가장 중요하기
때문에 우리가 프로그래밍을 배울때
가장 먼저 콘솔의 입력과 출력을
배우는 것 입니다.
거기서 부터 컴퓨터를 통제하고
관리하는 것이 가능합니다.
입출력 콘솔이란 쉽게 말해서
단말기 같은 것 입니다.
정보를 입력하고 정보를 출력하여
다시 정보를 입력하고
다시 정보를 출력하는 일을
무한으로 하는 기기가 단말기입니다.
컴퓨터 내부에서 일어나는 일이나
네트워크에 관한 일까지도
단말기를 통한 접속으로
제어가 가능합니다.
이제 콘솔에 관한 충분한 설명을
한 것 같습니다.
중요한 것은 콘솔을 다룰 수 있다면
다른 어떤 입출력 장치도 다룰 수
있습니다.
프로그래밍에 입문한 사람들이
많은 시간 지겨운 콘솔화면에 지쳐서
떠나가기도 하는데, 그 의미를
잘 몰라서 그런 것 입니다.
거기서 부터가 컴퓨터를 조작하고
통제하는 시작입니다.
하스켈에도 기본 입력 함수가
내장되어 있습니다.
변수 <- getLine 을 하면
키보드의 입력을 문자열로
읽어올 수 있습니다.
main = do
putStrLn "이름을 입력하시오 : "
name <- getLine
putStrLn ("당신의 이름은 " ++ name)
putStrLn "나이를 입력하시오 : "
age <- getLine
putStrLn ("당신의 나이는 " ++ age)
여기서 나이를 숫자로 입력하더라도
숫자가 아니라 문자열입니다.
문자열 자체는 숫자로 바꾸지 않으면
연산이 불가능합니다.
이름을 입력하시오 :
Mr. Kim
당신의 이름은 Mr. Kim
나이를 입력하시오 :
35
당신의 나이는 35
그렇다면 문자열로 입력받아서
숫자로 타입을 변환한 다음
사용해보겠습니다.
아래와 같이 read 함수와
show 함수를 사용합니다.
main = do
putStrLn "이름을 입력하시오 : "
name <- getLine
putStrLn ("당신의 이름은 " ++ name)
putStrLn ("몇년생입니까? ")
birthYear <- getLine
let currentAge = 2021 - read birthYear::Int
putStrLn ("당신의 나이는 " ++ show currentAge )
이름을 입력하시오 :
Mr. Park
당신의 이름은 Mr. Park
몇년생입니까?
1988
당신의 나이는 33
기초적인 입출력 내용이라서
딱히 추가로 설명할 것은
없을 것 같습니다.
뒷쪽 입출력 포스팅에서
상세한 내용을 다룰 예정입니다.