Python tech/고급 파이썬 공부

파이썬 용어/개념 정리부터 확실하게 #1

콜레오네 2023. 3. 15. 01:16

모든건 기초가 튼튼해야 한다.

개발자들끼리 의사소통할 때 용어에 대한 이해가 부족하면 말릴수밖에 없다

누군가가 물어볼 때, 좀 안다 싶은데 용어 설명을 못하면 난감하기도 하다

용어에 대한 확실한 정리, 그리고 개념에 대한 확실한 이해가 필요하다

이제 알아보자

.

해당 포스팅은 [클린코드, 이제는 파이썬이다] 저서의 일부입니다.


이번 포스팅에서는
가비지 컬렉션, 리터럴, 키워드, 객체, 아이디에 대해 다룹니다.

가비지 컬렉션 (Garbage Collection)

유명 유니콘 기업에서 면접을 볼 때 들어왔던 기술 질문중 하나다.
사실 그 전까진 이런 개념이 있는 줄도 몰랐다.

가비지 컬렉션 : 파이썬 내부에서 메모리 할당과 해제를 자동으로 해주는 메모리 관리 기법

초기 프로그래밍에서는 메모리를 프로그래머가 직접 할당하고 해제해줘야 했는데
이는 까먹기 쉽고 버그를 유발시켜 매우 불편하고 까다로운 존재였다.
하지만 파이썬에서는 이를 자동으로 처리해준다니 얼마나 고마운 일인가

def foo():
    spam = ['hello', 'world']
    return

# 이때 파이썬 가비지 컬렉션은 함수가 실행되고 return 되는 순간
## spam에 할당된 메모리를 자동으로 해제해준다

리터럴 Literal

리터럴이란, 개발자가 직접 하드코딩해놓은 소스코드 상의 텍스트이다.

# 리터럴
foo1 = 20         # 정수 리터럴
foo2 = "hello"    # 문자열 리터럴

# 변수
spam = val + foo

키워드 Keyword

키워드는 파이썬이 돌아가기 위해 정해놓은 최소한의 문자들이다.
이를테면
import, if, continue, class 등등인데
당연히 변수명이나 함수명을 키워드로 작성하면 안된다.

객체와 아이디 Value and ID

파이썬에서 모든 것은 객체다. 클래스, 변수, 리터럴 등등
모든 객체에는 value, id, type이 존재한다.

foo = "foo"
# value : 'foo'
# type : string
# id : 고유의 ID, id(foo)로 확인 가능

모든 객체는 저마다 고유한 ID라는 것을 가지고 있다.
C를 배운 사람이라면 더 접근이 쉬울 수 있다.
마치 주소값 Address와 같은 개념이다.

>>> foo = 123
>>> id(foo)
2150964006960
>>> foo = 321
>>> id(foo)
2150965026896

foo라는 객체의 value는 123 에서 321로 변하였지만 ID는 달라졌다.
왜냐면 = 할당 연산자는 항상 객체가 아닌 참조를 복사한다.
무슨 말이냐,
foo는 특정 ID에 저장된 value를 참조할 수 있다.
처음에는 123이란 객체를 참조했고
그 다음에는 321이란 객체를 참조한 것 뿐이다.

>>> a = [1,2,3]
>>> b = a
>>> a == b
True
>>> a is b
True
>>> b = [1,2,3]
>>> a == b
True
>>> a is b
False

여기서 a라는 리스트는 b라는 객체에 본인의 ID를 참조하게 했다.
결국 a와 b의 value는 동일하게 보일 것이고, 참조되는 ID 또한 같다.
이는 리스트가 가변 객체이기 때문이다.

하지만 그 다음 b에 같은 value지만 새로운 객체를 할당했다.
그래도 a와 b의 value는 같지만 이제 다른 객체를 참조하기 때문에 ID는 달라진다.

>>> val = "abc"
>>> id(val)
2150967256304
>>> val += "d"
>>> id(val)
2150967644016

>>> foo = [1,2,3]
>>> id(foo)
2150967637632
>>> foo.append(4)
>>> foo
[1, 2, 3, 4]
>>> id(foo)
2150967637632
>>> foo = foo + [5]
>>> foo
[1, 2, 3, 4, 5]
>>> id(foo)
2150967643456

이건 어떨까?
val에 문자열 객체를 참조하게 해놓고, 새로운 문자를 추가했다
그런데 ID가 달라졌다.
기존 문자열 ID는 가비지 컬렉션에 의해 메모리 해제되고, 새로운 ID를 가지는 문자열로 덮어쓰기가 된다.

두번째는 어떨까?
foo에 할당된 리스트는 append 로 인자를 추가해도 ID는 그대로다.
하지만 + 연산자로 새로운 리스트를 추가하게 된다면
이 또한 마찬가지로 새로운 ID를 가지는 리스트를 참조하게 된다.

반응형