정수 자료형
1. 정수란?
정수는 0과 양의 정수, 음의 정수를 모두 포함하는 수를 말합니다. 파이썬에서 정수는 인트(int
)라는 이름으로 표현됩니다.
1.1 정수 타입의 변수 생성
이 예제에서 x
, y
, z
는 각각 10, -5, 0이라는 정수 값을 가지게 됩니다. 파이썬에서는 소수점이 있으면 정수로 구분하지 않으니 이를 주의해주세요. 10과 10.0은 다른 타입입니다.
1.2 정수의 사칙연산
정수는 기본적인 산술연산을 지원합니다. 이 챕터에서는 간단한 사칙연산만 해보도록 하겠습니다. 값을 바꾸어서 실행해보세요.
1.2.1 덧셈
1.2.2 뺄셈
1.2.3 곱셈
1.2.4 나눗셈
나눗셈은 두 종류가 있습니다. 하나는 나눗셈의 결과를 소숫점까지 표시하는 것이고, 다른 하나는 나눗셈을 하고 나머지를 버리는 것입니다. 아래 코드를 실행시켜보세요.
2. 진수
Python에서는 10진수 외에도 2진수, 8진수, 16진수로 정수를 표현할 수 있습니다. 아래 10진수와 2진수가 표현되는 방법을 기술하였습니다.
2진수 연산은 알고리즘 문제로 간혹 출제 됩니다. 16진수는 컴퓨터에서 색 표현으로 많이 사용합니다. #000000
은 흰색이고, #ffffff
는 검은색입니다. 8진수는 거의 사용되지 않습니다. 진수 변환이 실무에서 자주 사용되는 개념은 아니기 때문에, 해당 내용은 실제 프로젝트를 진행하며 필요할 때 찾아보시는 것을 권합니다.
2.1 2진수 (Binary)
2진수는 0과 1로만 구성되며, Python에서는 숫자 앞에 0b
를 붙여서 2진수로 표현합니다.
이 예제에서 x
는 2진수 110을 10진수로 변환하여 6이 출력됩니다. type(x)
는 <class 'int'>
로, x
의 데이터 타입이 정수임을 확인할 수 있습니다.
2.2 8진수 (Octal)
8진수는 0부터 7까지의 숫자로 구성되며, Python에서는 숫자 앞에 0o
를 붙여서 8진수로 표현합니다.
이 예제에서 x
는 8진수 15를 10진수로 변환하여 13이 출력됩니다. type(x)
는 <class 'int'>
로, x
의 데이터 타입이 정수임을 확인할 수 있습니다.
2.3 16진수 (Hexadecimal)
16진수는 0부터 9까지의 숫자와 A(10)부터 F(15)까지의 알파벳으로 구성되며, Python에서는 숫자 앞에 0x
를 붙여서 16진수로 표현합니다.
이 예제에서 x
는 16진수 1a를 10진수로 변환하여 26이 출력됩니다. type(x)
는 <class 'int'>
로, x
의 데이터 타입이 정수임을 확인할 수 있습니다.
2.4 진수 변환 함수
Python에서는 bin()
, oct()
, hex()
함수를 사용하여 10진수를 각각 2진수, 8진수, 16진수로 변환할 수 있습니다.
이 예제에서 x
는 26이고, bin(x)
는 '0b11010', oct(x)
는 '0o32', hex(x)
는 '0x1a'를 출력합니다. 이렇게 변환된 값은 int 내장함수(built-in-function
)을 사용하여 10진수로 다시 변환할 수 있습니다.
출력값은 모두 26입니다.
3. 메서드(Method)
메서드는 특정 자료형(정수, 실수, 문자열, 리스트 등)이 가지고 있는 고유한 기능입니다. 예를 들어, 문자열 자료형은 문자열을 대문자로 변환하는 기능을 가지고 있습니다. 이러한 기능을 수행하는 함수
를 메서드
라고 부릅니다.
그러나 숫자 자료형에서 사용할 수 있는 메서드는 많지 않으며, 실제로 자주 사용되지도 않습니다. 따라서 이후에 다룰 float와 complex 자료형에서는 메서드를 자세히 다루지 않겠습니다.
예를 들어, 위 출력된 메서드 중 bit_count
메서드를 살펴보도록 하겠습니다.
5는 2진수로 표현했을 때 101
이고, 4는 2진수로 표현하면 100
입니다. 여기서 1의 갯수를 카운팅한 것입니다.
메서드를 모두 암기할 필요는 없습니다. 평생 한 번도 사용하지 않는 메서드도 다수입니다. 다만 한 번은 전체 목록으로 살펴볼 필요가 있습니다. 어떤 메서드가 있다는 것을 알고 있다면, 필요할 때 찾아서 사용할 수 있습니다.
4. 인티저 인터닝
파이썬은 다른 언어에 비해 느린 속도를 극복하기 위해 버전 업데이트마다 다양한 노력을 기울여 왔습니다. 그 중 하나로, 파이썬은 메모리 효율을 위해 자주 사용되는 정수를 미리 메모리에 저장(integer interning)해두고 있습니다. 이렇게 저장된 정수가 나중에 혼란을 줄 수 있기에 여기서 설명하고자 합니다.
# -5 ~ 256
x = 256
y = 256
print(id(x), id(y)) # 출력 : 138041748299984 138041748299984
# -5 ~ 256
x = 256
y = 256
print(id(x), id(y)) # 출력 : 138041748299984 138041748299984
위 코드에서 x와 y는 같은 값을 가지고 있습니다. 일반적으로 id(x)
와 id(y)
는 다른 값을 가져야 합니다. 아래 그림처럼요. 이는 대부분의 언어와 파이썬에서도 마찬가지입니다. 하지만 여기서 x가 가리키고 있는 값이 256이기 때문에 별도의 공간을 생성하지 않습니다. 이 경우가 특수한 경우라는 점을 기억해 주세요.
두 변수의 id를 출력하면 같은 값이 나옵니다. 이는 두 변수가 같은 메모리 주소를 가리키고 있다는 의미입니다. x가 저장되어 있는 주소는 135820895846448로 출력되며, 이 값은 개인마다 다를 수 있습니다. 이처럼 메모리에 미리 적재되는 숫자의 범위는 -5부터 256까지입니다. 이 범위에 해당하는 숫자는 아래 그림과 같이 표현할 수 있습니다.
하지만 이 범위를 벗어나면 아래와 같은 그림이 됩니다. 이는 id 값이 다른 것으로 확인할 수 있습니다. 위 예제 코드에서 x와 y의 값을 1000으로 변경해 보면 두 값의 id가 다르게 나오는 것을 확인할 수 있습니다. 다만 위니북스에서는 다른 실행 결과가 나오기 때문에 실행 버튼을 활성화하지 않았습니다. 구글 코랩에서 직접 확인해 보시기 바랍니다.
# -5 ~ 256
x = 1000
y = 1000
print(id(x), id(y))
# -5 ~ 256
x = 1000
y = 1000
print(id(x), id(y))
기본적으로 위와 같이 변수가 생성된다는 사실과 예외 사항을 기억해 주세요. 그렇지 않으면 이 개념이 나중에 크게 혼란을 줄 수 있습니다.
다시 한 번 강조하자면, 변수에 값을 할당하면 예외 사항이 있지만 기본적으로는 서로 다른 메모리 주소를 가집니다.
파이썬 쉘과 코랩에서는 -5 ~ 256이 적재되지만, .py파일로 만들어서 실행시키면 이미 선언된 변수는 파이썬 컴파일러에 의해 일부 재활용합니다.