[1] 파이썬의 기본 개념들

@Alex · · 4 min read

1. 객체와 자료형

파이썬에서는 메모리에 저장된 모든 데이터를 객체(object)라는 개념으로 처리한다. 자료형(data type)은 그러한 객체가 어떤 값(value)을 가지고, 어떤 행위(operation)를 할 수 있는지 정의한다.

예컨대 파이썬 인터프리터가 1, 2와 같은 정수 리터럴(literal)을 맞닥뜨리면, 파이썬은 이들을 int 객체로 변환하여 메모리에 저장한다. 이 객체를 나중에 다시 불러오고 싶으면 이름을 붙이면 된다. 이렇게 붙여진 객체의 이름을 변수(variable)라고 한다.

a = 1 + 2
# 1 + 2의 결과로 3이라는 객체를 만들고 a라는 이름을 붙인다.

이와 달리, 어떤 객체의 정체성은 메모리에 존재하는 위치라고 할 수 있다. 두 객체가 같은 객체인지 여부를 알아보려면 메모리의 위치를 확인해야 한다.

id(a)
# 객체 a가 메모리의 어느 위치에 있는지 알려주는 간접적인 주소를 출력한다.

여기서 알아볼 수 있는 파이썬의 중요한 특징 중 하나가 있는데, 바로 불변(immutable) 객체의 개념이다. 아래 코드를 실행하면 메모리의 주소가 다르게 출력되는데, 파이썬에서 정수 자료형은 불변 객체이므로 값을 바꾸면 메모리를 새로 배정해서 객체를 새로 만들기 때문이다. 즉, = 연산자를 통해 정수 1을 담고 있는 객체를 가리키는 주소에서 정수 2를 담고 있는 객체로 a주소가 바뀌었다고 할 수 있다.

id(a)
# 1866154076528
a = a + 1
id(a)
# 1866154076560

2. 함수

함수(function)란 추후 불러와서 재사용할 수 있게 기능별로 분류한 코드의 묶음이다.

def input_and_output():
  name = input("insert your name:")
  print("Welcome", name)

3. 흐름 제어

파이썬에서는 ifelse를 통해 조건에 따라 실행 결과가 달라지도록 흐름을 제어(flow control)할 수 있다.

i = 10
if i > 1:
  print("1 초과")

또한, 조건을 넣어 특정 코드를 반복시킬 수도 있다.

for i in range(3):
  print(i)
# 0, 1, 2가 출력됨

4. 객체

VS code상에서 객체 이름 뒤에 .(마침표)을 찍으면 객체의 속성(attribute)메서드(method)를 사용할 수 있다.

a = int(1) # 객체 생성
b = a.__add__(1) # 객체의 메서드 사용

또한, class 키워드를 사용하여 사용자 정의 자료형(user defined data type)을 만들 수도 있다.

class MyInt:
  def __init__(self, value):
    self.value = value # 인스턴스 변수
  def print(self): # 메서드
    print("내가 만든 자료형", self.value)

a = MyInt(123) # 객체 생성
a.print() # 객체의 메서드 사용

5. 모듈

모듈(module)은 코드를 규격화하여 쉽게 가져와 쓸 수 있도록 한 것으로, import 키워드를 이용해 외부의 모듈을 불러올 수 있다.

import os
type os # 객체 os의 자료형 : module
os.getcwd() # os 모듈의 getcwd() 메서드 호출

6. 숫자 자료형 및 연산

아래는 파이썬이 기본적으로 제공하는 숫자 자료형이다.

자료형 종류 예시 특징
int 정수 0, 1, -1, 7 범위 무제한
float 실수 1.0, 3.14, 0.314e2 부동소수점 표현법 (※ C의 double과 동일)
complex 복소수 1.0 + 2.0j 실수부와 허수부는 각각 float

특이한 점은, 파이썬의 정수 자료형은 수의 범위가 (메모리가 허용하는 한) 무한대라는 것이다. 파이썬은 수가 커지면 해당 객체에 더 많은 메모리를 할당한다.

import sys

a = 123
b = 3_903_832_102_389_244_353_548_354_345 # 언더스코어로 끊어읽기 가능

print(sys.getsizeof(a)) # 28
print(sys.getsizeof(b)) # 40

또한 파이썬에서는 int 정수형끼리 / 연산자를 사용하여 나누더라도 결과가 int로 나오지 않는다. 정수 결과값을 얻고 싶다면, 소수점 이하 자리를 버림하여 출력하는 // 연산자를 사용하도록 한다.

type(4 / 2) # float
type(7 / 2) # int

그 외 절대값, 몫과 나머지를 한꺼번에 구하는 연산, 거듭제곱 연산자 및 거듭제곱 함수로 아래와 같은 것들이 있다.

abs(-3) # 3
divmod(7, 2) ## (3, 1) - 튜플(tuple)
2 ** 3 ## 2^3
pow(2, 3) ## 2^3

실수 리터럴을 기입할 때에는 과학적 표기법을 사용할 수도 있다.

3.1415e2 # 314.15 (3.1415 * 10^2)

또한, 위에서 소수점 이하 자리를 버림하여 정수 값을 출력한다고 설명했던 // 연산자의 경우, 피연산자 중에 실수 자료형이 하나라도 있으면 결과는 소수점 이하 자리가 모두 0인 실수 자료형이 되기에 주의해야 한다.

type(1.1 // 1) # float
print(1.1 // 1) # 1.0

또한 실수 자료형의 경우, 연산 속도가 빠르다는 이점을 지닌 부동소수점 표현법이 채택되어 1) 부호 2) 유효숫자 3) 지수 세 가지로 저장된다. 예컨대 -3.141592의 경우, 1) - 2) 3141592 3) 10610^{-6}으로 나뉜다. 다만 십진수라도 내부적으로는 이진수로 저장되기 때문에, 10진수로 표현하면 정밀도 문제가 발생하게 된다.

다시 말해, 소수점 이하 자리를 표현할 때 12\frac{1}{2}, 14\frac{1}{4}, 18\frac{1}{8}, ... 등의 조합을 사용하기 때문에, 십진수 입장에서는 0.1와 같은 숫자가 제대로 표현되지 않는다. 따라서 수치적 정밀성이 요구되는 분야에서는 부동소수점 표현법으로 발생하는 오차에 대해 잘 이해하고 있어야 한다.

0.1 * 0.1 # 0.010000000000000002 (매우 작은 자리에서 오차 발생)

(+) 예컨대 아주 큰 숫자와 아주 작은 숫자가 더해지면, 아주 작은 숫자가 무시된다.

100000000000000000000000.0+ 1.2 # 1e+23

마지막으로 복소수의 경우, 리터럴 안에 j를 붙여 허수부를 표현할 수 있다.

1 + 2j
@Alex
Just another ordinary payroller.