immutable 과 mutable

개발 용어 사전이 필요해

처음 개발 공부를 하던 당시 만들고 싶었던 것이 있었으니 개발 용어를 설명해주는 위키였다.

지금이야 의존성 주입이니 제어의 역전이니 하는 말을 들어도 대충 어떤 개념인지 감을 잡고 다시 찾아보는 정도인데,

입문 시절 때는 용어 하나 하나를 이해하는 것이 정말 큰 스트레스였다.

또 비슷해 보이는데 다르게 부르는 것들도 제법 된다. 함수와 메소드라든가, 클래스와 구조체라든가.

스프링이랑 JSP로 대충 쇼핑몰 만들던 당시에는 REST API 가 대체 뭔지 그게 가능하기나 한 기술인지 신기하기도 했었고 말이지.

어쨌든 이런 이유로 처음 개발 공부를 할 때는 어려운 거 다 때려치우고 뭔가 재미난 것부터 만드는 게 낫다는 생각도 들지만,

끊임없이 새로운 게 튀어나오는 이 바닥에서 그것들을 이해하려면 여러 개념들을 충분히 숙지하고 있어야 하기 때문에

나처럼 냅다 삽질을 했다면 나중에 어느 정도 덕을 보는 경우도 있긴 하다.

잠시 함수형 프로그래밍의 이야기를 해보자

내가 immutable 이란 개념을 처음 접한 건 함수형 프로그래밍을 공부할 때였다.

처음 공부하면서 가장 당황스러웠던 이야기가 뭐였냐면

함수형 프로그래밍에서는 변수를 사용하지 않는다. 정확히 말하자면 변수를 사용하긴 하지만 그 변수에 값을 대입한 이후로 그 변수는 그 값으로 ‘고정’되기 때문에 상수나 마찬가지이다.

엄청 황당한 말이다. 변수의 상태값이 변하지 않는데 도대체 어떻게 개발을 하고 앱을 만든다는 거지?

게임을 만든다고 했을 때, 경험치를 모아서 레벨업을 달성하는 조건문에 다다르더라도 주인공의 레벨값은 언제나 정수인 1로 고정되는 거나 다름 없는 거 아닌가?

(실제로는 모든 값이 상수면 경험치를 모으는 것도 불가능하고 애초에 게임을 진행할 수가 없다. 주인공의 위치부터 항상 고정 되어있을테니)

근데 사실 저 복잡한 함수형 프로그래밍까지 공부하지 않더라도, 변수의 상태를 바꿀 수 없는 것이 있으니

그게 바로 immutable 되시겠다.

너 변했어

우리가 상대방더러 변했다고 이야기 할 때 상황을 보자.

상대방의 무엇이 변했나? 대다수는 성격이나 태도 등을 이야기할 때겠지만 여기서 설명하기엔 모호하니 좀 더 직관적인 예를 들어보자.

빨간머리였던 친구가 어느 날 검은머리를 하고 왔다고 해서 대뜸 친구가 맞는지 확인할테니 신분증을 보여달라고 하는 사람은 없을 거다.

왜냐면 대다수의 사람은 mutable 하기 때문에 그렇다. 즉 그 사람이 무슨 변화를 겪더라도 그 사람은 그 사람이다.

반면 성적은 immutable 하다. 분명 어제 성적표에는 C 라고 되어 있었는데 성적이 B 로 바뀌었다면 성적표가 다를 것이다.

이런! 어제 검은머리 친구랑 베그하고 헤어질 때 친구 성적표를 가져오고야 말았네!

좋다 말았다. 결국 재수강을 해서 성적을 올릴 수 있었고 C+ 이라는 점수를 받았다. 그럼 그 성적은 C 에서 C+ 로 변한 것인가?

엄밀히 따져서 그 과목의 점수는 여전히 C 이지만 재수강을 통해 C+ 로 대체한 것 뿐이다.

그래서 기존 성적표를 가져가서 정정 받는 게 아니라 새로운 성적표를 받는다

성적은 변하는 게 아니고 대체만 가능하다는 점에서 immutable 하다고 볼 수 있다.

파이썬 코드로 다시 보기

파이썬 함수 중에 id() 라는 함수가 있다. 공식 문서에는 다음과 같이 말한다.

객체의 “아이덴티티”를 돌려준다. 이것은 객체의 수명 동안 유일하고 바뀌지 않음이 보장되는 정수입니다

여기서 말하는 객체 란 인자로 전달하는 값들을 말한다.

예시를 보자

identification = id(루이)
print(identification)

라 하면 다음과 같이 주민번호가 나오는 거라고 생각하면 된다.

980811-1xxxxxx

그럼 이걸 이용하여 파이썬에서 immutable 한 성격을 가지고 있는 타입인 정수를 넣어보자.

num = 1
num_id = id(num)
print(num_id)

그럼 다음과 같이 나온다. 참고로 결과값은 컴퓨터마다 다르게 나온다. 사실 여기서 아이덴티티라고 말하는 것은 컴퓨터 메모리상의 주소를 이야기 하기 때문.

4453076752

그런데 정수는 immutable 하다고 했는데 그게 코드상으로는 어떤 의미인지 다음 코드를 보자

num = 1
num_id = id(num)
print(num_id)

num = 2
print(num_id)

이러면 다음처럼 상이한 두 개의 id 정보가 나온다.

4453076752
4453076784

같은 변수의 id 를 찍었는데 이 넘이람 그 넘은 서로 다른 넘이었다고 말해주는 결과이다.

반면 mutable 한 성격을 가진 list를 보자

friend_list = ['Tylo', 'Louie', 'Ashley']
id(friend_list)

결과는 다음과 같다

4456707648

생각해보니 이왕 예제로 작성하는 거 친구 목록의 ‘Tylo’ 를 내가 좋아하는 배우인 맷 데이먼이라고 바꿔보자. 사실 디카프리오를 더 좋아하지만 이름이 너무 길다.

friend_list = ['Tylo', 'Louie', 'Ashley']
id(friend_list)

friend_list[0] = 'Matt'
print(friend_list)

id(friend_list)

그럼 이런 결과가 나온다. 맷 데이먼이랑 친구라니! 게다가 friend_list 의 아이디가 동일한 것을 확인할 수 있다.

4456707648
['Matt', 'Louie', 'Ashley']
4456707648

이처럼 friend_list 에 목록을 수정했는데도 아까 그 친구목록과 동일한 친구목록이라고 이야기 한다. 친구목록은 mutable 하기 때문에 그렇다.

그러니 친구에게 다들 잘하자.

마무리하며

immutablemutable 을 알았다면 이제 깊은 복사와 얕은 복사를 이야기하고, 사이드 이펙트의 무서움에 대해서 이야기 해볼 수 있다.


Written by@irrationnelle
irrationnelle

GitHub