개발자들은 불변성을 강조하곤한다

대체 왜일까?


아무 프로그래밍 언어로 다음 코드를 작성했다고 해보자

count = 99

do_something(count)

print(count)


위 코드에서 다른일을 한게 없다면 우리는 99가 프린트 될거라고 굳게 믿을것이다

이 사실을 믿을 수 없는 세계에서 프로그래밍을 한다고 상상해보자

이 세계에서는 다른코드가 당신이 만든 코드를 바꿀수도 있다

이런일이 일어난다면 분명 화가날것이다 

게다가 당신이 만든 코드가 정확한 결과를 반환한다는 보장을 할 수 없게된다


이제 레퍼런스인 경우를 생각해보자

array = [1, 2, 3]

do_something(array)

print(array)


여전히 우리는 print가 [1, 2, 3]을 출력하길 바란다

하지만 대부분의 언어에서 do_something함수는 배열의 레퍼런스를 받는다

만약 이 함수가 배열의 두번째 요소를 변경하거나 값을 지운다면 우리가 예상한 결과를 반환하지 않게된다

이런코드들로 프로젝트를 채우면 코드를 읽기도, 왜 이렇게 동작하는지를 알아보기도 어려워진다


더 나아가 다중쓰레그 환경에서 모든 쓰레드가 이 배열에 접근한다고 가정하면

이 배열의 상태가 어느순간 어느값인지 알아내느라 고심해야한다


이런 일이 발생하는 이유는 만흥ㄴ 프로그래밍 언어에서 자료구조가 불변이 아니어서

안에 있는 애용을 모두 변경할 수 있기때문이다.

그런 코드조각들이 제대로 동작하길 바라는것은 당신에게 상처만 남겨줄것이다


이런 방식의 코드를 지양해야 하는 이유는 

goto를 사용하지 않는이유와 유사하다