변수는?
하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다.
간단히 말하자면 변수는 프로그래밍 언어에서 값을 저장하고 참조하는 메커니즘으로
, 값의 위치를 가리키는 상징적인 이름이다.
<<변수에 여러 개의 값을 저장하는 방법>>
변수는 하나의 값을 저장하기 위한 매커니즘이다. 여러 개의 값을 저장하려면 여러 개의 변수를 사용해야 한다. 단, 배열이나 객체 같은 자료구조를 사용하면 관련이 있는 여러 개의 값을 그룹화해서 하나의 값처럼 사용할 수 있다.
//변수는 하나의 값을 저장하기 위한 수단이다.
var userId=1;
var userName ='Lee';
//객체나 배열 같은 자료구조를 사요하면 여러 개의 값을 하나로 그룹화에서 하나의 값처럼 사용할 수 있다.
var user = {id:1, name: 'Lee'};
var users =[
{id:1, name:'Lee'},
{id:2, name: 'Kim'}
];
식별자란?
- 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말한다.
- 사람을 이름으로 구별해서 식별하는 것처럼 값도 식별자로 구별해서 식별할 수 있다.
- 식별자는 값이 아니라 메모리 주소를 기억하고 있다.
<<변수선언>>
변수를 사용하려면 반드시 선언이 필요하다. 변수를 선언할 때는 var, let, const 키워드를 사용한다.
<예>
다음 코드를 살펴보자. var 키워드는 뒤에 오는 변수 이름으로 새로운 변수를 선언할 것을 지시하는 키워드다.
var score; // 변수 선언(변수 선언문)
키워드란?
키워드는 자바스크립트 코드를 해석하고 실행하는 자바스크립트 엔진이 수행할 동작을 규정한 일종의 명령이다. 자바스크립트 엔진은 키워드를 만나면 자신이 수행해야 할 약속된 동작을 수행한다. 예를 들어. var 키워드를 만나면 자바스크립트 엔진은 뒤에 오는 변수 이름으로 새로운 변수를 선언하다.
자바스크립트 엔진은 변수 선언을 다음과 같은 2단계에 거쳐 수행한다
- 선언 단계: 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.
- 초기화 단계: 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화 한다.
<<변수 선언의 실행 시점과 변수 호이스팅>>
- 변수 선언이 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 런타임이 아니라 그 이전 단계에서 먼저 실행되기 때문이다.
- 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅이라 한다.
사실 변수 선언뿐 아니라 var, let, const function, function*, class 키워드를 사용해서 선언하는 모든 식별자(변수, 함수, 클래스 등)는 호이스팅된다.
<<값의 할당>>
변수의 값을 할당(대입,저장)할 때는 할당 연산자 =를 사용한다. 할당 연산자는 우변의 값을 좌변의 변수에 할당한다.
var score; //변수 선언
score = 80; // 값의 할당
변수 선언과 값의 할당은 다음과 같이 하나의 문으로 단축 표현할 수도 있다.
var score = 50; //변수 선언과 값의 할당
변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다.
<<값의 재할당>>
var score =80; //변수 선언과 값의 할당
score = 90; //값의 재할당
재할당은 변수에 저장된 값을 다른 값으로 변경한다. 그래서 변수라고 하는 것이다. 만약 값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없다면 변수가 아니라 상수라 한다.
다시 말해 상수는 단 한번만 할당할 수 있는 변수다.
<<가비지 콜렉터>>
가비지 콜렉터는 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제 하는 기능을 말한다. 더 이상 사용되지 않는 메모리란 간단히 말하자면 어떤 식별자도 참조하지 않는 메모리 공간을 의미한다. 자바스크립트는 가비지 콜렉터를 내장하고 있는 매니지드 언어로서 가비지 콜렉터를 통해 메모리 누수를 방지한다.
<<언어매니지드 언어 와 매니지드 언어>>
프로그래밍 언어는 메모리 관리 방식에 따라 언매니지드 언어와 매니지드 언어로 분류할 수 있다.
자바스크립트 같은 매니지드 언어는 메모리의 할당 및 해제를 위한 메모리 관리 기능을 언어 차원에서 담당하고 개발자의 직접적인 메모리 제어를 허용하지 않는다. 즉, 개발자가 명시적으로 메모리를 할당하고 해제할 수 없다. 더 이상 사용하지 않는 메모리의 해제는 가비지 콜렉터가 수행하며, 이 또한 개발자가 관여할 수 없다. 매니지드 언어는 개발자의 역량에 의존하는 부분이 상대적으로 작아져 어느 정도 일정한 생산성을 확보할 수 있다는 장점이 있지만 성능 면에서 어느 정도의 손실은 감수할 수 밖에 없다.
<<식별자 네이밍 규칙>>
- 식별자는 특수문자를 제외한 문자, 숫자, 언더스코어(_), 달러 기호($)를 포함할 수 있다.
- 단, 식별자는 특수문자를 제외한 문자, 언더스코어(_), 달러 기호($)로 시작해야 한다. 숫자로 시작하는 것은 허용하지 않는다.
- 예약어는 식별자로 사용할 수 없다.
<<예약어>>
예약어는 프로그래밍 언어에서 사용되고 있거나 사용될 예정인 단어를 말한다. 자바스크립트의 예약어는 다음과 같다.
await | break | case | catch | class | const |
continue | debugger | default | delate | do | else |
enum | export | export | false | finally | for |
function | if | if | import | in | instanceof |
interface* | let* | let* | null | package* | private* |
protected* | public* | public* | super | static* | switch |
this | throw | throw | try | typeof | var |
void | while | while | yield* |
//카멜 케이스(camelCase)
var firstName;
//스네이크 케이스(snake_case)
var first_name;
// 파스칼 케이스(PascalCase)
var FirstName;
//헝가리언 케이스(typeHungarianCase)
var strFirstName; //type + identifer
var $elem = documenst.getElementById('myId); //DOM 노드
var observable$ = fromEvent(document, 'click'); // RxJS 옵저버블