mutable, immutable 이 왜 필요한건데?

FreeZeeSun·2023년 9월 4일
0

python

목록 보기
3/5


내가 좋아하는 코믹스 영화 시리즈인 『엑스맨』.
돌연변이들을 '뮤턴트'라고 한다.


python 의 특징 중 하나는 immutable(변할 수 없는) 타입과 mutable(변할 수 있는) 타입이 있다는 점이다.

bytes : immutable | bytearray : mutable
tuple : immutable | list : mutable
frozenset : immutable | set : mutable

이렇게 immutable 타입에 대응하는 mutable 타입이 꼭 있다.

mutable은 메모리값을 바꾸지 않은 채(=재할당 없이) 값을 바꾼다는 뜻이다.

재할당이란? (re)bind
이미 선언된 이름의 값을 변경하는 것이다. 메모리 값이 바뀐다.

왜 필요할까?


a라는 identifier 에 3을 할당하고 확인한 주소값 id(a)
다시 2를 할당한 뒤 확인한 주소값이 다름을 알 수 있다.
a의 값이 변할 때마다 메모리를 재할당해줬다는 뜻이다.

결국 mutable 타입이 있는 이유는 성능적인 이점 때문이다.
만약에 loop 를 돌면서 immutable 한 객체의 값을 순회하면서 값을 변경한다고 치면, 이건 단순하게 변경이 아니라 매번 재할당을 하기 위해서 객체를 계속 생성한다.
그러다보면, 메모리에서 객체들이 차지하는 비중이 점점 커지면서, 너무 규모가 커지면 메모리 문제로 인해 소스코드가 작동하지 않는 상황이 올 수도 있다.
만약, mutable 한 객체에 매번 값을 새롭게 할당하면, 새로운 메모리공간을 차지하지 않으면서 값을 변경한다.
이렇게 재할당 없이 값을 바꾸는걸 inplace 테크닉이라고 한다.

하지만, mutable 타입은 문제가 많은 데이터타입이다.

잘 사용하면 편리하지만, 못 사용하면 문제점이 많다.
그래서 함수형 프로그래밍 언어에서는 아예 mutable 이라는 타입이 없는 프로그래밍언어가 많다. (ex. TensorFlow 등 ...)

이런 문제를 피하며 잘 사용하기 위해서는 데이터타입이 어떤 성질을 갖고 있고 어떤 타입인지를 잘 파악하고 있어야 한다.

그렇지 않으면 surprising한 결과를 맞닥뜨리게 되니..!

마지막 코드의 출력값은?
바로 >>> ['Python', 'Java'] 이다.
surprising effect 가 이걸 말하는거다. ujin 이라는 객체에는 넣은 적 없는 게 들어있는거다.



↑ 참고한 영상

profile
개발자 지망생. 지금은 삽질의 연속, 하지만 언젠가는 삽질이 아닐 것이기에!

0개의 댓글