저도 참 의아했던 내용입니다. a랑 a + 3이 같다는 게 무슨 말도 안되는 식이란 말입니까?! 아마, 내용은 이해를 하셨는데, 이상하다는 느낌에 공감을 원하시는 것 같습니다. 십분 공감합니다. 공감까지만 하면 될 것 같은데, 제 못된 습성상, 굳이 설명을 더해보겠습니다. 일단 수학시간에 썼던 (=)라는 기호의 의미와, 명령형 프로그래밍 언어에서의 기호가 그 의미가 다릅니다. 기호로 어떤 연산을 약속하고 그대로 수행하는 것인데요, 수학시간에 = 기호는, 그 좌변과 우변을 서로 동치로 보고 상호 치환해서 사용해도 됩니다. 그러나, 보통의 (명령형) 프로그래밍 언어에서의 (=) 기호의 의미는 이렇습니다. "우변의 식을 먼저 계산한 결과 값을 좌변에 있는 변수 자리에 써넣어라." 여기서 중요한 사항이 몇 가지 있는데, 본질적으로 여기에 순서와 타이밍이 중요해집니다. 우변 식을 평가하는 순서가 먼저가 되고, 마지막에 좌변의 변수 메모리 자리에 덮어쓰는 일이 일어납니다. 그래서, 우변에 있던 a와, 좌변에 덮어써진 a는 이름은 같지만, 그 값이 다르죠. 과거의 a값과, 해당 명령이 실행된 다음의 a는 사실 이름만 같을 뿐, 다른 존재입니다. 수학 시간이었다면, 적어도 a' = a + 3 이런식으로 썼을 겁니다. 같은 이름에 대해, 시간에 따라서 다른 값들이 들어가 있으니까, 개발자들이 코드를 읽을 때도, 시간 축을 함께 고려해야 합니다. 원래 있던 값과 바뀐 값들이 있으니, 내가 이해하려는 지금 시점의 값은 무얼까를 코드에는 보이지 않는 상태로서 암산하는 거죠. 다들 그렇게 하고 있지만, 별로 좋은 방법은 아닙니다. 그래서 차라리 const a = 1; const b = a + 3; 처럼 const를 활용하는 게 나을 수 있습니다. const의 경우에는, 해당 범위 내에서 변수값을 바꿀 수 없기 때문에, 해당 변수들이 해당 범위가 끝날 때까지, 동일한 값으로 판단하고, 시점을 고려할 필요가 없어집니다. 게다가, a와 1이란 값을 서로 치환해서 써도 되고, b 도 (a + 3)과 대치해서 써도 됩니다. let의 경우는, 해당 문맥내에서 값이 변할 가능성이 있기 때문에, 각 변수를 읽을 때, 해당 시점을 고려해야 하는 인지적 부담이 있죠. 한편 TMI로 ,아예 함수형 프로그래밍 언어들은, 아예 값이 바뀌는 변수를 정의할 수 없기도 합니다. (JS의 let같은 것이 아예 없는 거죠) 그런 언어들은 =기호가, 수학시간에 배운 =기호와 동일한 의미로 사용됩니다.

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2023년 1월 4일 오전 4:43

댓글 0