변수라는 번역이 맞는지 모르겠다. 수학적으로 접근한다면 f(x)의 x라고 봐야하나? 컴퓨터 프로그래밍을 처음하는 분들은 개념접근이 어려울 수도 있다. 하지만 우리는 초등학교 수학에서 이미 배웠다. 단지 왜 이것이(순서도를 이야기하고있음) 있는 것인지는 그때는 몰랐다. 물론 알려고 하지도 않았지만 말이다. 누군가는 그랬었지 집합을 왜 배우는지 모르겠다고 그냥 사칙연산만 하면 되는 것 아닌가?(나는 초등학교때 산수를 배웠다.) 돈 계산만 잘 하면 사회생활하는 데 별 지장이 없지 않나요. 물론 이런말은 농담이지만 공부하는 입장에서는 필요없이 너무나 어려운 것들을 가르치는 것같다는 생각이 든다. 옛날 누군가 장난처럼(혼자만의 논리) 정리한 것들이 현재의 어려운 문제를 푸는 열쇠가 되기도 한다.
변수란 어떻게 설명해야 하는지 잘 모르겠다. 어느 누구도 나에게 이것이 변수의 정의라고 이야기 하지는 않았다. 그냥 프로그래밍에 필요하니깐 정도라고 할까? 명확히 누구에게 설명받은 적도 없고 나도 설명할 자신이 없다. 그냥 필요하고 정의 자체가 어렵다.
소통을 위한?
메모리의 특정 영역에 scalar값을 갖는 공간을 만들고 그곳을 지칭하는 것을 변수라고 한다. scalar값의 종류는 상수, 수, 문자열, 논리값, 함수, 자료구조등이 있을 수 있습니다.(언어에 따라서 변수를 가르키는 것까지 - python에서는 모든 변수는 값을 가르킨다고 정의하는 것같다?????)
내가 그의 이름을 불러주기 전에 그는 단지 휘발성 기억에 지나지 않았습니다.
내가 그의 이름을 불러주었을때, 비로서 그는 내게로 와서 변수가 되었습니다.
내가 그의 이름을 불러준 것처럼 나의 이 표현과 의도에 알맞는 누가 나의 이름을 불러다오.
그에게로 가서 나도 그의 변수가 되고 싶다.
우리들은 모두 무엇이 되고 싶다.
너는 나에게 나는 너에게 잊혀지지 않는 하나의 프로그램이 되고 싶다.
var name = '꽃'
var는 자바스크립트 초창기에 있었던 유일한 선언문이었다. 선언하는 방법은 var a형식이며 대입문으로 초기화를 할 수 있다.
초기값이 없을 경우에는 undefined를 가진다.
다음으로 알아봐야 하는 것이 변수가 영향을 미치는 범위일 것이다. 정통적인 프로그램언어에서는 변수의 영역이 블럭단위로 할당이 되지만 JavaScript에서 var의 영역은 function영역(function scope)이다. 물론 컴퓨터에서의 물리적이 영역은 메모리 하나 이겠지만 이 하나의 영역을 모두 사용한다면 프로그램의 모듈화는 만들 수 없다.(물론 전지전능하다면 가능할 수는 있다. 사람이라면 불가능하겠지만..)
예로써 한 번 살펴보자.
var i=0; function fn(){ var i = 1; console.log(`i ${i}`); } fn(); console.log(`i = ${i}`);
위의 예제에서 변수 i는 함수fn()의 안과 바깥에 선언되어 있고 서로 다른 영역을 가진다. 하나는 window(최상위 영역으로 기존언에서의 글로벌영역)에 하나는 fn()에 영향을 준다. var의 영역을 이해하는 것은 기존 프로그래밍언어와는 많은 차이가 있어서 완전히 이해하는데 어려움이 있을 수 있다. 물론 첫 프로그램 언어로 배운다면 조금은 쉬울 수는 있을지 모르겠다.
또한 var선언문은 코드의 대부분의 위치에서 선언하여 사용할 수 있지만 제일 상단으로 올라와서 선언 되는 것으로 해석한다.
var i = 99; function fn(){ console.log(`선언전 : ${i}`) var i = 100; console.log(`선언후 : ${i}`) } fn();
위의 코드는
선언전 : undefined 선언후 : 100
를 출력할 것이다. 이 코드는
var i = 99; function fn(){ var i; console.log(`선언전 : ${i}`) i = 100; console.log(`선언후 : ${i}`) } fn();
로 해석이 된다. 즉 함수내에 선언된 var i = 100은 함수의 최상단에서 선언된 것과 동일하다. 이런한 것이 아니라면 99가 출력되었을 것이다.
여기서 잠깐 다른 이야기를 하면 아직 function에 대해서 이야기도 하지 않으면서 function으로 설명을 하고 있다는 것이다. 내가 아직 설명하는 기술이 부족한면이 있을 수 있겠으나 JavaScript가 functional programming language라는 것으로 이해해 주고 넘어갔으면 한다. 안 그러면 이 단락에서 설명할 것이 너무 없다. 함수의 기본개념은 입력값이 같으면 출력값이 같다.
javascript에서는 변수를 선언을 하지 않아도 사용할 수 있다. 이것의 장점이 있겠으나 부수적인 문제를 많이 낳고 있다. 명시적으로 선언한 변수만을 사용하는 습관을 가지자!
- 현재는 선언하지 않은 변수사용을 제한하는 방식으로 변하였다.
ES6(ECMAScript 2015)에서 도입한 것이다. var만으로 프로그래밍이 가능할 수 있다. 하지만 사람이란 자기가 원하는 데로 인식한다. 따라서 프로그래밍의 모순을 만든다. 그래서 또 다른 선언문이 let을 도입하였다. let의 영역은 블럭영역(block scope)을 가지는 선언문이다.(var는 함수영역을 가진다.)
ES6에서 도입한것으로 불변의 값을 갖는 상수선언에 사용한다. 변수란 변할수있는것을 뜻한다. 변수만 가지고도 충분히 코딩이 가능하다. 그럼 왜? 양이 있으면 음이 있듯이, 반대개념은 우리에게 도움을 주고. 또는 필요하다. 넓이가 항상 양수가 아니듯이..
javascript에서는 명시적인 type선언이 없다. 이것은 장단점이 존재하며 많은 논쟁이 있을 수 있다.
이러한 관계로 typescript에서는 type을 강제하는 것을 제시하고 있으면 몇몇 language에서는 명시적인 type 선언을 강제한다.
type선언이 많은 툴에서 프로그래머의 코딩을 도와 주고 있기도 한다.(우리는 때때로 멍청한 실수를 하고 있다.)
하지만 강제를 한다는 것은 창조성에 제한을 두는 경우도 존재하기도 한다.