- 프롤로그
- 개발 첫걸음
- 파이썬 기초
- 파이썬 중급
- 파이썬 고급
- 내장 함수 톺아보기
- 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
- 변수의 범위 – 이름 검색의 범위
- 파이썬 심화
- 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
- 데코레이터 – 함수의 기능을 강화하기
- 프로퍼티
- 제너레이터
- async와 await
- 객체로서의 클래스 – 클래스를 동적으로 정의하기
- 파이썬 프로젝트 실습
- 원카드 게임 만들기 (1)
- 원카드 게임 만들기 (2)
- 원카드 게임 만들기 (3) (작성중)
- 턴제 자동 전투 게임 만들기 (작성중)
- 실전 (파이썬 외적인 것들)
- 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
- 유니코드 – 컴퓨터에서 문자를 표기하는 방법
- html, css, 인터넷 – 자동화 첫 걸음 내딛기
- 네트워크 – 인터넷으로 통신하는 방법
- 문서 – 문맥을 읽어보기
변수의 필요성
우리는 이전에 사용자로부터 입력을 받았습니다. 바로 input()
으로요. 그런데 우리가 입력을 받는 이유는 무엇일까요? 사용자로부터 유의미한 정보를 갖고와서 적절하게 가공하고 처리하여 결과를 내놓기 위함입니다. 그러한 정보, 즉 데이터(값)을 다루기 위해서는 그것을 기억하고 있어야 합니다. 단순히 input()
하면 사용자가 입력할 수 있기만 하지, 그 입력한 값들은 공중분해됩니다. 이제, 변수가 등장합니다. 변수는 우리들에게 값을 기억하고 저장할 수 있는 메커니즘을 제공합니다.
변수(variable)
변수(variable) 는 값(데이터)에 붙이는 특별한 이름(name) 입니다. 변수를 사용하기 위해서는 정의(define) 되어야 합니다. 변수를 변경하려면 값을 대입(할당, assignment) 하면 됩니다.
이번 강좌도 마찬가지로 갖가지 개념과 용어가 동시에 등장합니다. 우선 가벼운 마음으로 죽 읽고, 다시 처음부터 읽는 걸 권장드립니다.
백문이불여일견, 예시를 보면서 바로 이야기를 나누어 봅시다. ##1##를 누르면 설명으로 이동합니다.
- 실행 코드
person = input() ##a_1##
print(person) ##a_2##
PS C:\Users\tooth> & C:/Users/tooth/AppData/Local/Programs/Python/Python37-32/python.exe c:/Users/tooth/Desktop/py.py
하이
하이
PS C:\Users\tooth>
첫번째 하이는 사용자가 직접 입력한 것이고, 두번째 하이는 그대로 출력된 것입니다.
실행 코드를 살펴보면서 천천히 설명하도록 하겠습니다.
a_1(1.) person = input()
등호(=
)가 등장했습니다. 이렇게 등호가 등장하는 줄 하나를 가리켜 대입문이라고 합니다. 대입이라는 사건이 일어나는 문장이라는 뜻이죠. 수학에서의 등호 뜻은 ‘같다’라는 뜻인데요, 수학에서의 뜻은 완전히 잊으셔야 합니다. 여기서의 등호(=
)는 오른쪽의 값을 왼쪽의 변수와 연결시키겠다는 뜻입니다.
등호를 기준으로 오른쪽을 먼저 살펴봅시다. 오른쪽에는 우리가 이전 시간에 사용했던 input()
이 등장했습니다. input()
기능이 무엇인지 기억나시나요? 바로 사용자로부터 입력을 받는다는 것이죠. 파이썬 인터프리터는 대입문을 만나게 되면 등호의 오른쪽을 먼저 처리하기 때문에, input()
이 먼저 실행되면서 프로그램이 사용자의 입력을 받기 위해 멈추게 됩니다. 우리가 커서를 콘솔 창으로 옮겨서, 영단어나 한글 무엇이든 좋습니다. 아무거나 써 넣어보자구요. Enter를 누르면 프로그램이 재개됩니다. 프로그램이 재개되면 input()
은 우리가 쓴 단어를 내뱉습니다. 그러니까, 우리가 하이
라고 적어서 엔터를 눌렀다면, person = input()
이 person = '하이'
로 바뀐다는 뜻이지요.
이제 등호를 기준으로 왼쪽을 살펴보겠습니다. person
이 등장했습니다. 이 person
은 파이썬 인터프리터 입장에서는 낯섭니다. 특별한 문법이 아니기 때문입니다. 그냥 우리가 임의로 적어놓았을 뿐인 단어인 셈이죠. person
이나 hi
나 melon
이나 적는 건 우리 마음입니다. 이러한 낯선 단어를 파이썬 인터프리터가 접하게 되면, 이를 변수의 이름(name)으로 인식하게 됩니다. person
은 이전 단계에서는 한 번도 쓰이지 않았고, 여기서 처음 쓰이게 된 셈인데, 변수의 이름이 처음 쓰이는 순간 대입문(=
)의 왼쪽에 있음으로써 정의(define) 될 수 있습니다. 변수가 정의된다면 이 변수와 연결되는 값은 ‘하이’가 되면서 이후에 우리가 재사용할 수 있게 됩니다.
저번 시간에서는 한 줄에 하나씩 명령이 차례대로 실행한다고 배웠습니다. 하지만 그 한 줄 내에서도 실행 순서가 명확히 정해져 있습니다. 이러한 순서와 관련된 내용은 중급 과정까지 전부 배운 이후에 표현식(expression)(추가 예정) 관련 개념을 익힐 때 자세히 살펴보도록 합니다.
a_2(2.) print(person)
print
는 화면에 문자를 출력하는 기능을 담당합니다. 여기에 우리가 직접 '안녕하세요'
와 같이 값을 넘겨주는 게 아니라 person
이라고 넘겨주었습니다. person
은 우리가 앞서 정의했던 변수입니다. 그래서 print
는 person
에 연결된 값을 읽으려 합니다. person
은 바로 이전의 대입문을 통해 '하이'
라는 값과 연결되어 있는 상태이지요. 즉, print('하이')
가 되어 하이
라고 출력하게 되는 것입니다.
대입(assignment)
대입(assignment) 이란 앞서 설명했듯이 등호(=
)를 통해 오른쪽에 있는 값과 왼쪽에 있는 변수를 연결시킨다는 뜻입니다. 그리고 그 등호가 등장하는 줄 하나를 가리켜 대입문이라고 합니다.
변수에 값을 대입해야 비로소 변수를 이용할 수 있기 때문에 변수와 대입은 절대 떨어질 수 없는 관계입니다. 대입은 무조건 오른쪽에서 왼쪽으로 움직입니다. 하지만 만약 다음과 같이 순서를 바꾸게 되면 어떤 일이 일어날까요?
- 실행 코드
person = 'abc'
'abc' = person
- 결과
File "c:/Users/tooth/Desktop/py.py", line 2
'abc' = person
^
SyntaxError: can't assign to literal
두번째 줄에서 구문 에러가 일어났습니다. person
을 'abc'
에 대입하려다 에러가 난 모양입니다. "리터럴에는 할당할 수 없습니다." 라는 게 에러 메시지네요. 리터럴은 무엇일까요? 그것은 조금 어려운 내용이므로 이후로 미룹시다. (추가 예정) 어쨌건 왼쪽에는 무조건 값이 아니라 변수가 있어야 합니다.
선언, 정의, 초기화
냉혹한 프로그래밍의 세계에서는 일반적으로 변수를 다룰 때 함께 이야기되는 것이 선언(Declaration), 정의(Definition), 초기화(Initialization) 입니다. 이것은 변수를 설정할 때 어떤 세부적인 단계로 설정할지에 관한 내용입니다. 쉽게 풀이해서 이야기하자면 다음과 같습니다.
- 선언 : 내가 이 변수를 지금부터 사용할 생각이야.
- 정의 : 이 변수의 내용은 ~~~ 로 구성될 거야.
- 초기화 : 이 변수의 최초 값은 ~~~ 로 할게.
아이고, 말장난 같습니다. 놀랍게도 파이썬이 아닌 C++ 등의 다른 프로그래밍 언어에서는 세 가지 모두 다른 의미를 가지고 있고, 적시적소에 활용되어야 하지만, 파이썬에서는 전혀 신경쓸 필요가 없습니다. 파이썬에서 세 가지는 거의 동시에 이루어지기 때문입니다.
person = 'abc'
이 한줄로 우리는 "야, 지금부터 내가 person
이라는 변수를 사용할 거야. 이 변수는 문자열을 가지고 있고 값은 'abc'
이니까, 잘 알아둬." 라고 말하며 선언, 정의, 초기화를 동시에 진행했습니다. 그래서 파이썬에서는 선언, 정의, 초기화를 동일한 뜻으로 사용하여도 무방합니다. 등호(=
)가 등장하는 줄은 대입문이라고 이야기했습니다. 즉, 초기화를 대입으로 진행한 것이죠.
프로그래밍의 세계에서는 이 세 가지 용어가 아주 흔하게 사용됩니다. 실제로 아래 스크린샷과 같이 인터넷에 파이썬 변수 정의
라고 검색해보면 해당 용어들이 혼용된다는 걸 아시게 될 것입니다.
앞으로 우리는 변수를 새롭게 만들 때 선언이나 초기화라는 용어는 사용하지 않고 정의만을 사용하도록 하겠습니다.
변수를 정의하는 유일한 방법
person
Traceback (most recent call last):
File "c:/Users/tooth/Desktop/py.py", line 1, in <module>
person
NameError: name 'person' is not defined
파이썬에서 변수를 정의하는 유일한 방법은 대입문을 쓰는 것입니다. 대입문을 이용하지 않고서는 변수를 정의하는 방법은 없습니다. 위 예제처럼 값을 대입하지 않고 그냥 person
이라는 이름만 쓴다면, 파이썬 인터프리터는 이전에 정의했던 변수 중 person
을 찾으려고 합니다. 하지만 정의해 놓은게 없으니 에러가 뜹니다. person
이 not defined
, 즉 정의되지 않았다는 뜻입니다.
변수 활용 예제
몇 가지 예제만 더 보고 진행하겠습니다.
차례대로 진행됩니다
print(hello)
hello = '하이'
Traceback (most recent call last):
File "c:/Users/tooth/Desktop/py.py", line 1, in <module>
print(hello)
NameError: name 'hello' is not defined
프로그램은 위에서 차례대로 내려가므로, 첫째 줄, print
함수의 시점에서는 hello
가 아직 정의되지 않았습니다. 그러므로 에러입니다.
기존에 있던 값은 사라집니다.
person = 'Kim Bo Ram'
person = 'Park Bo Young'
print(person)
Park Bo Young
person
에 'Kim Bo Ram'
이라는 값을 넣었습니다. 하지만 그 직후, ‘Park Bo Young’이라는 값을 또 넣었습니다. 그렇다면 'Kim Bo Ram'
은 어떻게 되는 것일까요? 그냥 사라집니다. 기존에 값이 있었던 변수에게 재차 대입한다면 기존의 값은 사라집니다.
변수에 변수를 대입하기
hello = 'hi'
person = hello
print(person)
hi
변수를 정의하거나 대입할 때 또 다른 변수를 활용할 수 있습니다. 두 번째 줄을 유의해주세요. person = hello
라고 되어 있습니다. 이 줄은 hello
에 있는 값을 불러와서 person
에게 대입시키겠다 라는 뜻입니다. 그렇다고 hello
가 값을 person
에게 퍼주어서 hello
가 빈털털이가 되는 것은 절대 아닙니다. hello
는 여전히 'hi'
를 가지고 있고, person
또한 hello
와 같은 문자열 값을 갖게 됩니다.
변수와 문자열 값의 구분
hello = 'hi'
print('hello')
print(hello)
hello
hi
print
함수 내부에 따옴표('
)가 들어간 것과 들어가지 않은 것의 차이를 보여줍니다. 따옴표는 따옴표 안에 있는 문자들을 문자열 값으로서 사용하겠다는 뜻을 가지고 있으며, 파이썬 문법의 당당한 일원입니다. 그러므로 'hello'
는 문자열 값으로서의 'hello'
를 뜻합니다. 반면 첫째 줄에서 우리는 hello
라는 이름을 가진 변수를 정의하였고, 이 변수는 'hi'
라는 값을 가지고 있습니다. 따옴표가 없는 print(hello)
는 hello
변수를 이용하겠다는 뜻이므로 hi
를 출력합니다.
변수의 값 뒤바꾸기 예제
hello = 'hi'
person = 'Park Bo Young'
hello = person
person = hello
print(hello)
print(person)
Park Bo Young
Park Bo Young
hello
값과 person
값을 뒤바꾸고 싶어서 서로 대입했습니다. 하지만 결과는 의도와는 다르네요. 두개 다 'Park Bo Young'
값을 가지고 있습니다. 원인은 무엇일까요?
hello = person
이 실행되는 순간 hello
는 person
의 값이었던 'Park Bo Young'
을 가지게 되었습니다. hello
와 person
이 같은 값을 가지게 되었고, 'hi'
값은 공중분해되었죠. 그러므로 person = hello
에서 또한 다 같은 'Park Bo Young'
을 갖게 된 것입니다.
진행상황을 시각화하면 다음과 같습니다.
값을 바꾸려면 변수를 하나 더 쓰거나, 파이썬의 또 다른 문법을 사용하면 됩니다.
- 또 다른 변수 하나 더 쓰기
hello = 'hi'
person = 'Park Bo Young'
temp = hello
hello = person
person = temp
print(hello)
print(person)
Park Bo Young
hi
이를 시각화하면 다음과 같습니다.
- 파이썬의 특별한 문법 활용하기
hello = 'hi'
person = 'Park Bo Young'
hello, person = person, hello
print(hello)
print(person)
Park Bo Young
hi
변수의 종류
변수는 여러가지 종류가 있습니다. 이른바 변수의 타입(type) 이라고 합니다. 타입 자체에도 엄연한 이름이 존재하고, 아주 많은 종류가 있습니다. ‘변수’라는 이름에 얽매여 꼭 변수가 숫자를 가지고 있다고 생각할 수도 있는데, 그것은 옳지 않습니다. 앞서 살펴보았던 예제에서는 변수에 문자열을 잘 대입하곤 했습니다. 기초 단계에서 많이 쓰이는 타입 네 가지를 소개합니다.
int
: 정수입니다.-5
,0
,10
등의 값을 가질 수 있습니다.float
: 실수입니다.-2.5
,0.0
,10.8
등의 값을 가질 수 있습니다.str
: 문자열(string)입니다. 우리가 지금껏 사용했던 변수입니다. 문자가 하나든, 여러 개든 문자"열"로 취급합니다.'안녕하세요'
와 같은 값을 가질 수 있습니다.bool
: 불리언(boolean)입니다.True
혹은False
값 밖에 가지지 못합니다.
int
, float
은 우리가 다음 시간에 값을 계산할 때 유용하게 사용될 수 있는 변수입니다. bool
은 우리가 다다음 시간에 조건문을 통해 프로그램의 흐름을 만들고 싶을 때 유용합니다. 차례대로, 천천히 배워나가봅시다.
변수 이름 규칙
변수의 이름을 만들 때에도 일정한 규칙이 있습니다. 변수는 앞으로도 수없이 활용하므로 변수 이름 규칙은 꼭 암기하고 있도록 합니다.
- 변수 이름에는 알파벳 대소문자, 숫자, 언더바(_)만 사용할 수 있습니다. 즉 공백(
), 특수문자 등은 사용할 수 없습니다.
- 예약어로는 사용이 불가능합니다.
- 알파벳 대소문자는 서로 구분됩니다. 즉
hello
와Hello
는 다른 변수입니다. - 변수 이름은 숫자로 시작할 수 없습니다.
1person
는 잘못된 변수명입니다.person1
은 문제 없습니다.
예약어(keyword)
예약어란 문법으로 사용되는 단어입니다. 이미 문법적인 뜻이 정해져서 다른 용도로는 사용할 수 없기 때문에 이미 예약되었다 하여 예약어로 불립니다. 키워드라고도 합니다. 우리가 변수명으로 사용할 수 없습니다.
이 예약어들은 앞으로도 차차 배울테니 어떤 예약어가 있는지 외울 필요는 전혀 없습니다. 배운 적 없는 예약어라도, Visual Studio Code를 쓰고 있다면 예약어를 작성했을 때 텍스트의 색깔이 찬란하게 변하는 것을 확인할 수 있으니 그 때마다 수정해주면 됩니다. 예약어의 종류는 다음 링크를 참조해주세요.
https://www.w3schools.com/python/python_ref_keywords.asp
문자열 값(str
변수)의 표기
지금까지는 작은따옴표로만 문자열을 표기했습니다. 'abc'
이렇게요. 하지만 쌍따옴표도 똑같은 역할을 합니다. "abc"
는 'abc'
와 동일합니다.
상수?
상수란 변수의 반대 개념으로, 변하지 않는 수를 뜻합니다. 변하지 않는 수는 왜 필요할까요? 수학 공식을 정리한 모듈이 있다고 가정합시다. 이 모듈에는 수학의 파이 값을 이용합니다. 파이는 무리수이므로 완전히 표현될 수는 없기에 컴퓨터에서는 3.141592.. 의 유한한 소수로서 정해놓습니다. 하지만 실수로 인해 파이 값이 3.5로 변경된다면 어떻게 될까요? 모든 공식의 결과가 엉망진창이 되고 말 것입니다.
프로그램을 만들다 보면 이처럼 변하면 안되는 수나 값이 존재하기 마련입니다. 하지만 파이썬에서는 프로그래밍 언어 차원에서 상수를 지원하지 않습니다. 모든 변수는 프로그래머가 값을 대입한다면 값이 변합니다. 다만 프로그래머 사이의 암묵적인 약속으로서, 대문자로만 이루어진 변수명으로 "이 값을 변경하지 않았으면 좋겠습니다~~"
라는 메시지를 전파할 수 있습니다. 우리나라는 부가가치세가 10%인데, 왠만해서 바뀔 일이 없으니 VAT = 0.1
이렇게 정의하여 다른 프로그래머 뿐만 아니라 미래에 이 코드를 보는 나 자신에게도 "왠만하면 대입문으로 값을 변경하지는 마세요~~"
라는 메시지를 전달할 수 있는 것입니다.
연습 문제
- 대입문이란 무엇인가?
NameError: name 'person' is not defined
이 에러의 뜻은 무엇인가?- 변수의 기초 타입 4가지는 무엇인가?
- 변수를 정의할 유일한 방법은 무엇인가?
- 변수의 이름 규칙 4가지는 무엇인가?
- 문자열 값을 표기할 수 있는 두 가지 방법은 무엇인가?
- 파이썬 인터프리터가 대입문을 만나면 왼쪽과 오른쪽 중 어느 것을 먼저 처리하는가?
- 대입할 때 등호(
=
) 왼쪽에는 무엇이 와야 하는가? - 상수의 뜻은 무엇인가? 파이썬에서는 상수 기능이 없다. 하지만 프로그래머 사이의 관례는 있다. 무엇인가?
프로그래밍 문제
-
c라는 변수를 정의하세요. 값은 13을 가지고 있습니다.
-
다음 결과를 그림을 그려서 예측하세요.
a = 'hi'
b = 'no'
c = b
b = a
d = c
c = b
print(d)
print(c)
프로그래밍 문제 정답
-
c = 13
- 프롤로그
- 개발 첫걸음
- 파이썬 기초
- 파이썬 중급
- 파이썬 고급
- 내장 함수 톺아보기
- 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
- 변수의 범위 – 이름 검색의 범위
- 파이썬 심화
- 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
- 데코레이터 – 함수의 기능을 강화하기
- 프로퍼티
- 제너레이터
- async와 await
- 객체로서의 클래스 – 클래스를 동적으로 정의하기
- 파이썬 프로젝트 실습
- 원카드 게임 만들기 (1)
- 원카드 게임 만들기 (2)
- 원카드 게임 만들기 (3) (작성중)
- 턴제 자동 전투 게임 만들기 (작성중)
- 실전 (파이썬 외적인 것들)
- 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
- 유니코드 – 컴퓨터에서 문자를 표기하는 방법
- html, css, 인터넷 – 자동화 첫 걸음 내딛기
- 네트워크 – 인터넷으로 통신하는 방법
- 문서 – 문맥을 읽어보기