Chapter02 자료형 (2-2 숫자)

2-2 숫자

#숫자 자료형 #숫자 연산자 #연산자 #우선순위

숫자는 수를 나타내는 글자입니다. 숫자는 수학 시간에 많이 접해 봤으므로 쉽게 이해할 수 있습니다. 파이썬에서는 숫자를 소수점이 없는 숫자와 소수점이 있는 숫자로 구분합니다.


시작하기 전에

소수점이 없는 숫자를 정수형이라 하고, 소수점이 있는 숫자를 실수형이라 합니다.

  • 소수점이 없는 숫자 : 0, 1, 273, -52 → 정수(integer)
  • 소수점이 있는 숫자 : 0.0, 52.273, -1.2 → 실수(floating point, 부동 소수점)

이때 주의할 점은 0은 소수점이 없는 숫자이고, 0.0은 소수점이 있는 숫자라는 것입니다. 같은 크기를 나타낸다 해도 소수점이 있느냐 없느냐에 따라 숫자의 자료형이 달라지기 때문에 주의해야 합니다.

또한 프로그래밍 언어를 하면서 반드시 알아 두어야 할 영어 단어가 있는데, 그것은 integer(정수)와 floating point(실수 또는 부동 소수점)입니다. '부동 소수점'이라는 단어가 생소할 텐데, 실수형의 경우 52.273을 0.52273x10의 제곱 과 같이 소수점의 위치를 바꿔도 국 같은 숫자이므로, '소수점이 움직이는 숫자'라는 의미로 부동 소수점이라고 표현하기도 합니다. 이 단어를 쉽게 기억하기 위해서 '소수점이 동동 부유하며 움직인다' 정도로 이해하겠습니다.


숫자의 종류

숫자를 만들려면 그냥 단순히 숫자를 입력하면 됩니다. print() 함수의 괄호 안에 숫자를 입혁하면 다음과 같이 출력합니다.

>>> print(123)
123
>>> print(53.123)
53.123

방금 숫자를 출력하면서 봤겠지만 숫자에는 두 가지 종류가 있습니다. '소수점이 없는 숫자'와 '소수점이 있는 숫자'입니다. 다음과 같이 소수점이 없는 숫자와 소수점이 있는 숫자를 type() 함수로 출력해 보겠습니다. type()은 괄호 안에 입력한 자료의 유형을 알려주는 함수라고 했습니다.

>>> print(type(52))
<class 'int'>
>>> print(type(52.123))
<class 'float'>

코드를 실행하니 <class 'int'><class 'float'>를 출력합니다. int는 integer의 앞 세 글자를 떼어낸 것으로 정수를 의미하며, float는 floating point의 앞 단어에서 가져온 것으로 부동 소수점(실수)을 의미합니다.

  • int(integer) : 정수
  • float(floating point) : 부동 소수점(실수)

다음 예시를 실행해 볼까요? 실행 결과를 보면 소수점이 찍혀 있는지에 따라 숫자의 종류가 달라지는 것을 확인할 수 있습니다. 똑같은 0을 나타내는 숫자지만 소수점이 없는 0은 정수이고, 소수점이 찍혀 있는 0.0은 부동 소수점(실수)를 나타냅니다.

>>> print(0)
0
>>> print(type(0))
<class 'int'>
>>> print(type(0.0))
<class 'float'>

이 개념이 중요한 이유는 일반적으로 프로그래밍 언어에서는 두 자료형을 구분해서 사용하기 때문입니다. 파이썬에서는 대부분의 경우 이를 구분할 필요가 없기는 하지만, 문자열 선택 연산자 [] 등을 사용할 때, 괄호 안에 넣는 숫자가 정수가 아니라 부동 소수점이면 오류가 발생하는 등의 미세한 차이가 있습니다. 따라서 파이썬에는 두 가지 종류의 숫자가 있다고 꼭 기억해주세요.

여기서 잠깐! 파이썬에서의 지수 표현
파이썬으로 만들어진 수학 연산 인공지능 알고리즘을 보면 0.52343e2 혹은 0.52343E2등의 숫자 표현을 볼 수 있습니다. 이는 파이썬에서 부동 소수점을 지수승으로 표현하는 방법입니다. 파이썬에서는 0.52343x10제곱을 이렇게 표현합니다.

>> 0.1234e2
12.34
>> 0.1234e-2
0.001234

숫자 연산자

문자열에 문자열 연결 연산자 또는 문자열 반복 연산자를 적용할 수 있던 것처럼 숫자에도 연산자를 적용할 수 있습니다. 어떤 연산자를 사용할 수 있을까요? 일상생활에서 숫자에 적용할 수 있는 연산자부터 떠올려 보겠습니다.

☑️ 사칙 연산자 : +, −, *, /

가장 기본적으로 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 사칙 연산자를 생각할 수 있습니다. 파이썬에서도 숫자에 이와 같은 사칙 연산자를 적용할 수 있습니다.

연산자설명구문
+덧셈 연산자숫자 + 숫자
뺄셈 연산자숫자 - 숫자
*곱셈 연산자숫자 * 숫자
/나눗셈 연산자숫자 / 숫자

아래 코드 예시를 들어보겠습니다.

>>> print("5 + 7 =", 5+7)
5 + 7 = 12
>>> print("5 - 7 =", 5-7)
5 - 7 = -2
>>> print("5 * 7 =", 5*7)
5 * 7 = 35
>>> print("5 / 7 =", 5/7)
5 / 7 = 0.7142857

☑️ 정수 나누기 연산자 : //

파이썬에는 //와 같은 형태의 연산자가 있습니다. 연산자 기호는 생소하지만, 이 또한 쉬운 개념의 연산자입니다. 이는 숫자를 나누고 소수점 이하의 자릿수를 떼어 버린 후, 정수 부분만 남기는 정수 나누기 연산자입니다. 간단하게 실행 결과를 살펴보겠습니다.

>>> print("3 / 2 =", 3 / 2)
3 / 2 = 1.5
>>> print("3 // 2 =", 3//2)
3 // 2 = 1

3/2는 1.5를 계산하지만 3//2는 1.5에서 소수점을 뗀 1만 결과로 나타내고 있습니다. // 연산자를 사용한 수식의 결과는 소수점 아래를 떼어 버린 값이 출력되는 것을 확인할 수 있습니다.

☑️ 나머지 연산자 : %

파이썬에는 나머지를 구하는 % 연산자가 있습니다. 나머지 연산자는 A를 B로 나누었을 때 남은 나머지를 구하는 연산자입니다.

>>> print("5 % 2 =", 5 % 2)
5 % 2 = 1

5를 2로 나누면 몫이 2이고 나머지가 1이므로 결과가 1이 출력됩니다.

☑️ 제곱 연산자 : **

파이썬에는 숫자를 제곱하는 ** 연산자가 있습니다. 수학에서 2에 4승은 파이썬에서 2**4로 씁니다. 제곱 연산자를 활용한 간단한 예시를 살펴보겠습니다.

>>> print("2 ** 1 =", 2 ** 1)
2 ** 1 = 2
>>> print("2 ** 2 =", 2 ** 2)
2 ** 2 = 4
>>> print("2 ** 3 =", 2 ** 3)
2 ** 3 = 8
>>> print("2 ** 4 =", 2 ** 4)
2 ** 4 = 16

연산자의 우선순위

연산자에는 우선순위가 존재합니다. 파이썬의 수식 또한 이 우선순위에 따라 계산되는데, 다음 계산 결과를 예측해 볼까요?

5 + 3 * 2

숫자를 계산할 때는 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선합니다. 따라서 3*2가 먼저 실행되고, 이후에 5를 더하게 됩니다. 따라서 결과는 11이 나옵니다. 파이썬도 마찬가지입니다. 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선합니다. 또한, 곱셈/나눗셈과 덧셈/뺄셈처럼 같은 우선순위를 가지는 연산자는 왼쪽에서 오른쪽 순서로 계산합니다. 직접 코드를 입력하면서 살펴보겠습니다. 코드를 입력하고 실행하기 전에 실행결과를 예측해보세요.

>>> print(2 + 2 - 2 * 2 / 2 * 2)
0.0
>>> print(2 - 2 + 2 / 2 * 2 + 2)
4.0

그럼 만약 5+3*2에서 5+3이 먼저 계산되도록 하려면 어떻게 해야 할까요? 이 또한 수학에서 했던 것과 마찬가지로 먼저 연산하고 싶은 부분을 괄호로 감싸줍니다.

(5 + 3) * 2

연산자 우선순위가 확실한 경우에도 다음과 같이 괄호로 감싸 주는 것이 좋습니다.

5 + (3 * 2)

☑️ TypeError 예외

서로 다른 자료로 연산하면 TypeError라는 예외가 발생합니다. 문자열과 숫자를 그대로 입력했을 때는 자료형을 눈으로 바로 확인할 수 있으므로, 서로 다른 자료를 연산하는 실수는 거의 없습니다. 하지만 다음 절에서 살펴보는 변수를 사용하면 내부에 무슨 자료가 들어 있는지 바로 확인할 수 없으므로, TypeError를 발생시킬 수 있습니다.

언제 발생하는 오류인지 확인하고, 오류가 발생했을 때의 대처 방법을 살펴보겠습니다.

>>> string = "문자열"
>>> number = 273
>>> string + number
TypeError: can only concatenate str (not "int") to str
#TypeError 오류 발생!

문자열과 숫자를 + 연산자로 연결했을 경우, 문자열은 + 연산자를 '문자열 연결 연산자'로 사용하려고 하고, 숫자는 + 연산자를 '덧셈 연산자'로 사용하려다 보니 충돌이 발생합니다.

좀 더 알아보기 : 문자열 연산자의 우선순위
문자열에 적용하는 연산자도 우선순위를 갖습니다. 일단 다음 코드의 실행 결과를 예측해 봅니다.

>> print("안녕" + "하세요" * 3)
# + 우선? "안녕하세요안녕하세요안녕하세요"

문자열 연결 연산자 + 가 우선한다면 괄호는 아래와 같이 감싸고 있는 형태이므로 "안녕하세요안녕하세요안녕하세요"를 출력할 것이고

>> print(("안녕" + "하세요") * 3)
# + 우선? "안녕하세요안녕하세요안녕하세요"

문자열 반복 연산자가 * 를 우선한다면 "안녕하세요하세요하세요"를 출력할 것입니다.

>> print("안녕" + ("하세요" * 3))
# * 우선? "안녕하세요하세요하세요"

코드 실행 결과 "안녕하세요하세요하세요"가 출력되었습니다.

>> print("안녕" + "하세요" * 3)
안녕하세요하세요하세요

따라서 문자열도 곱셈 연산자와 같은 * 기호가 우선한다는 것을 알 수 있습니다. 하지만 우선순위를 알더라도 괄호를 함께 작성해 주는 것이 좋습니다.

>> print("안녕" + ("하세요" * 3))

마무리

🔍 4가지 키워드 핵심 포인트

  • 숫자 자료형에는 소수점이 없는 정수형과 소수점이 있는 실수형(부동 소수점)이 있습니다.
  • 숫자 연산자에는 +, -, *, / 와 같은 사칙 연산자와 //(정수 나누기 연산자), %(나머지 연산자), **(제곱 연산자)가 있습니다.
  • 연산자에는 우선순위가 존재하는, ① 곱하기와 나누기가 우선이고, ② 더하기와 빼기가 다음으로 우선, ③ 잘 모를 때는 괄호를 쳐서 나타냅니다.

🔍 확인문제

1. 오른쪽의 예시를 보고 숫자 자료형을 나타내는 단어를 쓰세요.

단어예시
정수(int)1, 23, 0, 1234, -34
실수(float)0.0, 1.234, 2.45e2, 025.0

2. 숫자에 적용할 수 있는 연산자입니다. 의미를 보고 왼쪽 연산자 항목에 기호를 써 보세요.

연산자.의미
+덧셈 연산자
-뺄셈 연산자
*곱셈 연산자
/나눗셈 연산자
//정수 나누기 연산자
%나머지 연산자
**제곱 연산자

3. 다음 프로그램의 실행결과를 예측해 보세요.

print("# 기본적인 연산")
print(15, "+", 4, "=", 15 + 4)
print(15, "-", 4, "=", 15 - 4)
print(15, "*", 4, "=", 15 * 4)
print(15, "/", 4, "=", 15 / 4)

# 기본적인 연산
15 + 4 = 19
15 - 4 = 11
15 * 4 = 60
15 / 4 = 3.75

4. 3462를 17로 나누었을 때의 몫과 나머지를 구하는 프로그램입니다. 빈칸을 채워 완선해 주세요.

print("3462를 17로 나누었을 때의")
print("- 몫 :", 3462//17)
print("- 나머지 :", 3462%17)

346217로 나누었을 때의
-: 203
- 나머지 : 11

5. 다음 코드의 실행결과를 예측해 주세요. (괄호 안쓰면 이렇게 된다...)

print(2 + 2 - 2 * 2 / 2 * 2)
0
print(2 - 2 + 2 / 2 * 2 + 2)
2

#괄호 사용
print(2 + 2 - ((2 * 2) / (2 * 2)))
print(2 - 2 + ((2 / 2) * 2) + 2)

윤성인, 『혼자 공부하는 파이썬』, 한빛미디어(2019), p64-72.

좋은 웹페이지 즐겨찾기