원시 값이 불변인 이유와 객체 값이 변경 가능한 이유

jjyung·2021년 9월 11일
3

JS

목록 보기
3/13

원시 타입과 객체 타입 부분을 예습하다 이러한 문장을 보았다.

만약 원시 값이 변경 가능한 값이라면 변수에 새로운 원시 값을 재할당했을 때 변수가 가리키던 메모리 공간의 주소를 바꿀 필요없이 원시 값 자체를 변경하면 그만이다

이 부분을 읽고 수십개의 물음표가 생겼다. 아니,원시 타입은 변경이 불가능해서 메모리 공간의 주소를 바꾼 것 까지는 알겠는데, 위의 말대로 왜 원시 타입을 불변하게 만들어서 귀찮게 메모리 공간의 주소를 바꾸도록 했을까?

도대체 왜?????

이 궁금증을 풀기위해 혼자 리서치도 해보고 동기에게 이유가 무엇일까를 물어보았다. 그리고 나의 궁금증을 그냥 넘어가주지 않은 똑똑한 동기들 덕분에 아래와 같은 결론을 낼 수 있었다.


원시 타입의 값이 변경 불가능한 값인 이유

만약 재할당 이외의 원시 값인 변수 값을 변경할 수 있다면 예기치않게 변수값이 변경될 수 있다는 것을 의미한다. 이는 값의 변경, 즉 상태 변경을 추적하기 어렵게 만든다.

선생님께서 항상 하시는 말씀 중 하나는 '자바스크립트는 유연한 언어'이다.

즉, 자바스크립트는 타입을 동적으로 변경하다보니 상당히 유연하고 에러가 잘 발생하지 않아 신뢰성에 이슈가 생길 수 있다.

에러가 나지 않는것이 좋게 보이겠지만 실제로 뜯어보면 에러가 얼마나 친절한 아이인지 알 수 있다. 에러가 나지 않는다면 어디서 틀린지도 모른채 있다가 갑자기 눈덩이처럼 불려진 문제를 맞닥뜨릴 수 있기 때문이다.

이런 이유에서 원시 값 자체를 변경할 수 없는 것이다. 아까 말한것처럼 자바 스크립트는 변수의 타입이 동적으로 정해지기때문에 개발자가 예상치 못하게 변경되었을 가능성이 농후하다. 그렇다고 우리가 몇백줄에서 길게는 몇만줄까지 되는 코드를 다 읽어볼 수는 없다.

이런 예측 불가능한 것을 줄이고 신뢰성을 높이고자 똑같은 주소에 값을 재할당하는것이 아니라, 새로운 공간에 새로운 값을 저장해 주소만 옮기는 것이다. 그러면 나중에 그 이전값이 필요하더라도 다시 주소만 옮기면 된다.

또한, 참조하는 경우가 많이 생기는데 a값이 변경되더라도 b값도 변경되는 예상치 못한 결과가 나오지 않는 것 또한 대비가 가능해진다.

이쯤되면 다시 궁금할수 있다. 예상가능하고 신뢰할 수 있는 코드를 위해 원시 값은 불변한데 왜 객체 값은 변경 가능한 값인가???


객체 타입의 값이 변경 가능한 값인 이유

객체 값을 변경할 수 있는 이유에 대해 말해보기에 앞서, 객체 타입의 특징에 대해서 먼저 논해보자. 객체의 값은 원시 값처럼 바로 메모리 공간에 값을 넣는것이 아니라 메모리 공간에는 참조값(다른 주소값)을 넣고, 한 단계 더 들어가 값을 넣는다. 이게 무슨말인가 싶을 수 있지만 아래 그림을 한 번 보자.

즉, 메모리 저장공간에 곧바로 값을 저장하지않았기 때문에 객체가 생성된 이후라도 동적으로 값을 추가해도 주소는 바뀌지 않기 때문에 값이 바뀌지는 않는다고 말하는 것이다.

이렇게 하는 이유는 무엇일까?

위와 같은 이유로 객체도 예기치 못한 변경이 발생하지 않도록 바로 값을 담는것이 아니라 메모리 공간 주소를 담는다. 물론 비용이 조금 더 든다는 단점이 있지만 한 단계 더 거쳐 실제 객체에 접근함으로써 명확하고 신뢰성이 확보되기때문이다.


자바스크립트는 배우면 배울수록 재미있고도 어려운 언어같다. 자유도가 높은만큼 알아야할것들이 많고, 그래서 이론의 중요도가 정말 높은 것 같다.

러버덕할때마다 토끼굴을 파면서 토론을 하니까 재미도있고, 배우는게 정말 많다.

profile
🏃‍♀️movin' forward, developer

0개의 댓글