변수 선언
변수 할당
변수 참조
input()
int()
float()
str()
변수는 일반적으로 '변할 수 있는 자료'라고 생각하면 됩니다. 파이썬에서는 변수를 생성하는 그 자체가 사용하겠다고 선언하는 것입니다. 변수에는 모든 자료형의 값을 저장할 수 있습니다.
변수는 일반적으로 값을 저장할 때 사용하는 식별자 입니다. 수학자들이 3.14159262...라는 원주율 값을 ∏라는 기호로 정의해서 사용하는 것과 비슷합니다. 이를 파이썬에서는 pi라는 이름의 상자(저장공간)를 만든 후 pi 상자 내부에 값을 넣어 놨다가 필요할 때 이를 호출하여 사용합니다. 이때 pi를 '변수'라고 하며 숫자뿐만 아니라 모든 자료형을 저장할 수 있습니다.
간단하게 pi라는 이름의 변수를 만들어 사용해 볼까요? pi라는 이름의 저장 공간에 3.141592를 넣고 pi 라는 이름을 호출하면 저장 공간에 있는 값을 꺼내 출력합니다.
>>> pi = 3.14
>>> pi
3.14
변수를 활용하는 방법은 세 가지가 있습니다.
첫째, 변수를 선언하는 방법
변수를 생성하는 것을 의미합니다. 수학자들이 3.14라는 원주율 값을 𝜋
라는 기호로 정의 했듯이, pi를 "사용하겠다"라고 선언하는 것을 말합니다.
둘째, 변수에 값을 할당하는 방법
변수에 값을 넣는 것을 의미합니다. 𝜋=3.14
이듯이 변수로 사용하겠다고 선언한 pi에 값을 넣는 것, 즉 pi=3.14
를 말합니다. 이때 =
기호는 '같다'는 의미가 아니라 우변의 값을 좌변에 '넣겠다' '할당하겠다'를 의미합니다.
셋째, 변수를 참조하는 방법
변수에서 값을 꺼내는 것을 의미합니다. 원의 둘레를 구하는 공식은 2*𝜋*𝛾
이고, 원의 넓이를 구하는 공식은 𝜋*𝛾*𝛾
인데, 이때 𝜋
라는 값은 직접적으로 입력하지 않습니다. 𝜋
에 3.14...가 들어있는 것이라고 가정하는 것이죠. 즉 𝜋
라고 쓰면 이 안에 들어 있는 값을 쓰겠다는 의미인 거죠. 이처럼 변수 안에 있는 값을 사용하는 것을 '변수 참조'라고 합니다.
그러면 변수를 선언하고, 할당하고, 참조하는 형식에 대해 자세히 살펴보겠습니다.
변수를 사용하기 위해서는 변수를 선언해 주어야 하는데, 파이썬에서는 아래처럼 변수 이름을 적어 주면 그 자체로 사용하겠다는 선언을 하는 것입니다. 여기에 =을 입력하고 값을 입력하면 이것은 값을 변수에 할당하는 것이 됩니다.
변수 = 값 #값을 #변수에 할당합니다.
앞의 예시에서 입력한 pi=3.14
가 그것입니다.
>>> pi = 3.14 #3.14를 변수 pi에 저장합니다.
이렇게 선언한 변수를 사용하고 싶으면 '참조한다'고 했는데, 변수를 참조할 때는 참조할 위치에서 변수 이름을 아래와 같이 써 주면 됩니다.
변수
변수 + 변수
pirnt(변수)
앞의 예시에서 입력한 pi라는 숫자 자료에 이름을 붙인 것이기 때문에 숫자 연산을 모두 수행할 수 있습니다.
>>> pi = 3.14
>>> pi + 2
5.14
>>> pi - 2
1.14
>>> pi * 2
6.28
>>> pi / 2
1.57
>>> pi % 2
1.14
>>> pi * pi
9.8596
다만 pi 는 숫자 자료이기 때문에 숫자와 문자열을 연산하는 것은 당연히 안 됩니다.
pi + "문자열" #사용 불가함
pi에 저장한 값을 이용해 원의 둘레와 넓이를 구해보겠습니다. 𝛾은 반지름입니다.
소스코드 variable.py
#변수 선언과 할당
pi = 3.14159265
r = 10
#변수 참조
print("원주율 =", pi)
print("반지름 =", r)
print("원의 둘레 =", 2*pi*r)
print("원의 넓이 =", pi*r*r)
원주율 = 3.14159265
반지름 = 10
원의 둘레 = 62.831853
원의 넓이 = 314.159265
여기서 잠깐! 파이썬의 유연성
프로그래밍 언어 중 C, C++, 자바, C# 등에서는 기본적으로 변수를 사용할 때 변수의 자료형에 대해 미리 선언해 주어야 합니다.
- 자바, C의 경우
int pi #변수 pi를 사용하기 위해서 변수에 저장할 자료형을 선언합니다
그러나 파이썬은 다른 프로그래밍 언어와 다르게 변수에 자료형을 저장하지 않습니다. 따라서 같은 변수에 여러 종류의 자료형을 넣을 수도 있습니다.
- 파이썬의 경우
a = "문자열" #문자열 a = True #불 a = 10 #숫자
유연해서 좋다고 말할 수도 있겠지만, 오히려 이런 유연성 때문에 변수에 어떠한 자료형이 들어 있는지 모르고 실수해서 실행 중에 TypeError를 발생할 확률이 높습니다. 그러므로 하나의 변수에는 되도록 하나의 자료형을 넣어 활용하는 것이 좋습니다.
변수 내부에 들어 있는 자료의 연산자를 사용할 수 있습니다. 문자열이 들어 있으면 문자열과 관련된 연산자를 사용할 수 있으며, 숫자가 들어 있으면 숫자와 관련된 연산자를 사용할 수 있습니다. 그런데 변수를 활용하면 기존의 연산자와 조합해서 사용할 수 있는 연산자가 있습니다. 이를 복합 대입 연산자라고 부릅니다.
복합 대입 연산자는 자료형에 적용하는 기본 연산자와 = 연산자를 함께 사용해 다음과 같이 구성하는 연산자입니다.
a +=10
이렇게 a+=10
이라고 사용하면 a=a+10
이라고 하는 것과 같은 결과를 냅니다.숫자에 적용할 수 있는 다른 연산자들도 마찬가지의 방법으로 사용할 수 있습니다.
예를 들어 숫자에 적용할 수 있는 복합 대입 연산자는 다음과 같습니다.
연산자 이름 | 의미 | 예시 |
---|---|---|
+= | 숫자 덧셈 후 대입 | a += 10 (a = a + 10) |
-= | 숫자 뺄셈 후 대입 | a -= 10 (a = a - 10) |
*= | 숫자 곱셈 후 대입 | a *= 10 (a = a * 10) |
/= | 숫자 나눗셈 후 대입 | a /= 10 (a = a / 10) |
%= | 숫자 나머지를 구한 후 대입 | a %= 10 (a = a % 10) |
**= | 숫자 제곱 후 대입 | a **= 10 (a = a ** 10) |
간단한 예제를 살펴보겠습니다.
number = 100
number += 10 #110
number += 20 #130
number += 30 #160
print("number :", number)
number : 160
문자열도 마찬가지로 다음과 같은 복합 대입 연산자를 사용할 수 있습니다.
연산자 이름 | 의미 | 예시 |
---|---|---|
+= | 문자열 연결 후 대입 | a =+ b (a = a + b) |
*= | 문자열 반복 후 대입 | a *= n (a = a * b) |
문자열 복합 대입 연산자를 활용한 예제도 살펴보겠습니다.
# += 연산자 예시
>>> string = "안녕하세요"
>>> string += "!"
>>> string += "!"
>>>print("string :", string)
# 실행 결과
string : 안녕하세요!!
# *= 연산자 예시
string = "안녕하세요"
string *= 3
print("string : ", string)
#실행 결과
string : 안녕하세요안녕하세요안녕하세요
실무에서 프로그램을 만들 때는 명령 프롬프트에 글자를 입력하고 그 입력을 읽어 활용하는 경우가 드물지만, 프로그램을 공부하는 과정에서는 사용자로부터 입력을 받아 여러 가지 프로그램을 만들어 보는 것이 좋습니다. 파이썬은 명령 프롬프트에서 사용자로부터 데이터를 입력받을 때 input()
함수를 사용합니다.
사용자로부터 데이터를 입력받기 위해 다음 코드를 입력합니다. 이 때, input 함수 괄호 안에 입력한 내용을 프롬프트 문자열이라고 하며, 사용자로부터 입력을 요구하는 안내 내용을 포함합니다.
>>> input("인사말을 입력하세요>")
실행하면 다음과 같이 "인사말을 입력하세요>"라는 문자열이 뜨고 프로그램이 종료되지 않은 상태에서 대기가 됩니다. 이렇게 프로그램이 실행 도중에 잠시 멈추는 것을 블록이라고 하는데, input()
함수가 사용자에게 자료 입력을 교구하면서 코드 진행을 블록하고 있다고 할 수 있습니다.
인사말을 입력하세요> |
명령 프롬프트에서 실행하고 있다면 곧바로 "인사말을 입력하세요>" 옆에 "안녕하세요" 등의 글자를 입력하고 Enter
를 누릅니다.
인사말을 입력하세요> 안녕하세요 #Enter
'안녕하세요'
이렇게 사용자가 입력한 내용은 input 함수의 결과로 나오는데, 이 값은 다른 병수에 대입해서 사용할 수 있습니다. print()
함수를 사용해서 변수에 제대로 대입되었는지 확인해 보겠습니다.
>>> string = input("인사말을 입력하세요>")
인사말을 입력하세요> 안녕하세요 #Enter
>>> print(string)
안녕하세요
input과 같이 함수의 결과로 나오는 값을 리턴값이라고 합니다.
앞서 input()
함수의 결과를 string이라는 변수에 대입했는데, 대입한 값의 자료형이 어떻게 되는지 한번 알아볼까요? 자료형을 알아볼 때는 type()
함수를 사용합니다.
>>> print(type(string)
<class 'str'>
string 변수에는 "안녕하세요"라는 문자열을 입력해 대입했으니 당연히 자료형도 문자열이겠죠. 문자열임을 나타내는 'str'로 확인되었습니다.
다음 코드를 볼까요? 숫자를 입력하면 숫자가 출력된다는 것은 우리가 충분히 상상할 수 있습니다.
>>> number = input("숫자를 입력하세요>")
숫자를 입력하세요 >12345 #Enter
>>> print(number)
12345
그렇다면 자료형은 어떨까요?
>>> print(type(number))
<class 'str'>
input()
함수는 사용자가 무엇을 입력해도 결과는 무조건 문자열 자료형입니다. number에 대입한 12345도 'str'로 결과가 확인되었습니다. True나 False같은 불 값도 모두 문자열로 나옵니다.
소스코드 input.py
# 입력을 받습니다.
string = input("입력>")
# 출력합니다.
print("자료 :", string)
print("자료형 :", type(string))
# 실행 결과 1 (int data : 12345)
입력>12345
자료 : 12345
자료형 : <class 'str'> #숫자 데이터도 문자열 자료형으로 출력됨
# 실행 결과 2 (bool data : True)
입력>True
자료 : True
자료형 : <class 'str'> #불 데이터도 문자열 자료형으로 출력됨
한마디로 숫자를 입력해도 문자열로 들어온다는 의미입니다. 따라서 input()
함수로 자료를 입력받은 후 입력받은 것고 숫자를 더하는 코드를 작성하고 싶다면 다름과 같이 작성하면 문제가 발생합니다. 파이썬은 문자열은 문자열끼리 연산해야 하고, 숫자는 숫자끼리 연산해야 하기 때문입니다.
소스코드 input_error.py
# 입력을 받습니다.
string = input("입력>")
# 출력합니다.
print("입력 + 100:", string + 100)
# 실행 결과
입력>300
TypeError Traceback (most recent call last)
<ipython-input-9-3150e50fd969> in <module>
3
4 # 출력합니다.
----> 5 print("입력 + 100:", string + 100)
TypeError: can only concatenate str (not "int") to str
입력받은 값 300과 100을 더하고자 한 것이었으나 input()
함수로 입력받은 자료는 모두 문자열로 저장되므로 "300"+100이 되어 문자열과 숫자는 더할 수 없어 발생한 에러입니다. 입력받은 문자열을 숫자로 변환해야 숫자 연산자에 활용할 수 있다는 메세지입니다.
input()
함수의 입력 자료형은 항상 문자열이기 때문에 입력받은 문자열ㅇ르 숫자로 변환해야 숫자 연산에 활용할 수 있습니다. 영어로는 캐스트(cast)라고 부르는데, 영어로도 자주 언급되니 꼭 기억하세요.
문자열을 숫자로 변환할 때는 다음과 같은 함수를 사용합니다.
그럼 간단하게 예제를 통해 살펴보겠습니다.
소스코드 int_convert.py
string_a = input("입력A>")
int_a = int(string_a)
string_b = input("입력B>")
int_b = int(string_b)
print("문자열 자료:", string_a + string_b)
print("숫자 자료:", int_a + int_b)
# 실행 결과
입력A>123
입력B>45
문자열 자료: 12345
숫자 자료: 168
코드를 실행한 수 '입력A'의 값으로 123을 입력하고, '입력B' 값으로 45를 입력합니다. 변환하지 않은 상태에서 문자열 연산자 +가 적용되어 문자열을 연결한 12345를 출력하지만, 정수로 변환한 값에서는 123과 45를 덧셈하여 168이 출력됩니다.
이번에는 문자열이 int()
와 float()
함수를 통과하고 나면 정말 자료형이 바뀌는지도 살펴보겠습니다.
소스코드 int_float01.py
output_a = int("52")
output_b = float("52.123")
print(type(output_a), output_a)
print(type(output_b), output_b)
# 실행 결과
<class 'int'> 52
<class 'float'> 52.123
"52"와 "52.123"이었던 문자열이 52와 52.123이라는 int 자료형과 float 자료형의 숫자로 변환되는 모습을 확인할 수 있습니다.
이전 절에서 살펴보았던 input()
함수와 함께 조합하면 사용자에게 입력을 받아 숫자 연산을 하는 프로그램을 만들 수 있습니다. 간단하게 사용자에게 숫자 두 개를 입력받고, 입력받은 두 수의 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 하는 프로그램을 만들어 보겠습니다.
소스코드 int_float02.py
input_a = float(input("첫 번째 숫자>"))
input_b = float(input("두 번째 숫자>"))
print("덧셈 결과:", input_a + input_b)
print("뺄셈 결과:", input_a - input_b)
print("곱셈 결과:", input_a * input_b)
print("나눗셈 결과:", input_a / input_b)
# 실행 결과
첫 번째 숫자>123
두 번째 숫자>456
덧셈 결과: 579.0
뺄셈 결과: -333.0
곱셈 결과: 56088.0
나눗셈 결과: 0.26973684210526316
float()
함수를 사용했으므로 숫자를 입력할 때 소수점을 포함한 형태를 입력할 수 있습니다.
자료형을 변환할 때 '변환할 수 없는 것'을 변환하려고 하면 ValueError 예외가 발생합니다. 이러한 예외가 발생하는 경우는 다음 두 가지 입니다.
① 첫째, 숫자가 아닌 것을 숫자로 변환하려고 할 때
int("안녕하세요")
float("안녕하세요")
이와 같은 코드를 실행하면 곧바로 예외가 발생합니다. "안녕하세요"라는 문자열은 int()
함수로 변환할 수 없는 값이기 때문입니다. int()
함수와 float()
함수는 매개변수로 변환할 수 없는 형태가 들어가면 항상 오류를 발생시킵니다.
'직접 해보는 손코딩 int() 함수 활용하기' 소스코드 int_convert.py
를 실행한 후 '입력A'의 데이터를 입력할 때 "안녕하세요"라고 입력하면 이 자료는 아예 숫자로 변환할 수 없으므로 다음과 같은 에러 메시지를 보여줍니다.
소스코드 int_convert.py
에서 '입력A'에 문자 입력하기
string_a = input("입력A>")
int_a = int(string_a)
string_b = input("입력B>")
int_b = int(string_b)
# 실행 결과
입력A>안녕하세요
ValueError Traceback (most recent call last)
<ipython-input-20-42f86772c452> in <module>
1 string_a = input("입력A>")
----> 2 int_a = int(string_a)
3
4 string_b = input("입력B>")
5 int_b = int(string_b)
ValueError: invalid literal for int() with base 10: '안녕하세요'
② 둘째, 소수점이 있는 숫자 형식의 문자열을 int()
함수로 변환하려고 할 때
int("23.123")
int는 정수인데, 부동 소수점이 있는 자료를 정수로 바꾸라 하면, 이 또한 에러를 발생합니다.
'직접 해보는 손코딩 int() 함수 활용하기' 소스코드 int_convert.py
를 실행한 후 '입력A'의 데이터를 입력할 때 12.345라는 부동 소수점 자료를 입력하면 이 자료는 정수로 변환할 수 없으므로 다음과 같은 에러 메시지를 보여줍니다.
소스코드 int_convert.py
에서 '입력A'에 문자 입력하기
string_a = input("입력A>")
int_a = int(string_a)
# 실행 결과
입력A>12.345
ValueError Traceback (most recent call last)
<ipython-input-1-04c2a776dc85> in <module>
1 string_a = input("입력>A")
----> 2 int_a = int(string_a)
ValueError: invalid literal for int() with base 10: '12.345'
문제 해결
정수와 실수, 부동 소수점이 구분이 어렵다면 일단float()
함수를 사용한다고 기억해도 무방합니다.int()
함수는 부동 소수점 자료형을 정수로 변환하지 못하지만,float()
함수가 의미하는 실수는 정수도 포함하고 있기 때문에 정수, 실수 구분 없이 사용할 수 있습니다.
문자열을 숫자로 변환하는 것처럼 숫자를 문자열로 변환하는 것도 가능합니다. 사실 문자열로 변환하는 방법은 매우 다양하지만 여기서는 str()
함수를 사용하는 방법을 살펴보겠습니다.
str()
함수는 앞서 했던 int()
와 float()
함수와 비슷한 형태를 가집니다. 즉 다른 자료형의 값을 str()
함수의 매개변수에 넣으면 문자열로 변환됩니다.
str(다른 자료형)
예제를 통해 살펴보겠습니다.
소스코드 str()
output_a = str(52)
output_b = str(52.123)
print(type(output_a), output_a)
print(type(output_b), output_b)
# 실행 결과
<class 'str'> 52
<class 'str'> 52.123
숫자 52와 52.123이 str()
함수로 인해 문자열로 변환되었습니다.
변수 이름 = 값
연산자 | 내용 | 예시 |
---|---|---|
+= | 숫자 덧셈 후 대입 | a += 10 ( a = a + 10) |
-= | 숫자 뺄셈 후 대입 | a -= 10 ( a = a - 10) |
*= | 숫자 곱셈 후 대입 | a *= 10 ( a = a * 10) |
/= | 숫자 나눗셈 후 대입 | a /= 10 ( a = a / 10) |
%= | 숫자 나머지 구한 후 대입 | a %= 10 ( a = a % 10) |
**= | 숫자 제곱 후 대입 | a **= 10 ( a = a ** 10) |
함수 | 내용 |
---|---|
int() | 문자열을 int 자료형으로 변환 |
float() | 문자열을 float 자료형으로 변환 |
str() | 숫자를 문자열로 변환 |
str_input = input("숫자 입력 > ")
num_input = float(str_input)
print()
print(num_input, "inch")
print((num_input * 2.54 ), "cm")
# 실행 결과
숫자 입력 > 30
30.0 inch
76.2 cm
str_input = input("원의 반지름 입력 > ")
num_input = float(str_input)
print()
print("반지름 : ", num_input)
print("둘레 : ", 2 * 3.14 * num_input)
print("넓이 : ", 3.14 * num_input **2)
# 실행 결과
원의 반지름 입력 > 3
반지름 : 3.0
둘레 : 18.84
넓이 : 28.26
문자열 입력 > 안녕하세요 #Enter
문자열 입력 > 아침입니다 #Enter
안녕하세요 아침입니다
아침입니다 안녕하세요
단순하게 a와 b라는 이름의 변수로 입력을 받고 print(a,b)
와 print(b,a)
를 사용하면 이런 결과를 낼 수 있습니다. 그러나 이런 단순한 방법 말고 두 변수 안에 있는 값을 교체해서 출력해 보세요. 변수 교체를 스왑이라 부르는데, 중요한 프로그래밍 기술 중 하나입니다.
a = input("문자열 입력 > ")
b = input("문자열 입력 > ")
print(a,b)
c = b
a = b
c = a
print(a,b)
# 실행 결과
문자열 입력 > 홍차
우유 홍차
홍차 홍차
우유(a)와 홍차(b)의 내용물을 바꾸는 방법은 새로운 컵(C)로 할 수 있습니다.
a(우유) b(홍차) c(비었음)
a(우유) b(비었음) c(홍차)
a(비었음) b(우유) c(홍차)
a(홍차) b(우유) c(비었음) #우유와 홍차 변환 완료!
윤성인, 『혼자 공부하는 파이썬』, 한빛미디어(2019), p74-89.