정보

입력과 출력

값을 코드 안에 박아 두면 그 한 경우에만 쓸 수 있습니다.
결과를 출력하지 않으면 아무도 알 수 없습니다.
프로그램은 바깥과 이야기해야 쓸모가 생깁니다.

학습 목표

  1. 프로그램이 바깥에서 값을 입력받고 결과를 출력해야 하는 까닭을 설명할 수 있다.
  2. 입력받은 값이 언제나 문자열이라는 것을 알고, 필요할 때 수로 변환해 쓸 수 있다.
  3. 표준 입출력과 파일 입출력의 차이를 말하고, 파일에 쓰고 읽는 과정을 설명할 수 있다.

값을 코드에 박아 두면 한 번 쓰고 버리게 된다

값을 입력받을 수 있어야 여러 상황에 쓸 수 있습니다.

원의 넓이를 구하는 프로그램을 만든다고 해 봅시다. 반지름이 5일 때의 넓이를 구하려면 이렇게 쓰면 됩니다.

radius = 5

print(3.14 * radius * radius)

78.5가 나옵니다. 잘 실행됩니다. 그런데 이 프로그램은 반지름이 5인 원 하나만 계산할 수 있습니다. 반지름이 7인 원을 구하려면 코드를 열어 5를 7로 고쳐야 합니다. 친구에게 건네주면 친구도 코드를 고칠 줄 알아야 쓸 수 있습니다. 프로그램이라기보다 계산기를 한 번 두드린 것에 가깝습니다.

값을 바깥에서 입력받으면 이야기가 달라집니다.

radius = float(input('반지름을 입력하세요: '))

print(3.14 * radius * radius)

이제 프로그램을 고치지 않고도 어떤 반지름이든 계산할 수 있습니다. 코드는 그대로인데 쓸 수 있는 경우가 훨씬 많아졌습니다. input이 하는 일이 바로 이것입니다.

입력(input)

프로그램이 바깥에서 값을 받아들이는 것입니다.

출력(output)

프로그램이 처리한 결과를 바깥으로 내보내는 것입니다.

프로그램은 바깥과 이야기한다 입력 키보드 · 파일 처리 계산 · 판단 출력 화면 · 파일 입력과 출력이 없으면 프로그램은 혼잣말만 한다

가게에서 물건 바코드를 찍으면 값이 화면에 뜨는 것도 같은 구조입니다. 바코드를 읽는 것이 입력이고, 합계를 화면에 띄우는 것이 출력입니다. 가운데에서 계산하는 프로그램은 물건이 무엇이든 그대로입니다.

키보드와 화면을 쓰는 입출력에는 이름이 붙어 있다

입력과 출력의 방법은 여러 가지입니다. 그중 가장 기본이 되는 키보드로 입력받아 화면으로 출력하는 방법에는 표준 입출력이라는 이름이 붙어 있습니다. input과 print가 이 방법을 씁니다.

스스로 확인

교통카드 단말기에서 입력에 해당하는 것과 출력에 해당하는 것을 각각 하나씩 말해 보세요.

입력받은 값은 언제나 문자열이다

숫자를 입력해도 마찬가지입니다.

여기에 처음 프로그램을 짜는 사람이 거의 반드시 한 번 걸리는 함정이 있습니다. input이 돌려주는 값은 언제나 문자열입니다. 사용자가 키보드로 17을 입력해도, 프로그램이 받는 것은 수 17이 아니라 문자열 「17」입니다.

그래서 이렇게 쓰면 멈춥니다

나이를 입력받아 age + 1을 계산하려고 하면 오류가 납니다. 문자열에 수를 더할 수는 없기 때문입니다. 문자열과 수는 더할 수 없다는 규칙이 여기서 그대로 나타납니다.

고치는 방법은 간단합니다. 입력받은 문자열을 수로 변환하면 됩니다. 정수로 바꾸는 int, 소수점이 있는 수로 바꾸는 float을 씁니다.

age = int(input('나이를 입력하세요: '))

print('내년에는', age + 1, '살이 됩니다.')

int(input(...))은 안쪽부터 읽으면 뜻이 잡힙니다. 먼저 input이 문자열을 입력받고, 그 문자열을 int가 수로 변환합니다. 원의 넓이 코드도 float(input(...))이었던 이유가 이것입니다. 반지름은 3.5처럼 소수점이 있을 수 있으므로 float을 썼습니다.

왜 처음부터 수로 주지 않을까

번거로워 보이지만 이유가 있습니다. 사용자가 무엇을 입력할지 프로그램은 미리 알 수 없습니다. 이름을 입력받을 수도 있고 주소를 입력받을 수도 있습니다. 그래서 일단 있는 그대로 문자열로 입력받고, 수로 다룰지는 만든 사람이 정하게 한 것입니다. 입력한 문자열이 수처럼 보여도 파이썬이 짐작해서 수로 변환하지 않습니다.

거꾸로, 사용자가 숫자가 아닌 것을 입력하면 int가 오류를 냅니다. 「열일곱」이라고 쓰면 수로 바꿀 방법이 없기 때문입니다. 사람이 무엇을 넣을지 모른다는 것은 프로그램을 만들 때 늘 따라다니는 문제입니다. 여기서는 이런 일이 생길 수 있다는 것까지만 알아 둡니다.

스스로 확인

키를 입력받아 평균과 비교하는 프로그램을 만든다면 int와 float 중 무엇으로 바꿔야 할까요? 그렇게 판단한 이유를 말해 보세요.

읽는 사람이 알아볼 수 있게 출력하기

숫자 하나만 덜렁 나오면 무슨 값인지 알 수 없습니다.

원의 넓이 코드는 화면에 78.5만 출력했습니다. 만든 사람은 그것이 넓이인 줄 알지만, 처음 보는 사람은 알 수 없습니다. 그래서 결과를 출력할 때는 설명을 함께 붙입니다. print는 쉼표로 여러 값을 나란히 출력할 수 있습니다.

출력 형식을 조금 조정할 수도 있습니다.

print('가', '나', '다')
print('가', '나', '다', sep='-')
print('이어서', end=' ')
print('한 줄에 붙습니다.')
출력 코드와 그 결과
코드 화면에 나오는 것 무엇을 바꾼 것인가
print('가', '나', '다') 가 나 다 쉼표로 나눈 값 사이에 공백이 하나 들어갑니다.
print(…, sep='-') 가-나-다 사이에 넣을 것을 공백 대신 다른 문자로 바꿉니다.
print(…, end=' ') 다음 출력이 같은 줄에 이어집니다 print는 끝나면 줄을 바꾸는데, 그 줄바꿈을 다른 것으로 바꿉니다.

sep과 end는 외울 것이 아니라 필요할 때 찾아 쓰는 것입니다. 중요한 것은 「출력 형식을 내가 정할 수 있다」는 사실입니다. 표를 만들 때 값 사이에 쉼표를 넣거나, 진행 상황을 한 줄에 이어 출력하고 싶을 때 쓰게 됩니다.

출력은 「결과」가 아니라 「보여 준 것」입니다

print로 화면에 출력한다고 값이 어딘가에 저장되는 것이 아닙니다. 화면에 보여 주기만 하고, 프로그램이 끝나면 그 화면도 사라집니다. 계산한 것을 다음에도 쓰려면 다른 곳에 남겨 두어야 합니다. 그런 곳이 파일입니다.

스스로 확인

원의 넓이를 구하는 프로그램이 78.5만 출력한다면, 어떤 설명을 함께 붙여 출력하면 좋을까요? 한 줄로 적어 보세요.

꺼지면 사라지는 기억, 남는 기억

어제 측정한 값을 오늘 다시 보려면 어딘가에 적어 두어야 합니다.

하루 걸음 수를 기록하는 프로그램을 만들었다고 해 봅시다. 오늘 8412걸음을 입력하고 화면에서 확인했습니다. 그런데 프로그램을 닫고 내일 다시 열면 어떻게 될까요? 어제 넣은 값은 온데간데없습니다.

변수는 프로그램이 실행되는 동안만 값을 저장합니다. 프로그램이 끝나면 변수가 차지하고 있던 메모리 공간도 함께 없어집니다. 일주일치를 모아 평균을 내려면 프로그램 바깥에 값을 남겨 두어야 합니다. 값을 남겨 두는 곳이 파일입니다.

표준 입출력

키보드로 입력받고 화면으로 출력합니다. 사람이 실행 중에 직접 입력하고 결과를 봅니다.

프로그램이 끝나면 남는 것이 없습니다. 값이 많으면 사람이 일일이 입력해야 해서 번거롭고 잘못 입력할 수도 있습니다.

파일 입출력

파일에서 읽어 오고 파일로 써 넣습니다. 사람이 곁에서 입력하지 않아도 됩니다.

프로그램이 끝나도 파일은 그대로 남습니다. 값이 수만 개여도 한 번에 읽어 들일 수 있습니다.


파일을 다루는 일은 세 단계다

열고 → 쓰거나 읽고 → 닫습니다. 공책을 열고, 적고, 덮는 것과 같습니다. 덮지 않고 그냥 두면 적은 내용이 제대로 남지 않을 수 있어서 닫는 단계가 중요합니다.

with open('걸음기록.txt', 'w', encoding='utf-8') as f:
    f.write('월요일 8412\n')
    f.write('화요일 6035\n')

with로 시작하는 이 모양은 닫는 일을 대신해 주는 방법입니다. 안쪽에 적은 일이 끝나면 파일이 저절로 닫힙니다. 사람이 닫는 것을 잊어도 문제가 생기지 않으므로 이 방법을 씁니다. 'w'는 쓰기로 열라는 뜻이고, \n은 줄을 바꾸라는 표시입니다.

써 놓은 파일을 다시 읽는 것도 모양이 같습니다.

with open('걸음기록.txt', 'r', encoding='utf-8') as f:
    records = f.read()

print(records)

'r'은 읽기로 열라는 뜻입니다. 이제 프로그램을 껐다 켜도 어제 적어 둔 기록이 그대로 있습니다.

파일을 여는 세 가지 방식
표시 무엇을 하려고 주의할 점
'r' 읽으려고 파일이 없으면 오류가 납니다.
'w' 새로 쓰려고 원래 있던 내용이 지워집니다. 파일이 없으면 새로 만듭니다.
'a' 뒤에 덧붙이려고 있던 내용은 그대로 두고 맨 뒤에 이어 씁니다.

'w'는 되돌릴 수 없습니다

기록을 하루치씩 덧붙이려던 프로그램에서 'a' 대신 'w'를 쓰면, 실행할 때마다 지금까지 쌓인 기록이 통째로 지워지고 오늘 것만 남습니다. 오류도 나지 않고 프로그램은 멀쩡히 실행됩니다. 실수했다는 것을 며칠 뒤에야 알게 되는 종류의 사고입니다. 파일을 열 때는 덮어쓰려는 것인지 덧붙이려는 것인지를 먼저 정하세요.

스스로 확인

출석을 기록하는 프로그램을 만든다면 'w'와 'a' 중 무엇으로 열어야 할까요? 잘못 고르면 어떤 일이 생길지도 말해 보세요.

핵심 정리

입력과 출력

input & output

  • 값을 코드에 박아 두면 그 한 경우에만 쓸 수 있다
  • 값을 입력받으면 코드를 고치지 않고 여러 경우에 쓴다
  • 키보드로 입력받고 화면으로 출력하는 방법이 표준 입출력

입력값은 문자열이다

가장 자주 걸리는 함정

  • 숫자를 입력해도 문자열로 들어온다
  • 계산하려면 int나 float으로 변환해야 한다
  • 무엇이 들어올지 모르므로 있는 그대로 입력받는 것이다

출력하기

print

  • 숫자만 덜렁 출력하면 읽는 사람이 알 수 없다 — 설명을 함께 붙인다
  • sep은 값 사이, end는 줄 끝을 바꾼다
  • 화면에 출력하는 것은 저장이 아니다

파일 입출력

끝나도 남는 기억

  • 변수는 프로그램이 실행되는 동안만 값을 저장한다
  • 열고 → 쓰거나 읽고 → 닫는 세 단계다
  • 'w'는 있던 내용을 지운다 — 덧붙이려면 'a'

확인 퀴즈

배운 내용을 확인해 봅시다.

Q1

age = input('나이: ')로 입력받은 뒤 age + 1을 계산하면?

Q2

표준 입출력과 파일 입출력의 차이로 옳은 것은?

Q3

날마다 기록을 덧붙여 쌓으려는데 'w'로 파일을 열었다면?