초창기 컴퓨터를 발명한 사람들은 수학자들이었다. 그런 만큼 프로그래밍의 많은 개념이 수학의 개념과 닮았다. 프로그래밍에서 사용되는 변수(variable)도 대수학에서 가져온 개념이다. 하지만 프로그래밍의 변수는 수학의 변수 그 이상이어서, 데이터에 이름을 붙이거나, 데이터를 기억하는 등 용도가 더 다양하다. 변수가 프로그래밍에서 어떻게 활용되는지 살펴보자.

2.2.1 수학의 변수와 프로그래밍의 변수

수학의 변수

컴퓨터 프로그래밍의 변수를 알아보기 위해, 먼저 수학의 변수가 무엇인지 기억을 떠올려 보자. 수학이라는 말에 지레 겁먹지 않아도 된다. 프로그래밍의 변수를 이해하는 데 도움을 줄 정도만 다루니 마음을 놓고 읽어 보자.

수식 2-11

위의 식에서 3은 고정된 상수이고, x는 값이 정해지지 않은 변수다. 이처럼 수학의 변수는 식에서 값이 정해지지 않은 수(미지수)를 나타낸다. 그런데 지금 상태로는 계산을 할 수가 없다. x가 어떤 값이 되느냐에 따라 답이 달라지기 때문이다. 식을 계산하기 위해서는 변수의 값이 특정되어야 한다. 변수의 값을 특정한 수로 바꾸는 것을 대입이라고 한다.

변수 x에 수 6을 대입해 보자. 수학에서 대입을 할 때는 등호(=)를 이용하므로, 다음과 같이 나타낼 수 있다.

수식 2-12

이제 x에 6을 대입했으므로, x + 3이라는 식을 계산할 수가 있다. 계산결과는 물론 9다.

수식 2-13

개념 정리

  • 변수: 값이 정해지지 않은 수(미지수)
  • 대입: 변수의 값을 특정하는 것
  • 변수에 값을 대입하면 변수가 포함된 식을 계산할 수 있다.

프로그래밍의 변수

프로그래밍에서는 변수를 어떻게 사용할까? 파이참 대화식 셸에 x + 3이라는 식을 입력하여 계산해 보자.

코드 2-15 x + 3을 계산하면 오류가 발생한다

>>> x + 3
NameError: name 'x' is not defined

“이름 오류: 이름 ‘x’가 정의되지 않았습니다.”라는 오류 메시지가 출력됐다.

프로그래밍에서도 수학에서와 마찬가지로 미지수가 포함된 식을 계산하려면 변수의 값이 특정되어야 한다. 그런데 위 수식에서는 x가 무엇인지 정의되지 않았기 때문에 계산할 수 없다.

변수 x에 6을 대입해 보자. 파이썬에서 변수에 값을 대입할 때는 수학에서와 같은 기호(=)를 이용한다. 변수 x에 6을 대입하려면 x = 6을 입력하면 된다. 대입 명령을 실행하면 출력 결과가 없어 아무 일도 일어나지 않은 것처럼 보인다. 하지만 대입 후 x + 3 식을 계산해보면 이전과는 달리 오류 없이 계산될 것이다.

코드 2-16 변수 x에 6을 대입하고 x + 3의 계산

>>> x = 6  # 변수 x에 6을 대입
>>> x + 3  # 아까는 계산할 수 없었던 식이 이제 계산된다
9

첫 행에서 x에 6을 대입했으므로, x + 3 식에서 x는 6으로 평가되고, 이 식은 6 + 3이 된다. 계산 결과는 9다.

이처럼 프로그래밍의 변수는 수학의 변수처럼 대입을 통해 특정한 값으로 치환되는 수다.

개념 정리

  • 파이썬에서도, 변수에 값을 대입하면 변수가 포함된 식을 계산할 수 있다.
  • 변수는 변수에 대입된 값으로 치환된다.

2.2.2 변수에 값 대입하고 읽기

대입문과 대입 연산자

x = 6과 같이, 변수에 값을 대입할 때 사용되는 명령을 대입문이라고 한다. 대입문에 사용되는 등호(=)가 대입 연산자다. 대입 연산자를 기준으로 왼쪽에 변수를 적고 오른쪽에 변수에 대입될 값을 적어주면, 변수에 값이 대입된다.

예를 들어, x에 6을, y에 10을, z에 5를 대입하는 대입문은 각각 아래와 같이 표현할 수 있다.

코드 2-17 여러 변수에 대입하기

>>> x = 6   # 변수 x에 6을 대입
>>> y = 10  # 변수 y에 10을 대입
>>> z = 5   # 변수 z에 5를 대입

여러 개의 변수에 각각의 값을 대입하는 대입문을, 아래와 같이 콤마(,)를 이용해 한 행에 쓸 수도 있다.

코드 2-18 하나의 대입문으로 여러 변수에 대입하기

>>> x, y, z = 6, 10, 5  # 변수 x, y, z에 각각 6, 10, 5를 대입

하지만 가능하면 코드 2-17의 형태로 작성하자. 행 수는 좀 많아지겠지만 코드를 읽기 더 좋기 때문이다. 프로그램이 짧고 간단할 때라면 몰라도, 프로그램이 복잡해질수록 코드의 가독성이 중요해진다.

대입 연산자(=)는 양변이 같음을 뜻하는 동등 연산자 ==와 헷갈리기 쉽다. 등호의 개수가 다르고 의미도 다르므로 잘 구별하도록 하자.

개념 정리

  • 대입문으로 변수에 값을 대입할 수 있다.
  • 대입 연산자 =는 동등 연산자 ==와 의미가 다르다.

변수에 대입된 값 읽기

변수에 값을 대입한 뒤에는 변수를 통해 대입된 값을 대신할 수 있다. 프로그램 코드가 실행될 때, 변수의 이름(x, y, z 등)은 그 변수에 대입된 값(6, 10, 5 등)으로 해석된다. 이렇게 변수의 이름으로 대입된 값을 구하는 것을 ‘변수의 값을 읽는다’라고 말한다. 코드 2-17이나 코드 2-18을 실행한 후, 변수 x, y, z의 값을 읽어 보자.

코드 2-19 변수의 값 읽기

>>> x  # 변수 x에 대입된 값 읽기
6

>>> y  # 변수 y에 대입된 값 읽기
10

>>> z  # 변수 z에 대입된 값 읽기
5

>>> x + y - z  # 변수에 대입된 값으로 계산하기
11

변수의 값을 읽으려면 먼저 변수에 값이 대입되어 있어야 한다. 값이 대입되지 않았다면 아래처럼 이름 오류가 발생한다.

코드 2-20 대입하지 않은 변수를 읽는 오류

>>> w  # 오류: w라는 이름의 변수에 값이 대입되지 않았다.
NameError: name 'w' is not defined

개념 정리

  • 변수의 이름을 평가하여 변수에 대입된 값을 읽을 수 있다.

2.2.3 변수에 대입된 값 바꾸기

지금까지 변수에 값을 대입하고 읽는 방법을 알아보았다. 그런데 프로그램을 실행하다 보면 변수의 값을 바꿔야 하는 경우도 있다. 예를 들어, 자동차의 속력을 나타내는 변수 v가 시시각각 바뀐다면, 이 변수에 대입된 값을 계속 수정해야 할 것이다. 변수의 값을 다른 것으로 바꾸는 방법을 알아보자.

변수에 새로운 값 대입하기

변수의 값을 바꾸는 가장 간단한 방법은 변수에 새로운 값을 대입하는 것이다. 변수 x에 먼저 1을 대입한 뒤, 새로운 값을 대입하여 확인해 보자.

코드 2-21 변수에 새로운 값을 대입하기

>>> x = 1  # 변수 x에 1을 대입
>>> x      # 변수 x의 값을 확인
1

>>> x = 2  # 변수 x에 새로운 값을 대입
>>> x      # 변수 x의 값을 확인: 값이 바뀌었다
2

변수에 새로운 값을 대입하면 그때부터 변수는 새로운 값으로 계산된다. 원래 대입되어 있던 값은 버려진다. 직관적이다.

개념 정리

  • 변수에 새 값을 대입하면, 이전 값이 사라지고 새 값이 대입된다.

변수의 값 수정하기

변수에 완전히 새로운 값을 대입하는 것이 아니라, 변수에 현재 대입되어 있는 값을 기준으로 하여 수정해야 할 때가 있다. 예를 들어, 변수 x에 대입된 값을 1만큼 증가시키는 것이다. 이처럼 변수의 현재 값을 기준으로 값을 수정할 때는 대입 연산자의 우변(x + 1)에서 변수의 값을 읽은 뒤 계산하여 다시 대입하면 된다.

코드 2-22 대입문의 우변에서 변수 읽기

>>> x = 2      # 변수 x에 2가 대입되어 있을 때,
>>> x = x + 1  # 변수 x에 x + 1의 계산 결과를 대입
>>> x          # 변수 x의 값을 확인: x에 대입된 값이 1 증가했다.
3

x = x + 1이라는 식이 혼란스러울 수도 있다. 수학에서 등호는 양 변이 같다는 뜻이기 때문이다. 하지만 파이썬에서 =는 대입 연산자이고, 양변이 같음을 의미하는 연산자(==)와는 다르다. 대입문에서는 우변이 먼저 계산된 후 계산 결과가 좌변의 변수에 대입된다. 그래서 x가 2일 때 x = x + 1을 실행하면, 먼저 우변이 x + 1이 3으로 평가된 후, 이 값이 변수 x에 대입된다.

프로그래밍을 하다 보면 변수의 값을 수정하는 일이 빈번하게 발생하기 때문에, 파이썬에서 수정 대입 연산자라는 편리한 연산자가 제공된다. 수정 대입 연산자를 이용하면 변수의 값을 수정하는 x = x + 1과 같은 식을 x += 1과 같이 더 간결하게 작성할 수 있다.

코드 2-23 수정 대입 연산자 사용하기

>>> x += 5  # x = x + 5와 동일한 의미
>>> x
8

>>> x -= 4  # x = x - 4와 동일한 의미
>>> x
4

수정 대입 연산자 +=는 산술 연산자 +와 대입 연산자 =를 합친 것이다(+=보다 먼저라는 것을 유의). 변수 += 값변수 = 변수 + 값과 같은 식이다. 덧셈뿐 아니라 여러 가지 산술 연산자에 대응하는 수정 대입 연산자들이 있다. 표 2-3을 참고하자.

연산자 의미
+= 수를 더한 후 다시 대입
-= 수를 뺀 후 다시 대입
*= 수를 곱한 후 다시 대입
/= 수를 나눈 후 다시 대입
**= 수를 거듭제곱한 후 다시 대입
//= 수를 나눈 후 몫을 대입
%= 수를 나눈 후 나머지를 대입

표 2-3 수정 대입 연산자

수정 대입 연산자를 모두 외울 필요는 없다. 실제로 많이 사용되는 것은 +=-=이므로 이 둘만 기억해도 충분하다.

개념 정리

  • 수정 대입 연산자로 변수에 대입된 값을 수정할 수 있다.

연습문제

연습문제 2-11 변수 사용 연습 1

x에 16을 대입하여 다음 수식을 계산하고, 계산 결과를 출력하라.

수식 2-14

힌트: 수식을 계산하기 전, 변수 x에 수를 먼저 대입해야 오류가 발생하지 않는다.

연습문제 2-12 변수 사용 연습 2

다음 프로그램의 출력 결과를 예상해 보고, 실제 실행 결과와 비교해 보라.

x, y = 4, 8
print(x)
x *= y
print(x)
x -= y
print(x)

2.2.4 변수는 이름이다

지식 활동은 사물과 개념에 이름을 부여하는 것부터 시작된다. 프로그래밍에서도 데이터에 이름을 붙이는 것이 중요하다. 데이터에 이름을 붙여두지 않으면, 어떤 데이터가 존재하더라도 가리킬 방법이 없다. 읽거나 수정하려는 데이터가 어느 것인지 지정하기가 곤란할 것이다. 변수를 사용하는 주 목적 중 하나가 데이터에 이름을 붙이기 위한 것이다. 데이터를 변수에 대입해 두면, 그 변수의 이름으로 그 데이터를 가리킬 수 있다. 변수를 그 변수에 대입해 둔 데이터의 이름이라고 볼 수 있다.

이름 지을 때 지켜야 할 규칙

변수의 이름을 가리키는 정식 프로그래밍 용어는 식별자다. 식별자는 대상을 식별(구분하고 알아보는 것)하기 위한 도구라는 뜻이다. 파이썬에서는 프로그램 안의 모든 대상(수, 텍스트, 그리고 나중에 배우게 될 함수와 클래스 등)에 이름을 붙일 수 있다. 변수의 이름을 지을 때는 다른 대상의 이름과 겹치지 않게 주의해야 한다.

파이썬에서 이름(식별자)을 지을 때 제약이 있다. 변수의 이름이 파이썬에서 기본으로 제공되는 여러 대상(수, 연산자 등)과 겹치는 것을 방지하기 위해서다. 프로그래밍 연습을 하다 보면 금세 숙지하게 되니, 외우려 하지 말고 간단히 살펴보자.

  1. 이름에는 숫자, 알파벳, 밑줄 기호(_), 한글 등 다양한 문자를 사용할 수 있다.
  2. 하지만 연산자로 사용되는 기호(+, -, = 등)와 공백 문자()는 사용할 수 없다. 이름과 연산자를 구별하기 위한 규칙이다.
  3. 이름이 숫자로 시작해서는 안 된다. 이름과 수를 구별하기 위한 규칙이다.
  4. 파이썬의 문법을 구성하는 시스템 예약어(for, if, while 등)를 이름으로 사용할 수 없다.

코드 2-24와 코드 2-25에는 올바른 이름과 잘못된 이름의 예가 나와 있다. 대화식 셸에 입력해 보자. 특히, 코드 2-25에서 어떤 오류가 발생하는지도 확인하자.

코드 2-24 사용할 수 있는 이름의 예

>>> speed = 72       # 알파벳을 사용할 수 있다
>>> my_height = 175  # 숫자, 밑줄 기호를 사용할 수 있다
>>> 원주율 = 3.14    # 한글을 사용할 수 있다

코드 2-25 사용할 수 없는 이름의 예 (오류 메시지 생략)

>>> 나의 신장 = 175  # 오류: 공백 문자는 사용할 수 없다
>>> one+one = 2      # 오류: 연산자로 사용되는 기호는 사용할 수 없다
>>> 10 = 20          # 오류: 숫자로만 구성된 이름은 사용할 수 없다
>>> 3hours = 180     # 오류: 숫자로 시작하는 이름은 사용할 수 없다
>>> for = 10         # 오류: 시스템 예약어는 사용할 수 없다

파이썬 3에서는 이름을 한글로 지어도 된다. 단, 한국어를 사용하지 않는 사람이 프로그램을 열어 볼 가능성이 있다면, 영문만 사용하는 편이 좋다.

이름으로 데이터의 의미를 나타내기

일반적으로 수학의 변수에는 x, y, z처럼 의미 없는 이름이 붙는다. 그렇다면 프로그래밍에서도 그런 식으로 변수의 이름을 붙여도 될까?

누군가가 만든 프로그램을 읽는 중에, 다음과 같은 코드가 나왔다고 생각해 보자.

코드 2-26 변수의 의미가 불분명한 프로그램

a = 3.14
b = 10 * 10 * a
print(b)

이 프로그램에서 변수 a와 변수 b의 의미는 무엇일까? a와 b라는 이름에는 아무런 의미가 없기 때문에 변수에 대입된 값을 토대로 의미를 추측할 수밖에 없다. a는 원주율의 근사값도, 이번 학기 평점 평균도, 어쩌면 대한민국 국민 일인당 월 평균 치킨 섭취량도 의미할 수 있다. 프로그램의 실행에는 문제가 없더라도, 프로그램을 읽고 작성하는 사람은 이 값의 의미를 명확히 알기 어렵다.

반면에 코드 2-27처럼 수에 직관적인 이름이 붙어있다면 프로그램을 이해하기가 훨씬 쉽다. 변수 ‘원주율’은 원주율을, 변수 ‘면적’은 원의 면적을 나타낸다는 것을 변수의 이름만으로도 알 수 있다.

코드 2-27 변수의 의미가 분명한 프로그램

원주율 = 3.14
면적 = 10 * 10 * 원주율
print(면적)

수에 이름을 붙여두지 않으면, 그 수치는 알 수 있어도 그 수치가 무엇을 의미하는지는 알기 어렵다. 컴퓨터가 한 번 계산하고 사라져 버릴 프로그램을 만드는 게 아니라면, 나중에 코드를 읽을 사람들을 위해, 의미 있는 모든 수에 의미 있는 이름을 붙여야 한다.

개념 정리

  • 변수는 값(데이터)에 붙인 이름이다.
  • 이름은 값의 의미가 드러나도록 붙이자.

의미 있는 이름이란?

의미있는 이름은 프로그램이 다루는 문제에 따라 다르다. 수학 방정식을 푸는 프로그램이라면 x, y, z 처럼 간단한 이름도 충분히 의미 있는 이름이 될 것이다. 반대로 ‘면적’이라는 꽤 명확해 보이는 이름도 문맥에 따라 의미가 모호해질 수 있다. 다음 이름들을 생각해 보자.

  • 면적
  • 원의 면적
  • 동전의 면적
  • 십원 주화의 면적
  • 1970년대 십원 주화의 면적
  • 내가 가진 1970년대 십원 주화의 면적

동전교환기를 제어하는 프로그램을 만든다면, 그냥 ‘면적’보다는 더 명확한 이름이 필요할 것이다. 오늘날 발행되는 주화만 취급한다면 ‘십원 주화의 면적’ 정도면 충분한 이름이 될 것이다. 하지만 사람들 각자가 가진 동전의 면적을 다 고려할 필요는 없을 듯하다. 이처럼, 그 이름이 사용되는 문맥에서 충분히 구체적이면서 간결한 이름이 좋다.

이름 삭제하기

데이터에 붙인 이름이 더이상 필요하지 않다면 del 문으로 지울 수 있다.

코드 2-28 del 문으로 이름 삭제하기

>>> x = 10   # 10에 x라는 이름을 붙인다
>>> x        # 변수 x가 가리키는 대상: 10
10

>>> del x    # del 문으로 이름 x를 삭제한다
>>> x        # 변수 x는 이제 삭제되어, 읽을 수 없다
NameError: name 'x' is not defined

2.2.5 데이터 기억하기

변수는 컴퓨터에게 데이터를 기억하도록 하는 용도로도 사용된다. 데이터를 변수에 대입하면 컴퓨터가 데이터를 기억하고 있는다. 데이터가 필요할 때 변수의 이름을 불러 그 데이터를 구할 수 있다.

중간 계산값 기억하기

미국 심리학자 조지 밀러(George Armitage Miller, 1920-2012)의 연구에 따르면, 인간의 단기기억 용량은 7±2개라고 한다. 머리 좋은 사람도 기껏해야 한꺼번에 아홉 개의 정보 밖에 기억하지 못하는 셈이다. 그러므로 뭔가 많이 기억해야 할 때는 때는 어딘가에 써두는 편이 좋다.

다음은 매일 빵을 여러 개 먹는 연오가 사흘 동안 빵으로 섭취하는 칼로리 총량을 계산하는 프로그램이다.

코드 2-29 칼로리 계산 (중간 계산값 기억하기)

빵_칼로리 = 223.5  # 연오가 먹는 빵 1개의 칼로리

day_1 = 빵_칼로리 * 4  # 첫째 날: 빵 4개
day_2 = 빵_칼로리 * 5  # 둘째 날: 빵 5개
day_3 = 빵_칼로리 * 3  # 셋째 날: 빵 3개

칼로리_총량 = day_1 + day_2 + day_3

print(칼로리_총량)

실행 결과:

2682.0

위 프로그램은 변수의 두 가지 활용법을 보여준다.

  1. 빵의 칼로리를 매번 223.5라는 수로 쓰는 대신, 빵_칼로리라는 변수에 대입해 이름으로 나타냈다. 의미 있는 수에 의미 있는 이름을 붙여라. 이것은 앞에서 배운 것이다.
  2. day_1, day_2, day_3이라는 변수에 하루 동안 빵을 통해 섭취한 칼로리를 대입해 두었다가, 칼로리 총량을 구할 때 사용했다. 변수를 이용해 중간 계산값을 기억해둔 것이다.

중간 계산값 누적하기

앞서 배웠듯이, 변수에 대입한 수를 수정할 수 있다. 이를 이용하면 중간 계산값을 변수에 누적하는 방식으로 계산할 수도 있다.

코드 2-30 칼로리 계산 (중간 계산값 누적하기)

빵_칼로리 = 223.5  # 연오가 먹는 빵 1개의 칼로리

칼로리_총량 = 0  # 칼로리 총량의 초깃값

칼로리_총량 += 빵_칼로리 * 4  # 첫째 날: 빵 4개
칼로리_총량 += 빵_칼로리 * 5  # 둘째 날: 빵 5개
칼로리_총량 += 빵_칼로리 * 3  # 셋째 날: 빵 3개

print(칼로리_총량)

실행 결과:

2682.0

코드 2-29과 코드 2-30의 최종 계산 결과는 동일하지만 중간 계산 방식은 조금 다르다. 코드 2-30은 중간 계산값을 day_1과 같은 별도의 변수에 대입하지 않고, 칼로리_총량이라는 하나의 변수에 하루씩 누적하여 계산했다.

둘 중 어떤 것이 더 좋은 방식일까? 최종 계산결과만이 필요하다면 두 방식 모두 괜찮다. 하지만 매일매일의 칼로리 섭취량을 각각 출력해야 한다면, 각 단계별 중간 계산값이 필요하므로 코드 2-29처럼 여러 개의 변수에 중간 계산값을 나눠 저장해야 한다. 반대로, 매일매일 증가된 칼로리 누적량을 출력해야 한다면, 각 단계별 누적값이 필요하므로 코드 2-30처럼 하나의 변수에 계산값을 누적하는 방법이 편리할 것이다.

개념 정리

  • 변수를 이용하면 값을 기억해 두고 필요할 때 읽을 수 있다.
  • 중간 계산값을 저장하거나 누적할 수 있다.

사용자의 입력 보관하기

사용자가 입력한 데이터를 보관해 두었다가 나중에 다시 사용할 때도 변수를 사용할 수 있다. 1장에서 첫 파이썬 프로그램을 만들었을 때, input() 함수를 이용해 사용자의 입력을 받아 보았다. 그 때 작성한 코드를 다시 보자.

코드 2-31 사용자로부터 입력 받기

print('당신의 이름은 무엇인가요?')
name = input()

두 번째 행에서 input() 함수의 계산 결과(사용자가 입력한 텍스트)를 변수 name에 대입했다. 이렇게 사용자의 입력 데이터를 변수에 대입해 두어야, 그 데이터를 나중에 다시 꺼내 화면에 출력할 수 있다.

사용자가 입력한 데이터 외에도, 파일에서 읽은 데이터, 네트워크에서 수신한 데이터 등 프로그램 밖에서 읽어들인 데이터를 보관해 두었다가 다시 읽을 때, 변수를 사용한다.

사용자가 입력한 수 계산하기

여태까지는 계산하려는 수를 프로그램 안에 직접 써 넣었다. 다른 수를 계산하려면 그때마다 프로그램을 수정해야 한다. 프로그램을 수정하지 않고, 데이터만 바꾸어 계산할 수는 없을까? 프로그램 외부로부터 데이터를 읽어들이도록 하면 된다. 프로그램이 사용자로부터 수를 입력받아 그 수를 대상으로 계산하도록 해 보자.

input() 함수를 이용하면 사용자에게서 텍스트 데이터를 입력 받을 수 있다. 하지만 텍스트가 아니라 수를 입력 받으려면 조금 다른 방법이 필요하다. 코드 2-32를 대화식 셸에 입력해 보자.

코드 2-32 사용자에게 수 입력 받기

>>> text = input()           # 텍스트 입력 받기: input() 함수만 쓴다
>? 10

>>> text                     # 입력 받은 텍스트 확인: 따옴표로 둘러싸여 있다
'10'

>>> number = int(input())    # 정수 입력 받기: int() 함수로 감싼다
>? 10

>>> number                   # 입력 받은 정수 확인: 따옴표가 없다
10

대화식 셸의 사용자 입력 프롬프트

파이참의 대화식 셸에서 input() 함수로 사용자의 입력을 받을 때는 프롬프트가 >?로 변한다. 원하는 텍스트를 입력하고 엔터 키를 누르면 프롬프트가 원래 모양으로 바뀐다.

input() 함수는 사용자가 입력한 데이터를 텍스트 데이터로 돌려준다. 입력 받은 텍스트 데이터를 수로 사용하려면, int() 함수를 이용해 정수로 변환해야 한다. 데이터의 유형과 변환은 4장에서 더 자세히 설명할 내용이기에 지금은 무슨 말인지 잘 이해되지 않아도 괜찮다. 일단은 다음과 같이 알아 두자.

알아 두기

  • input() 함수로 입력 받은 데이터는 변수에 대입해야 한다.
  • 사용자에게서 텍스트 입력 받기: 변수 = input()
  • 사용자에게서 정수 입력 받기: 변수 = int(input())
  • 사용자에게서 실수 입력 받기: 변수 = float(input())

사용자에게서 수를 입력 받는 방법을 배웠으니, 사용자의 입력을 계산에 이용하는 프로그램을 만들어 보자.

코드 2-33 사용자에게 수 입력 받기

빵_칼로리 = 223.5  # 김파이 씨가 먹는 빵 1개의 칼로리

print('빵을 몇 개 먹었습니까?')
빵_먹은_개수 = int(input())

칼로리_총량 = 빵_칼로리 * 빵_먹은_개수

print(칼로리_총량, '만큼의 칼로리를 섭취하셨네요.')

코드 2-33은 사용자에게 수를 입력 받아 빵_먹은_개수 라는 변수에 대입한 뒤, 섭취한 전체 칼로리를 계산해 출력해 준다. 텍스트 대신 수를 입력 받는다는 점을 제외하면 1장에서 만들어 본 첫 파이썬 프로그램과 크게 다르지 않다. 한 번 직접 작성해 실행해보기 바란다.

수가 아닌 데이터도 변수에 대입할 수 있다

파이썬에는 수 외에도 텍스트, 집합, 목록 등 여러 데이터 유형이 있다. 수가 아닌 데이터라도 변수에 대입할 수 있으며, 이름을 붙일 수 있다. 수와 그 외의 다양한 데이터에 대해서는 4장과 5장에서 학습할 것이다. 지금은 다만 변수가 수를 포함한 모든 데이터를 위한 것이라는 것만 언급해 둔다.

연습문제

연습문제 2-13 2의 거듭제곱 출력

2의 거듭제곱을 2 ** 1부터 2 ** 5까지 출력하는 프로그램을 작성하라. 단, 거듭제곱 연산자(**)를 사용하지 않아야 한다. 출력결과는 다음과 같다.

2
4
8
16
32

힌트: 변수에 2를 곱한 값을 계속 누적해 보자.

힌트: 변수에 값을 누적하려면 먼저 변수에 초기값이 지정되어 있어야 한다.

연습문제 2-14 피자 칼로리 계산

연오는 피자를 입에 넣으려다 체중 조절 중이라는 사실이 떠올랐다. 피자 박스에는 칼로리가 나와 있지 않고, 알 수 있는 것은 원재료와 양 뿐이다. 이 피자에는 밀가루 200g, 피망 30g, 올리브 10g, 돼지고기 80g, 치즈 20g이 들어 있다. 연오는 인터넷을 검색해 재료마다 칼로리를 찾아 보았다.

  • 밀가루: 364kcal / 100g
  • 피망: 20.1kcal / 100g
  • 올리브: 115kcal / 100g
  • 돼지고기: 242.1kcal / 100g
  • 치즈: 402.5kcal / 100g

피자는 여섯 조각으로 잘려 있다. 한 조각에 몇 칼로리인가?

힌트: 각 재료의 그램(g)당 칼로리를 먼저 계산해 두고, 다음 계산에 활용하라.

연습문제 2-15 사칙연산 계산기

사용자로부터 두 개의 정수를 입력 받아 사칙연산 계산 결과를 출력하는 프로그램을 작성하라. 예를 들어, 사용자가 입력한 수가 10과 20일 때, 프로그램의 실행 결과는 다음과 같다.

첫번째 정수를 입력하세요
10
두번째 정수를 입력하세요
20

10 + 20 = 30
10 - 20 = -10
10 * 20 = 200
10 / 20 = 0.5

힌트: 사용자에게 메시지를 출력하는 방법과 사용자로부터 수를 입력 받는 방법은 코드 2-33에서 살펴보았다.