이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.

 

Python에서 기본적으로 제공하는 수

학교 수업을 들으면서 다음과 같은 이름을 가진 수를 들었을 수도, 듣지 않았을 수도 있다. 일단은 Python에서 기본적으로 제공하는 수의 종류는 다음과 같다.

  • 정수

-3, -1, 0, 1, 3처럼 소수부분이 없는 수를 정수라고 표현한다. 정수형을 표현하는 타입(Type)은 int이다. 정수를 뜻하는 영어인 integer의 맨 앞 3글자를 따온 것이다.

  • 실수

1.2, -3.2처럼 소수부분을 포함하는 수를 실수라고 표현한다. 실수형을 표현하는 타입은 float이다. 실수를 영어로 표현하면 real number인데 왜 float이라고 하느냐? 컴퓨터는 실수를 부동 소수점으로 표현하는데, 부동 소수점을 영어로 하면 floating point라고 한다.
부동 소수점이 뭐냐? 라는 의문이 들 수도 있지만, 굳이 지금 알아둘 필요는 없다. 대충 컴퓨터에서 표현하는 실수라고 생각하고 넘어가도 되고, 위키에서 부동 소수점에 대한 글을 읽고 넘어가도 된다.

실수로 표현할 수 있는 3.0은 정수의 3과 값은 똑같지만, Python은 두 수를 다른 타입으로 인식한다.

  • 복소수

a + bi 같은 식으로, 실수와 허수의 합의 꼴로 나타내는 수이다. 복소수를 표현하는 타입은 complex로, 복소수의 영어 표현인 complex number에서 따온 것이다.
다만 여러분이 수학적인 프로그래밍을 하지 않는 이상, 복소수를 쓸 일은 없을 것이다. 그냥 이런게 있다는 것만 알고 넘어가자. 앞으로도 정말로 특별한 일이 일어나지 않는 이상 이 수에 대해서는 다루지 않도록 한다.

 

수의 연산

숫자 사이에는 더하기나 빼기등 연산이 가능하다. 어떤 연산이 가능한지 알아보자.

 

  • 더하기 : +

가장 기초적인 연산중 하나이다. 두 수를 더한다.

2+3 = 5
1.2 + 3.4 = 4.6
  • 빼기 : -

역시 기초적인 연산중 하나이다. 두 수를 뺀다.

5-3 = 2
3.4 - 1.2 = 2.2
  • 곱하기 : *

초등학교 때도 배우는 연산이다. 두 수를 곱한다.

2*3 = 6
1.2 * 2.4 = 2.88
  • 나누기 : /

연산 자체는 초등학교 때도 배우는 연산이다. 이 연산에는 약간 특이한 점이 다. 연산의 결과는 부동소수점(float)이 된다는 것이다. 다음 연산들을 확인해보자.

6/3 = 2.0
6.0/3 = 2.0

정수 끼리의 연산이고, 나머지가 없어 소수점 표현이 필요 없는데도 소수 형태의 결과가 나오는 것을 알 수 있다.

  • 몫 구하기 : //

때로는 나눗셈의 몫만 취하고, 나머지 소수 점은 버리고 싶을 때가 종종 있을 수 있다. 이럴 때를 위하여 Python에서는 몫만 구할 수 있는 연산을 제공한다. 다음 연산들을 확인해보자.

6 // 3 = 2
6.0 // 3 = 2.0
5 // 2 = 2
5.0 // 2 = 2.0

정수끼리의 연산에서는 정수 형태의 결과를 돌려주지만, 부동소수점이 하나라도 포함 되어 있다면 부동소수점 형태의 결과를 돌려준다. 부동소수점 형태의 값으로 몫 연산을 수행한다 하더라도, 소수점은 항상 버린다.

  • 나머지 구하기 : %

때로는 나눗셈의 몫은 필요 없고, 나머지만을 구하고 싶을 때가 있을 수도 있다. 도대체 그게 왜 필요하지? 라는 생각이 들 수도 있으나, 은근 사용할 일이 있을 것이다. 그러면 다음 연산들을 확인해보자.

6 % 3 = 0
7 % 3 = 1
3.1 % 2 = 1.1

이 연산도 둘 중 하나라도 부동소수점이면 부동소수점 결과를 돌려준다.

위의 나눗셈과 관련된 연산들은 절대 0으로 나누면 안된다. 수학적인 의미로도 0으로 나누기는 존재하지 않듯이, Python에서 0으로 나누려고 시도한다면 예외(Exception)이라는게 발생하여 더 이상 코드를 실행할 수 없는 상태가 되므로 주의하자.

  • 지수 연산 : **

특정 수를 여러 번 곱하는 연산을 의미한다. 2 ** 4는 2를 4번 곱한다는 소리이다. 연산을 확인해보자.

3 ** 3 = 27
6 ** 2 = 36

 

연산자 우선순위

수학에서는 연산 우선순위가 있다. 그리고 Python에서도 연산 우선순위가 있다. 다음 연산들을 확인해보자.

2 * 3 ** 2 = 18
2 + 3 * 2 = 8
2 + 2 * 2 ** 2 = 10

첫 번째 연산의 경우, 3 ** 2 연산이 먼저 수행되기 때문에, 2 * 9 = 18이라는 결과가 나오게 된다.

두 번째 연산의 경우도 마찬가지로 3 * 2 연산이 먼저 수행되기 때문에, 2 + 6 = 8이라는 결과가 나오게 된다.

세 번째 연산의 경우, 2 ** 2 연산이 먼저수행되기 때문에 2 + 2 * 4가 되고, 곱하기를 먼저 하기 때문에 2 + 8이 되고, 최종 결과는 10이 된다.

지금까지 알아본 연산 우선순위는 다음과 같다.

**  >  *,/  >  +,-

지수 연산이 제일 먼저 이루어지고, 그 다음은 곱하기/나누기, 가장 나중에 이루어지는 것은 더하기/빼기 이다.

하지만 곱하기/나누기 보다 더하기/빼기를 먼저 하고 싶을 때가 있을 수 있다. 2와 3을 더한 다음, 2를 곱하고 싶을 때 처럼 말이다.

수학에서는 괄호를 이용해서 연산 우선순위를 바꿨다. Python에서도 마찬가지로 괄호를 이용하여 뭐 부터 연산을 수행할 지를 결정할 수 있다.

2 + 3 * 2 = 8
(2 + 3) * 2 = 10

위와 같이 괄호를 사용하면 2+3을 먼저 연산할 수 있게 된다.

 

Python에는 위에서 소개한 연산 말고도 수 많은 연산이 있다. 그리고 각각의 연산자 사이에는 우선순위가 존재한다. 외울 수 있으면 외워도 좋지만, 만약 조금이라도 헷갈리는 우선순위가 나온다면 망설이지 말고 괄호를 사용하도록 하자.

 

진법 (기수법)

24라는 숫자가 있다. 그런데 이 숫자를 11000, 30, 18로도 표현하는 경우가 있다. 도대체 어떻게 하면 24를 저렇게 표현하는 것일까?

수학에는 기수법이란 개념이 있다. 수를 나타내는 방법이라고 알면 된다.
10진법이니 2진법이니 하는 이야기를 들어본 적이 있을 수도 있고, 없을 수도 있다. 2진법2개의 숫자를 이용하여 수를 표현하는 방법이고, 10진법10개의 숫자를 이용하여 수를 표현하는 방법이다. (그리고 10진법은 우리가 일상생활에서 사용하는 기수법이기도 하다) 그러면 각 진법을 어떻게 쓰면 되는지 알아보자.

  • 10진법

기본이 10진법이다. 그냥 쓰면 된다.

>>> a = 12
>>> a
12
  • 2진법

숫자 앞에 0b또는 0B를 붙이면 된다. (숫자 0과 알파벳 b)

>>> a = 0b10
>>> a
2
  • 8진법

숫자 앞에 0o 또는 0O를 붙이면 된다. (숫자 0과 알파벳 o)

>>> a = 0o11
>>> a
9
  • 16진법

숫자 앞에 0x 또는 0X를 붙이면 된다. (숫자 0과 알파벳 X)

>>> a = 0x18
>>> a
24

숫자는 0에서 9까지밖에 없는데 10은 어떻게 표현할까? Python(뿐만 아니라 대부분 프로그래밍 언어들)은 이렇게 표현한다.

숫자 10진법 값
a 10
b 11
c 12
d 13
e 14
f 15

 

형변환(Casting)

특정 타입의 수를 다른 타입의 수로 바꾸고 싶을 때가 발생할 수 있다. 이럴 때 사용할 수 있는 것이 형변환이다.

int()를 통해 정수형으로 변환할 수 있고, float()을 통해 실수로 변환할 수 있다.

>>> a = int(3.2)
>>> a
3
>>> a = float(3)
>>> a
3.0

 

Categories:

Updated:

Comments