숫자형 변수는 정수, 소수점 등을 저장할 수 있느 데이터 타입입니다.
정수형 데이터를 저장하고 그 값을 출력해봅니다.
코드:
a = 10
b = -5
c = 0
print(a)
print(b)
print(c)
결과:
10
-5
0
10, -5, 0 모두 정수형으로 값이 출력되었습니다. 소수점이 없는 숫자를 정수형 숫자데이터라고 부릅니다. 파이썬은 데이터를 보고 형을 자동으로 결정하는 [동적타이핑] 형식을 따릅니다. 데이터를 보고 파이썬이 알아서 정수형 데이터 타입으로 결정합니다.
변수의 데이터 타입을 확인하기 위해서는 type()함수를 사용합니다.
코드:
a = 10
b = -5
c = 0
print(type(a))
print(type(b))
print(type(c))
결과:
<class 'int'>
<class 'int'>
<class 'int'>
출력결과 10, -5, 0 모두 정수형 타입인 int로 타입이 결정되었습니다. int 는 정수 integer의 줄임 말로 파이썬 프로그램에서 int로 표현합니다.
소수점이 있는 데이터 타입인 소수점형 데이터를 만들고 그 값과 타입을 출력해보도록 합니다.
코드:
a = 3.14
b = 10.0
c = 0.0
print(a, type(a))
print(b, type(b))
print(c, type(c))
결과:
3.14 <class 'float'>
10.0 <class 'float'>
0.0 <class 'float'>
3.14, 10.0, 0.0 모두 소수점형 데이터 타입인 float으로 결정되었습니다. 10.0, 0.0도 소수점 뒤의 값이 0이지만 .0으로 소수점형으로 결정됩니다. float은 floating-point number의 약자입니다. 여기서 floating은 "떠다니는"을 의미하며, 이는 배가 물 위에 떠 있는 모습을 연상시킬 수 있습니다. 배가 물 위에 떠다니듯이, float형 데이터는 소수점의 위치가 고정되지 않고 유동적으로 변할 수 있는 특징이 있습니다.
0과 0.0은 다른 데이터타입입니다.
코드:
a = 0
b = 0.0
print("0",type(a))
print("0.0",type(b))
결과:
0 <class 'int'>
0.0 <class 'float'>
0은 정수형인 int 타입이고, 0.0은 소수점형인 float 타입입니다. 프로그래밍 언어에서 타입을 나누는 이유로는 효과적인 데이터 저장 및 처리를 들 수 있습니다. 정수형(int)과 실수형(float)을 구분함으로써 프로그램은 메모리를 더 효율적으로 사용하고, 연산 속도를 최적화할 수 있습니다. 예를 들어, 정수형은 실수형보다 메모리를 적게 차지하며, 정수에 대한 연산은 실수에 대한 연산보다 빠르게 수행될 수 있습니다.
소수점형으로 만들기 위해서는 .0을 붙여 만들어야 합니다.
코드:
a = 1
b = 1.0
print("1",type(a))
print("1.0",type(b))
결과:
1 <class 'int'>
1.0 <class 'float'>
1은 정수 1.0은 소수 타입으로 소수점형으로 변수를 만들때는 .0을 붙여 변수를 생성합니다.
숫자형 데이터의 사칙연산에 대해서 알아봅니다. 사칙연산은 더하기(+), 뺴기(-), 곱하기(*), 나누기(/) 입니다. 프로그램에서 곱하기는 소문자 x가 아닌 *별을 사용합니다.
정수형 데이터만을 이용하여 사칙연산을 해보도록 합니다.
코드:
a = 15
b = 3
print(a+b,type(a+b))
print(a-b,type(a-b))
print(a*b,type(a*b))
print(a/b,type(a/b))
결과:
18 <class 'int'>
12 <class 'int'>
45 <class 'int'>
5.0 <class 'float'>
더하기, 빼기, 곱하기, 나누기의 결과가 잘 출력되었습니다. 조금 특이한 점이 있는데 / 나누기의 연산을 하면 정수형끼러 연산을 하지만 결과의 값은 항상 소수점형으로 나누기의 결과값이 생성됩니다.
정수와 소수점형이 포함된 연산을 해보도록 합니다.
코드:
a = 15
b = 3.0
print(a+b,type(a+b))
print(a-b,type(a-b))
print(a*b,type(a*b))
print(a/b,type(a/b))
결과;
18.0 <class 'float'>
12.0 <class 'float'>
45.0 <class 'float'>
5.0 <class 'float'>
정수와 소수점형간 연산을 할경우 더 복잡한 데이터를 저장할 수 있는 타입인 float(소수점형)으로 결과값이 생성됩니다.
15와 3.0을 더하면 18.0이됩니다. 18이 아닌 18.0으로 소수점형이 포함되어 있는 연산이기때문에 결과값도 소수점형으로 출력됩니다.
우리가 사용하는 컴퓨터는 0과1의 두가지 데이터만으로 연산을 하고있습니다. 이런 컴퓨터의 특성으로 인해 나누기의 연산의 경우 정확한 연산이 어렵습니다. 아래의 코드의 예를 들어보겠습니다.
코드:
a = 10.0
b = 3.0
print(a/b)
결과:
3.3333333333333335
컴퓨터에서 float은 2진 부동소수점으로 저장됩니다. 이는 10진수로 나타낼 때 정확하게 표현되지 않을 수 있습니다. 예를 들어, 1/3을 10진수로 표현하면 무한소수인 0.3333...이 나오듯이, 컴퓨터는 특정 숫자를 정확하게 표현하지 못하고 근사치로 표현하게 됩니다. 일반적인 상황에서는 크게 문제가 발생하지 않지만 안전 또는 돈을 다루는 곳에서는 근사값으로 사용할 경우 크게 문제가 발생 할 수 있습니다. 이부분에 유의하여 사용해야 합니다.
사칙연산 이외에 나누기를 할때 나머지를 구하는 % 나머지 연산이 있습니다.
코드:
a = 10
b = 4
print(a%b)
결과:
2
%는 나머지 연산으로 10을 4로 나누었을때 나머지인 2가 출력되었습니다.
몫을 구하는 연산인 // 입니다. 나누기를 2번 입력합니다.
코드:
a = 15
b = 4
print(a//b)
결과:
3
//는 몫 연산으로 15를 4로 나누었을때 몫인 3일 출력되었습니다.
** 곱하기를 두번 입력하여 거듭제곱의 연산도 가능합니다.
코드:
a = 2
b = 8
print(a**b)
결과:
256
** 곱하기를 두번하면 거듭제곱의 연산이 가능합니다. 2**8은 2*2*2*2*2*2*2*2 로 2를 8번 곱한 결과와 동일합니다.
복합할당연산자에 대해 알아봅니다. 아래와 같이 자기 자신의 값에 연산을 하는 경우가 있습니다,
코드:
a = 1
a = a + 1
print(a)
결과:
2
a = 1 로 처음에 1의 값이 바인딩 되었습니다. a = a + 1 의 연산은 =을 기준으로 오른쪽 부터 연산을 합니다. 1 + 1을 연산하여 그값인 2를 다시 a에 바인딩하여 결과값을 출력해보면 2의 값이 출력되었습니다.
이와같은 연산과 할당을 한번에 할 수 있는 방법이 있습니다.
이러한 방식의 연산을 복합할당연산자 라고 합니다.
코드:
a = 1
a += 1
print(a)
결과:
2
a += 1로 a = a + 1과 동일한 연산을 합니다. 자신의 값에 1을 더해 다시 바인딩하는 연산입니다. 복합할당 연산자를 이용하면 코드를 간결하게 유지할 수 있습니다.
복합할당연산자로 사용할수 있는 연산은 아래와 같습니다.
|
프로그램에서 연산자의 우선순위가 있습니다.
코드:
print(10 + 4 * 2)
결과:
18
사칙연산의 우선순위는 곱하기, 나누기 연산이 더하기, 빼기 연산보다 더 높은 우선순위를 가지고 있기때문에 4*2 가먼저 계산되어 8이되고 그다음 연산인 10 + 8 이 계산되어 18이 출력되었습니다.
곱셈, 나눗셈, 나머지 연산자 *, /, //, % 는 동일한 연산자 우선순위를 가지며 왼쪽부터 계산됩니다.
덧셈, 뺄셈 연산자 +, - 는 동일한 연산자 우선순위를 가지며 왼쪽부터 계산됩니다.
아래는 파이썬의 연산자 우선순위 표 입니다. () 괄호가 가장 높은 연산자 우선순위를 가지며 = 대입연산자가 가장 낮은 연산자우선순위를 가지고 있습니다. 덧셈, 뺄셈 보다 곱셈, 나눗셈이 더 높은 연산자 우선순위를 가지고 있어 위의 코드에서 곱셈부터 계산을 하였습니다. 우선순위가 동일할 경우 왼쪽 에서 오른쪽으로 먼저 나오는것부터 계산합니다.
우선순위 | 연산자 | 설명 | 예시 |
1 | () | 괄호, 가장 높은 우선순위 | (2 + 3) * 4 |
2 | ** | 지수(거듭제곱) | 2 ** 3 |
3 | +x, -x, ~x | 단항 연산자(양수, 음수, 비트 NOT) | -3, +2, ~x |
4 | *, /, //, % | 곱셈, 나눗셈, 정수 나눗셈, 나머지 | 2 * 3, 10 / 2 |
5 | +, - | 덧셈, 뺄셈 | 3 + 2, 7 - 5 |
6 | <<, >> | 비트 시프트(왼쪽, 오른쪽) | 1 << 2, 4 >> 1 |
7 | & | 비트 AND | 3 & 2 |
8 | ^ | 비트 XOR | 3 ^ 2 |
9 | | | 비트 OR | 3 | 2 |
10 | in, not in, is, is not, <, <=, >, >=, ==, != |
비교 및 멤버십 연산자 | a < b, x is y |
11 | not | 논리 NOT | not True |
12 | and | 논리 AND | True and False |
13 | or | 논리 OR | True or False |
14 | if - else | 삼항 연산자 | x if x > 0 else -x |
15 | 0 | 대입 연산자 | a = 5, a += 3 |
연산자의 우선순위는 () 괄호가 가장 높기때문에 아래과 같이 수식에 괄호를 적극적으로 활용하여 코드의 가독성을 높힐 수 있습니다.
코드:
print(10 + (4 * 2))
결과:
18
(4*2) 부분에 괄호를 넣었습니다. 괄호를 넣지 않아도 곱셈의 연산자 우선순위가 덧셈보다 빨라 먼저 계산됩니다. 그럼에도 () 괄호를 넣어 먼저 계산함을 확실하게 코드에 적용하였습니다. 코드를 해석할때 연산자 우선순위에 대해서 알 필요없이 ()괄호 부분부터 계산이 되는것을 알기때문에 더 빨리 코드의 해석이 가능하고 코드가 정확해졌습니다.
2진수, 8진수, 16진수의 데이터를 표현하는 방법에 대해서 알아봅니다. 2진수, 8진수, 16진수 또한 정수형 데이터로 각각의 값을 생성 후 바인딩 할 수 있습니다. 정수형 숫자 10을 2진수, 8진수, 16진수로 표현하는 코드입니다.
코드:
binary = 0b1010 # 2진수
octal = 0o12 # 8진수
hexadecimal = 0xA # 16진수
print(f"2진수 1010: ", binary)
print(f"8진수 12:", octal)
print(f"16진수 A:", hexadecimal)
결과:
2진수 1010: 10
8진수 12: 10
16진수 A: 10
0b 숫자 0과 b가 조합된 값을 앞에 붙이면 1010은 2진수의 값입니다. 0b1010은 2진수로 표현된 정수 10입니다. 2진수는 0과 1 두가지의 값만 가질 수 있습니다.
0o 숫자 0과 소문자o를 조합된 값을 앞에 붙이면 8진수 값입니다. 0o12 는 8진수로 표현된 정수 10입니다. 8진수는 0~7까지 총 8개의 값을 가질 수 있습니다.
0x 숫자 0과 소문자 x를 조합된 값을 앞에 붙이면 16진수 값입니다. 0xA는 16진수료 표현된 정수 10입니다. 16진수는 0에서 F까지 총 15개의 값을 가질 수 있습니다 0~9까지는 숫자로 동일하고 10=A, 11=B, 12=C, 13=D, 14=E, 15=F 로 표시합니다.
2진수, 8진수 16진수로 저장된 값의 타입을 확인하면
코드:
binary = 0b1010 # 2진수
octal = 0o12 # 8진수
hexadecimal = 0xA # 16진수
print("binary:",type(binary))
print("octal:",type(octal))
print("hexadecimal:",type(hexadecimal))
결과:
binary: <class 'int'>
octal: <class 'int'>
hexadecimal: <class 'int'>
놀랍게도 모두 정수형입니다. 우리가 컴퓨터에 저장하는 모든 데이터는 사실 2진수 데이터인 0과 1입니다. 입력을 2진수, 8진수, 16진수로 했을 뿐이지 저장된 값은 정수형으로 동일합니다.
정수형을 소수점형으로 소수점형을 정수형으로 형을 변환하는 방법에 대해서 알아봅니다.
정수형을 소수점형으로 변환하기 위해서는 float()함수를 이용합니다.
코드:
a = 10
b = float(a)
print(b,type(b))
결과:
10.0 <class 'float'>
정수형 데이터 10을 을 바인딩한 a변수를 float(a)함수에 입력하였고 그값을 b에 다시 바인딩하였습니다. b값을 출력해 보면 10.0이 출력되고 소수점형 타입인 float으로 형변환이 잘되었습니다.
소수점형을 정수형으로 변환하기 위해서는 int()함수를 사용합니다.
코드:
a = 3.14
b = int(a)
print(b,type(b))
결과:
3 <class 'int'>
소수점형 3.14를 정수형으로 형변환하여 3이되었습니다. 주의할 점은 소수점 이하의 데이터를 정수형으로 변환시 사라집니다.
파이썬에서는 정수형 변수를 저장할때 특이한 점이 있습니다.
값이 저장된 메모리 주소를 확인하기 위해서 id()함수를 사용하였습니다. 아래의 코드를 작성해봅니다.
코드:
a = 10
b = 10
print(id(a))
print(id(b))
결과:
140725725706968
140725725706968
출력되는 결과는 프로그램의 실행 시점마다 또는 컴퓨터 마다 다를 수 있습니다.
a 는 10을 바인딩하고 b도 10일 바인딩합니다. 메모리의 주소를 확인해보면 동일한 메모리의 주소를 카르키고 있습니다.
이는 파이썬 메모리를 관리하는 방법으로 동일한 값을 바인딩하고 있기때문에 하나의 10의 값을 가르켜 메모리를 절약합니다.
정수 256까지는 동일한 값을 가르킵니다.
코드:
a = 256
b = 256
print(id(a))
print(id(b))
결과:
140725725714840
140725725714840
256까지는 동일한 메모리 주소를 가르킵니다. 파이썬에서 256까지의 정수를 저장하는 공간을 할당 받아두어 미리 저장된 값을 사용하였습니다.
257부터는 다른 메모리 주소를 카르킵니다.
코드:
a = 257
b = 257
print(id(a))
print(id(b))
결과:
2535631859792
2535631859088
257부터는 파이썬에서 미리 확보하지 않아 다른 메모리주소를 카르킵니다.
소수점형은 동일한 메모리주소를 가르키지 않습니다.
코드:
a = 3.14
b = 3.14
print(id(a))
print(id(b))
결과:
2535630303792
2535630306096
소수점의 경우는 동일한 메모리주소를 가르키지 않습니다. 소수의 데이터를 미리 메모리 공간을 확보하기 위해서는 너무 많은 데이터가 필요하기때문에 합리적이지 않기때문입니다.
'파이썬 > 파이썬 기초문법' 카테고리의 다른 글
파이썬 문법 - 3.4 문자열 고급 (1) | 2024.09.03 |
---|---|
파이썬 문법 - 3.3 문자열 (0) | 2024.08.29 |
파이썬 문법 - 3.1 변수 (1) | 2024.08.28 |
파이썬 문법 - 2.3 print 및 주석 연습문제 (0) | 2024.08.27 |
파이썬 문법 - 2.2 주석 (0) | 2024.08.27 |
파이썬 문법 - 2.1 print 함수로 출력하기 (0) | 2024.08.27 |