-
변수(js)JavaScript 2022. 6. 15. 21:35728x90
04장 변수
변수란?
- 하나의 값을 저장하기 위해 확보한 메모리 공간 자체
- 그 메모리 공간을 식별하기 위해 붙인 이름
- 값의 위치를 가리키는 상징적인 이름
// 변수는 하나의 값을 저장하기 위한 수단이다. var userId = 1; var userName = 'Lee'; // 객체나 배열 같은 자료구조를 사용하면 여러 개의 값을 하나로 그룹화해서 하나의 값처럼 사용할 수 있다. var user = { id: 1, name: 'Lee' }; var users = [ { id: 1, name: 'Lee' }, { id: 2, name: 'Kim' } ];
var result = 10 + 20;
로 예를 들어보겠다.10, 20은 각각 어떠한 메모리를 가리키고있다.
여기서 10 + 20 의 결과값인 30도 메모리를 할당받고 우리가 선언한 변수 result는 그 30의 메모리를 가리키고 있는 것이다.
- result : 변수 이름(변수명) - 30 : 변수 값 - 변수에 값을 저장하는 것 : 할당(대입, 저장) - 변수에 저장된 값을 읽는 것 : 참조
식별자
- 변수 이름을 식별자라 함.
- 어떤 값을 구별해서 식별할 수 있는 고유한 이름
- 식별자는 값이 아닌 메모리 주소를 기억하고 있다.
변수 선언
- 변수는 사용하려면 반드시 선언이 필요하다.
- javascript에서는 var, let, const 키워드가 존재한다.
- var 키워드는 여러 단점이 있으므로 주의해야한다.
var score; // 변수 선언(변수 선언문)
위처럼 선언하면 javascript는 undefined라는 값으로 암묵적으로 할당 후 초기화한다.
변수 선언의 실행 시점과 변수 호이스팅
console.log(score) var score;
위 코드를 실행했을 때 우리는 참조 에러가 날 것이라고 생각할 수 있다. 하지만 javascript에서는 위 코드를 실행했을 때 undefined가 출력 되는 것을 볼 수 있다.
이유는 javascript는 변수 선언이 런타임(소스코드가 한 줄씩 순차적으로 실행되는 시점)이 아닌 그 이전 단계에서 먼저 실행되기 때문이다.
- 변수 호이스팅 : 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트의 고유 특징 (var, let, const, function, function*, class 키워드는 모두 해당함)
값의 할당
var score; socred = 80;
var score = 80;
같아 보이지만 score의 변수 생성이 런타임에 생성 되는 경우가 아래, 런타임 이전에 생성 되는게 위 임을 주의하자.
console.log(score); // undefined var score; // ① 변수 선언 score = 80; // ② 값의 할당 console.log(score); // 80
위 코드는 변수 선언 > console.log(score) : unefined > score = 80 > console.log(score) : 80 순으로 이루어진다.
undefined 의 메모리에 80이 할당됨.
var score = 80; // 변수 선언과 값의 할당
console.log(score); // 80
위 코드는 console.log(score) : undefined > score = 80 > console.log(score)가 출력되게 된다.
undefined와 80은 서로 다른 메모리에 할당됨.
console.log(score); // undefined score = 80; // 값의 할당 var score = 50; // 변수 선언 console.log(score); // ??
??은 50이 출력됨을 쉽게 알 수 있다.
javascript를 실행하면 일어나는 순서대로 바꾼 것이 아래 코드이다.
var score; console.log(score); // undefined score = 80; // 값의 할당 score = 50; // 변수 선언 console.log(score); // 50
값의 재할당
var score = 80; score = 90;
var 키워드로 선언한 변수는 선언과 동시에 undefined로 초기화 되기 때문에 80도 재할당이다.
- 값을 재할당할 수 없다면 변수가 아닌 상수이다.
- 여기서 undefined, 80의 사용하지 않는 메모리는 javascript가 내장하고 있는 가비지 콜렉터를 통해서 해제한다.
식별자 네이밍 규칙
- 식별자는 특수문자를 제외한 문자, 숫자, _ , $를 포함할 수 있다.
- 식별자는 숫자로 시작할 수 없다.
- 예약어는 식별자로 사용할 수 없다.
- 변수는 쉼표(,)로 구분해 여러 개를 한번에 선언할 수 있지만 가독성이 나빠지므로 권장하지 않는다.
var person, $elem, _name, first_name, val1;
- ES5부터 식별자를 만들 때 유니코드 문자, 한글, 일본어 식별자도 허용하지만 권장하지 않는다.
var 이름, なまえ;
- 다음 식별자는 명명 규칙에 위배된다.
var first-name; // SyntaxError: Unexpected token – var 1st; // SyntaxError: Invalid or unexpected token var this; // SyntaxError: Unexpected token this
- javascript는 식별자의 대소문자를 구별할 수 있다.(아래 3개는 모두 다른 변수)
var firstname; var firstName; var FIRSTNAME;
- 변수 이름을 변수 존재 목적에 맞게 표현해야 가독성이 높아진다.
var x = 3; // NG. x 변수가 의미하는 바를 알 수 없다. var score = 100; // OK. score 변수는 점수를 의미한다.
- 변수에 주석이 필요하면 변수 존재 목적을 명확히 하지 못한 것이다.
// 경과 시간. 단위는 날짜다 var d; // NG var elapsedTimeInDays; // OK
- 자바스크립트는 변수나 함수의 이름에는 카멜 케이스를 사용하고, 생성자 함수, 클래스의 이름엔 파스칼 케이스를 사용한다.
// 카멜 케이스 (camelCase) var firstName;
// 스네이크 케이스 (snake_case)
var first_name;// 파스칼 케이스 (PascalCase)
var FirstName;// 헝가리언 케이스 (typeHungarianCase)
var strFirstName; // type + identifier
var $elem = document.getElementById('myId'); // DOM 노드
var observable$ = fromEvent(document, 'click'); // RxJS 옵저버블
```참고
모던자바스크립트 Deep Dive
728x90'JavaScript' 카테고리의 다른 글
연산자(JavaScript) (0) 2022.06.27 데이터 타입(js) (0) 2022.06.22 [JavaScript] 메모리 관리, GC(가비지 컬렉션) (0) 2022.06.20 [JavaScript]비동기 프로그래밍 (0) 2022.06.17 표현식과 문(javascript) (0) 2022.06.16