이 페이지의 목차
변수 — 값에 이름을 붙이다
코드 예제: Python · C · 예상 50분
학습 목표
- 변수의 개념과 필요성을 설명한다.
- 변수를 만들어 값을 저장하고 꺼내 쓰는 프로그램을 작성한다.
관련 성취기준
- 프그02-01
변수와 자료형의 개념과 특징을 이해하고, 구분하여 지정할 수 있으며, 이들을 사용한 프로그램을 작성할 수 있다.
생각 열기 — 이름이 없으면 다시 못 쓴다
계산기로 88 + 92 + 75 를 눌러 255를 얻었다. 그런데 이 값을 3으로 나눈 뒤, 다시 처음 세 수의 최고점과 비교하려면 어떻게 해야 할까. 계산기 화면에는 마지막 결과 하나만 남아 있다.
변수 — 값을 담아 두는 이름
변수(variable) — 값을 담아 두고 이름으로 꺼내 쓸 수 있게 한 저장 공간는 값을 담아 두는 상자에 붙인 이름이다. 이름을 알면 언제든 값을 꺼내 쓸 수 있고, 새 값을 덮어써 바꿀 수도 있다.
변수에 값을 넣는 일을 대입이라 하고 = 로 적는다. 수학의 등호와 뜻이 다르다. 1단원 7차시에서 순서도에 ← 로 적었던 그 화살표가 여기서 = 가 된다.
점수 = 88
print("처음 점수:", 점수)
점수 = 92
print("고친 점수:", 점수)
a = 10
b = 20
a, b = b, a
print("바꾼 뒤 a =", a, ", b =", b)처음 점수: 88 고친 점수: 92 바꾼 뒤 a = 20 , b = 10
#include <stdio.h>
int main(void)
{
int score = 88;
printf("처음 점수: %d\n", score);
score = 92;
printf("고친 점수: %d\n", score);
int a = 10, b = 20, temp;
temp = a;
a = b;
b = temp;
printf("바꾼 뒤 a = %d , b = %d\n", a, b);
return 0;
}처음 점수: 88 고친 점수: 92 바꾼 뒤 a = 20 , b = 10
= 는 같다는 뜻이 아니다
수학에서 x = x + 1 은 성립하지 않는 식이다. 프로그램에서는 자주 쓰는 문장이고 뜻이 전혀 다르다.
오른쪽을 계산해서 그 값을 왼쪽 변수에 넣어라.
그래서 점수 = 점수 + 5 는 “지금 점수에 5를 더한 값을 다시 점수에 넣어라”가 된다. 읽을 때 = 를 “는 ~가 된다” 로 읽으면 헷갈리지 않는다.
이름 짓는 규칙
변수 이름을 아무렇게나 지을 수는 없다. 두 언어가 거의 같은 규칙을 쓴다.
| 규칙 | 되는 예 | 안 되는 예 |
|---|---|---|
| 글자·숫자·밑줄만 쓴다 | score, score2, my_score | my-score, score! |
| 숫자로 시작할 수 없다 | score1, c1 | 1반, 2nd |
| 공백을 넣을 수 없다 | total_sum | total sum |
| 예약어를 쓸 수 없다 | my_if, total | if, for, int |
| 대소문자를 구분한다 | score 와 Score 는 다른 변수 | — |
Python은 한글 이름도 쓸 수 있어 이 교과서의 Python 예제에서 더러 쓴다. C는 표준으로는 쓸 수 없다.
좋은 이름이 주석을 줄인다
규칙만 지키면 되는 것이 아니다. 1단원 5차시에서 “이름에 뜻을 담는다”고 했다. 그때 한 이야기가 여기서 실제 코드로 나타난다.
| 이렇게 적으면 | 이렇게 적으면 |
|---|---|
a = 88b = 92c = (a + b) / 2 | 국어 = 88영어 = 92평균 = (국어 + 영어) / 2 |
c 가 무엇인지 알려면 위를 다시 읽어야 한다 | 읽으면 바로 안다. 설명이 필요 없다 |
값이 바뀌지 않는 것 — 상수
원주율처럼 프로그램이 도는 동안 바뀌면 안 되는 값이 있다. 이런 값을 상수(constant) — 한 번 정하면 프로그램이 도는 동안 바뀌지 않는 값라 한다.
- C는
const double PI = 3.14159;처럼const를 붙여 언어가 막아 준다. 바꾸려 하면 컴파일 오류가 난다. - Python에는 막아 주는 장치가 없다. 대신
PI = 3.14159처럼 이름을 모두 대문자로 적어 “이건 바꾸지 말자”고 약속한다.
활동
변수 이름 규칙을 어긴 코드의 오류 메시지 읽기
약 20분1단계 — 일부러 어겨 본다 (10분)
아래를 하나씩 실행해 보고 오류 메시지를 그대로 적는다. 실행기의 [고치기]를 눌러 코드를 바꿔 가며 해 보자.
| 시도한 코드 | 어떤 규칙을 어겼나 | 오류 메시지 (그대로) |
|---|---|---|
1반 = 30 |
||
my score = 30 |
||
if = 30 |
||
점수 = 88 뒤에 print(점수s) |
2단계 — 메시지의 모양을 견줘 본다 (5분)
- 어느 오류가 실행 전에 걸렸는가? 어느 것이 실행 도중에 걸렸는가?
- 1단원 2차시에서 다룬 컴파일러와 인터프리터의 차이가 여기서 어떻게 보이는가?
3단계 — 이름을 고쳐 쓴다 (5분)
아래 코드의 변수 이름을 뜻이 담긴 이름으로 바꾸고, 바꾼 뒤 주석이 필요 없어졌는지 확인한다.
a = 170 # 키
b = 62 # 몸무게
c = b / ((a/100) ** 2) # 체질량지수
print(c)개념 확인 문제
보기를 누르면 바로 채점된다. 틀려도 해설을 읽으면 된다.
프로그램에서 점수 = 점수 + 5 가 뜻하는 것은?프그02-01
다음 중 변수 이름으로 쓸 수 없는 것은?프그02-01
C에서 두 변수의 값을 맞바꿀 때 임시 변수(temp)가 필요한 이유는?프그02-01
상수를 다루는 방식에 대한 설명으로 알맞은 것은?프그02-01
변수 이름을 c 대신 평균 으로 짓는 것이 좋은 가장 큰 이유는?프그02-01
더 알아보기
심화변수는 상자인가, 이름표인가
“변수는 값을 담는 상자”라는 비유는 C에 잘 맞는다. int score = 88; 은 실제로 메모리에 정수 한 칸을 잡고 88을 써 넣는다. 그런데 Python은 조금 다르다. 점수 = 88 은 88이라는 값에 이름표를 붙이는 쪽에 가깝다. 그래서 a = [1, 2] 뒤에 b = a 를 하면, 상자가 복사되는 것이 아니라 같은 목록에 이름표가 하나 더 붙는다. 이 차이는 4차시에서 리스트를 다룰 때 실제로 겪게 된다. 지금은 비유는 언어마다 잘 맞는 곳이 다르다는 것만 기억해 두자.
실무이름 짓는 방식을 팀에서 통일한다
여러 단어를 이어 붙일 때 방식이 여럿이다. total_sum 처럼 밑줄로 잇는 방식, totalSum 처럼 뒷 단어 첫 글자를 대문자로 쓰는 방식이 대표적이다. 어느 쪽이 옳다기보다 한 프로그램 안에서 섞이지 않는 것이 중요하다. Python에서는 밑줄 방식이, Java나 JavaScript에서는 대문자 방식이 관례로 굳어 있다. 3단원 5차시에서 모둠의 코딩 규칙을 정할 때 이 항목이 들어간다.
심화선언하고 쓰는 언어, 그냥 쓰는 언어
C는 int score; 처럼 미리 알려야 쓸 수 있다. 알리지 않고 쓰면 컴파일 오류다. Python은 값을 넣는 순간 변수가 생긴다. 편하지만 대가가 있다 — 점수 를 점슈 로 잘못 적어도 새 변수가 조용히 만들어진다. C라면 “그런 이름 없다”고 바로 걸렸을 일이 Python에서는 실행 중에 엉뚱한 결과로 나타난다. 1단원 2차시의 “오류를 만나는 시점” 차이가 변수 이름에서도 그대로 나타나는 셈이다.
이어지는 학습
이 차시를 이해하려면 다음을 먼저 알아야 한다.
- 8차시에서 준비한 개발 환경 — 프로그래밍 프그01-04
교과서에서 찾기
| 교과서 | 해당 위치 | 쪽수 |
|---|---|---|
| 성림출판(Python) | 프로그래밍의 기초 › 01 변수와 자료형 | 58쪽 |
| 씨마스커뮤니케이션(Python) | 프로그래밍 기초 › 2 변수와 자료형 | 84쪽 |
| 삼양미디어(Python) | 프로그래밍의 기초 › 01 데이터 입출력 (프그02-02와 통합) | 42쪽 |
| 삼양미디어(C) | 프로그래밍의 기초 › 01 데이터 입출력 (프그02-02와 통합) | 42쪽 |
| 씨마스(C) | C 프로그래밍의 기초 › 1 변수와 자료형 | 62쪽 |
| 웅보출판사(C) | 프로그래밍의 기초 › Chapter 01 변수와 자료형 | 61쪽 |