
변수
변수는 프로그램을 작성하는 데 가장 중요한 요소입니다. 프로그램은 알고리즘을 사용하여 문제를 해결하는데 알고리즘을 표현하기 위해서는 대부분 변수를 필수로 사용해야 합니다. 변수는 컴퓨터의 메모리에 일정한 크기의 영역으로 생성됩니다. 일반적인 프로그램은 변수 값을 알고리즘에 따라 변화시켜서 프로그램이 의도한 목적을 달성합니다.
변수 선언
// 프로그램에서 변수를 사용하려면 다음과 같이 변수를 선언해야 합니다.
var answer;
이 문장이 실행되면 메모리에는 answer라는 이름이 붙은 영역이 생성됩니다. 위 코드의 var은 자바스크립트의 키워드로 변수를 선언하기 위한 선언자입니다. answer는 변수 이름으로, 이 변수 이름을 사용해 변수 값을 사용할 수 있습니다.
자바스크립트는 C나 Java와 달리 변수 타입이 없으므로 변수 선언자는 var 하나뿐입니다. 따라서, 모든 데이터 타입의 값을 저장할 수 있습니다. 쉼표(,)를 사용하면 변수 여러 개를 한 개의 문장으로 선언할 수 있습니다.
var answer, result;
// 변수를 선언하기만 하고 변수 안에는 아무것도 정의하지 않는다면 undefined라는 값이 들어갑니다.
var answer;
console.log(answer); // undefined
// 대입 연산자(=)를 사용하면 변수에 값을 대입할 수 있습니다.
answer = 2;
수학에서 = 연산자는 좌변과 우변의 값이 같다는 뜻으로 사용되지만, 프로그램에서 = 연산자는 오른쪽 값을 왼쪽 변수에 대입한다는 뜻으로 사용됩니다. 대입을 하면 변수에 저장된 값이 새로운 값으로 대체됩니다. 또는 변수를 선언하여 초기값을 설정할 수도 있습니다.
var answer = 5;
// 변수를 여러 개 선언하고 초기값 설정을 쉼표로 구분하여 한 문장만 사용해서 표현할 수 있습니다.
var a = 1, b = 2, c = 3;
변수 선언 생략
// var문으로 선언하지 않은 변수 값을 읽으려고 시도하면 참조 오류가 발생합니다.
console.log(x); // → ReferenceError : x is not defined(오류 메시지)
// var 문으로 선언하지 않은 변수에 값을 대입하면 오류가 발생하지 않습니다.
x = 2;
console.log(x); // 2
변수를 선언하지 않은 상태에서 값을 대입하면 자바스크립트 엔진이 그 변수를 자동으로 전역 변수로 선언하기 때문입니다. 그러나 변수를 선언하지 않고 그 변수를 사용하면 버그의 원인이 될 수 있습니다. 따라서 변수는 반드시 선언하고 사용해야 합니다.
변수 끌어올림(호이스팅, hoisting)과 변수 중복 선언
프로그램은 작성한 순서에 따라 윗줄부터 차례대로 실행됩니다. 하지만 변수 선언은 이 원칙을 따르지 않습니다.
console.log(x); // undefined
var x;
이 코드에서 1번째 줄은 아직 변수 x가 선언되지 않았기 때문에 오류가 발생할 것 같지만 실제로는 오류가 발생하지 않고 defined가 출력됩니다. 이는 프로그램 중간에서 변수를 선언하더라도 변수가 프로그램 첫머리에 선언된 것처럼 다른 문장 앞에 생성되기 때문입니다. 이를 변수 선언의 끌어올림(호이스팅, hoisting)이라고 합니다.
단, 선언과 동시에 대입하는 코드는 끌어올리지 않습니다.
console.log(x); // undefined
var x = 5;
console.log(x); // 5
이 코드의 1번째 줄에서 undefined가 출력되고, 3번째 줄에서는 5가 출력됩니다. 2번째 줄의 변수 선언부 var x는 끌어올리지만 대입부 x = 5는 끌어올리지 않습니다.
또한, var 문을 사용하여 같은 이름을 가진 변수를 여러 개 선언하더라도 문제가 발생하지 않습니다. 같은 이름으로 선언된 변수는 모두 끌어올린 후에 단 하나의 영역에만 할당됩니다. 변수 선언의 끌어올림은 다른 언어에는 없는 자바스크립트만의 고유한 특징입니다. 그래서 다른 프로그래밍 언어의 사용자도 이해하기 쉬운 프로그램을 만들기 위해 변수 선언부를 반드시 프로그램의 시작 부분에 위치시켜야 합니다.
데이터 타입
데이터 타입은 프로그래밍 언어의 기본적인 구성 요소입니다.
데이터 타입과 변수의 동적 타이핑
데이터 타입이란, 숫자나 문자열처럼 변수에 저장하는 데이터 종류를 뜻합니다. C나 Java 등의 프로그래밍 언어에는 정수 타입 변수, 부동소수점 타입 변수 등이 있어서 그 변수의 타입과 일치하는 데이터만 저장할 수 있습니다. 이처럼 변수에 타입이 있는 언어를 가리켜 정적 타입 언어라고 합니다. 하지만 자바 스크립트에는 변수에 타입이 없어 변수에 모든 타입의 데이터를 저장할 수 있습니다.
var pi = 3.14;
console.log(pi) // 3.14
pi = "원주율";
console.log(pi) // 원주율
변수 pi에 먼저 3.14라는 숫자를 대입했지만 그 후에 "원주율"이라는 문자열을 대입할 수 있습니다. 즉, 자바스크립트에서는 같은 변수에 숫자나 문자열과 같은 다양한 타입의 데이터를 대입할 수 있습니다. 이처럼 실행할 때 변수에 저장된 데이터 타입을 동적으로 바꿀 수 있는 언어를 동적 타입 언어라고 부릅니다. 자바스크립트는 동적 타입 언어이므로 프로그램을 실행할 때 발생하는 타입 변환에 주의하여 변수에 어떤 타입의 데이터가 저장되는지 잘 확인해야 합니다.
데이터 타입의 분류
자바스크립트가 처리할 수 있는 데이터 타입은 크게 원시 타입과 객체 타입 두 가지로 나눌 수 있습니다.
원시 타입에 속하는 값으로는 숫자, 문자열, 논리가 있습니다. 특수한 값(undefined, null)과 심볼(symbol)도 원시 타입에 속합니다. 심볼은 ECMAScript6 부터 새로 추가된 값입니다. 원시 타입 데이터는 데이터를 구성하는 가장 기본적인 요소로 불변 값(값을 바꿀 수 없는 데이터)으로 정의되어 있습니다. 원시 타입의 값은 원시 값이라도 하며, 원시 값을 변수에 대입하면 변수에 그 값이 저장됩니다.
원시 타입에 속하지 않는 자바스크립트의 값은 객체라고 합니다. 객체는 변수 여러 개가 모여서 만들어진 복합 데이터 타입입니다. 객체 안에 저장된 값을 바꿀 수 있으며 참조 타입입니다. 따라서 객체 타입의 값을 변수에 대입하면 변수에는 그 객체에 대한 참조(메모리에서의 위치 정보)가 할당됩니다. 자바스크립트에서는 배열, 함수, 정규 표현식과 같은 다양한 요소가 객체입니다.

특수한 값
값이 없음을 표현하기 위한 특수한 값에는 null과 undefined가 있습니다.
undefined는 정의되지 않은 상태를 뜻하며 다음 값이 undefined가 됩니다.
- 값을 아직 할당하지 않은 변수
- 없는 객체의 프로퍼티를 읽으려고 시도했을 때
- 없는 배열의 요소를 읽으려고 시도했을 때
- 아무것도 반환하지 않는 함수과 반환하는 값
- 함수를 호출했을 때 전달받지 못한 인수의 값
이때, undefined는 코드로 대입한 것이 아니라 자바스크립트 엔인이 변수를 undefined로 초기화한 것입니다. 또한, 자바스크립트 전역 변수에도 똑같은 이름의 undefined가 있고, 그 초깃값은 undefined라는 원시값입니다.
ECMAScript5에서는 전역 변수 undefined 값을 수정할 수 없습니다.
그리고 null은 아무것도 없음을 값으로 표현한 리터럴입니다. null은 주로 프로그램에서 무언가 검색했을 때 아무것도 찾지 못했음을 전달하기 위한 값으로 사용됩니다. 따라서 값을 읽을 때 그 값이 null인지 아닌지 확인해야 하는 상황이 자주 발생할 수 있습니다.
Ref.

변수
변수는 프로그램을 작성하는 데 가장 중요한 요소입니다. 프로그램은 알고리즘을 사용하여 문제를 해결하는데 알고리즘을 표현하기 위해서는 대부분 변수를 필수로 사용해야 합니다. 변수는 컴퓨터의 메모리에 일정한 크기의 영역으로 생성됩니다. 일반적인 프로그램은 변수 값을 알고리즘에 따라 변화시켜서 프로그램이 의도한 목적을 달성합니다.
변수 선언
// 프로그램에서 변수를 사용하려면 다음과 같이 변수를 선언해야 합니다.
var answer;
이 문장이 실행되면 메모리에는 answer라는 이름이 붙은 영역이 생성됩니다. 위 코드의 var은 자바스크립트의 키워드로 변수를 선언하기 위한 선언자입니다. answer는 변수 이름으로, 이 변수 이름을 사용해 변수 값을 사용할 수 있습니다.
자바스크립트는 C나 Java와 달리 변수 타입이 없으므로 변수 선언자는 var 하나뿐입니다. 따라서, 모든 데이터 타입의 값을 저장할 수 있습니다. 쉼표(,)를 사용하면 변수 여러 개를 한 개의 문장으로 선언할 수 있습니다.
var answer, result;
// 변수를 선언하기만 하고 변수 안에는 아무것도 정의하지 않는다면 undefined라는 값이 들어갑니다.
var answer;
console.log(answer); // undefined
// 대입 연산자(=)를 사용하면 변수에 값을 대입할 수 있습니다.
answer = 2;
수학에서 = 연산자는 좌변과 우변의 값이 같다는 뜻으로 사용되지만, 프로그램에서 = 연산자는 오른쪽 값을 왼쪽 변수에 대입한다는 뜻으로 사용됩니다. 대입을 하면 변수에 저장된 값이 새로운 값으로 대체됩니다. 또는 변수를 선언하여 초기값을 설정할 수도 있습니다.
var answer = 5;
// 변수를 여러 개 선언하고 초기값 설정을 쉼표로 구분하여 한 문장만 사용해서 표현할 수 있습니다.
var a = 1, b = 2, c = 3;
변수 선언 생략
// var문으로 선언하지 않은 변수 값을 읽으려고 시도하면 참조 오류가 발생합니다.
console.log(x); // → ReferenceError : x is not defined(오류 메시지)
// var 문으로 선언하지 않은 변수에 값을 대입하면 오류가 발생하지 않습니다.
x = 2;
console.log(x); // 2
변수를 선언하지 않은 상태에서 값을 대입하면 자바스크립트 엔진이 그 변수를 자동으로 전역 변수로 선언하기 때문입니다. 그러나 변수를 선언하지 않고 그 변수를 사용하면 버그의 원인이 될 수 있습니다. 따라서 변수는 반드시 선언하고 사용해야 합니다.
변수 끌어올림(호이스팅, hoisting)과 변수 중복 선언
프로그램은 작성한 순서에 따라 윗줄부터 차례대로 실행됩니다. 하지만 변수 선언은 이 원칙을 따르지 않습니다.
console.log(x); // undefined
var x;
이 코드에서 1번째 줄은 아직 변수 x가 선언되지 않았기 때문에 오류가 발생할 것 같지만 실제로는 오류가 발생하지 않고 defined가 출력됩니다. 이는 프로그램 중간에서 변수를 선언하더라도 변수가 프로그램 첫머리에 선언된 것처럼 다른 문장 앞에 생성되기 때문입니다. 이를 변수 선언의 끌어올림(호이스팅, hoisting)이라고 합니다.
단, 선언과 동시에 대입하는 코드는 끌어올리지 않습니다.
console.log(x); // undefined
var x = 5;
console.log(x); // 5
이 코드의 1번째 줄에서 undefined가 출력되고, 3번째 줄에서는 5가 출력됩니다. 2번째 줄의 변수 선언부 var x는 끌어올리지만 대입부 x = 5는 끌어올리지 않습니다.
또한, var 문을 사용하여 같은 이름을 가진 변수를 여러 개 선언하더라도 문제가 발생하지 않습니다. 같은 이름으로 선언된 변수는 모두 끌어올린 후에 단 하나의 영역에만 할당됩니다. 변수 선언의 끌어올림은 다른 언어에는 없는 자바스크립트만의 고유한 특징입니다. 그래서 다른 프로그래밍 언어의 사용자도 이해하기 쉬운 프로그램을 만들기 위해 변수 선언부를 반드시 프로그램의 시작 부분에 위치시켜야 합니다.
데이터 타입
데이터 타입은 프로그래밍 언어의 기본적인 구성 요소입니다.
데이터 타입과 변수의 동적 타이핑
데이터 타입이란, 숫자나 문자열처럼 변수에 저장하는 데이터 종류를 뜻합니다. C나 Java 등의 프로그래밍 언어에는 정수 타입 변수, 부동소수점 타입 변수 등이 있어서 그 변수의 타입과 일치하는 데이터만 저장할 수 있습니다. 이처럼 변수에 타입이 있는 언어를 가리켜 정적 타입 언어라고 합니다. 하지만 자바 스크립트에는 변수에 타입이 없어 변수에 모든 타입의 데이터를 저장할 수 있습니다.
var pi = 3.14;
console.log(pi) // 3.14
pi = "원주율";
console.log(pi) // 원주율
변수 pi에 먼저 3.14라는 숫자를 대입했지만 그 후에 "원주율"이라는 문자열을 대입할 수 있습니다. 즉, 자바스크립트에서는 같은 변수에 숫자나 문자열과 같은 다양한 타입의 데이터를 대입할 수 있습니다. 이처럼 실행할 때 변수에 저장된 데이터 타입을 동적으로 바꿀 수 있는 언어를 동적 타입 언어라고 부릅니다. 자바스크립트는 동적 타입 언어이므로 프로그램을 실행할 때 발생하는 타입 변환에 주의하여 변수에 어떤 타입의 데이터가 저장되는지 잘 확인해야 합니다.
데이터 타입의 분류
자바스크립트가 처리할 수 있는 데이터 타입은 크게 원시 타입과 객체 타입 두 가지로 나눌 수 있습니다.
원시 타입에 속하는 값으로는 숫자, 문자열, 논리가 있습니다. 특수한 값(undefined, null)과 심볼(symbol)도 원시 타입에 속합니다. 심볼은 ECMAScript6 부터 새로 추가된 값입니다. 원시 타입 데이터는 데이터를 구성하는 가장 기본적인 요소로 불변 값(값을 바꿀 수 없는 데이터)으로 정의되어 있습니다. 원시 타입의 값은 원시 값이라도 하며, 원시 값을 변수에 대입하면 변수에 그 값이 저장됩니다.
원시 타입에 속하지 않는 자바스크립트의 값은 객체라고 합니다. 객체는 변수 여러 개가 모여서 만들어진 복합 데이터 타입입니다. 객체 안에 저장된 값을 바꿀 수 있으며 참조 타입입니다. 따라서 객체 타입의 값을 변수에 대입하면 변수에는 그 객체에 대한 참조(메모리에서의 위치 정보)가 할당됩니다. 자바스크립트에서는 배열, 함수, 정규 표현식과 같은 다양한 요소가 객체입니다.

특수한 값
값이 없음을 표현하기 위한 특수한 값에는 null과 undefined가 있습니다.
undefined는 정의되지 않은 상태를 뜻하며 다음 값이 undefined가 됩니다.
- 값을 아직 할당하지 않은 변수
- 없는 객체의 프로퍼티를 읽으려고 시도했을 때
- 없는 배열의 요소를 읽으려고 시도했을 때
- 아무것도 반환하지 않는 함수과 반환하는 값
- 함수를 호출했을 때 전달받지 못한 인수의 값
이때, undefined는 코드로 대입한 것이 아니라 자바스크립트 엔인이 변수를 undefined로 초기화한 것입니다. 또한, 자바스크립트 전역 변수에도 똑같은 이름의 undefined가 있고, 그 초깃값은 undefined라는 원시값입니다.
ECMAScript5에서는 전역 변수 undefined 값을 수정할 수 없습니다.
그리고 null은 아무것도 없음을 값으로 표현한 리터럴입니다. null은 주로 프로그램에서 무언가 검색했을 때 아무것도 찾지 못했음을 전달하기 위한 값으로 사용됩니다. 따라서 값을 읽을 때 그 값이 null인지 아닌지 확인해야 하는 상황이 자주 발생할 수 있습니다.