Variables#
자바스크립트 변수는 프로그램 내에서 데이터를 효과적으로 저장하고 관리하는 기본 도구이다.
변수는 숫자, 문자열, 객체 등 다양한 값들을 저장할 수 있으며, 이를 통해 코드를 더욱 동적이고 재사용 가능하게 만든다.
변수는 컴퓨터 메모리에 저장된 데이터를 가리키는 이름이라고 생각하시면 된다.
JavaScript 변수의 기본 개념#
- 자바스크립트에서 변수는 데이터를 담는 컨테이너 역할을 하며, 이를 통해 값에 이름을 부여하고 필요할 때마다 참조할 수 있다.
- 변수는 동적 타입을 사용하기 때문에 선언 시 특정 데이터 타입을 지정할 필요 없이, 숫자, 문자열, 불린(Boolean) 등 다양한 값이 할당될 수 있다.
변수 선언 및 초기화 방법#
자바스크립트에서는 변수를 선언하는 방법으로 주로 세 가지 키워드를 사용한다.
키워드 | 스코프 | 재할당 여부 | 특징 |
---|
var | 함수 스코프 또는 전역 스코프 | 가능 | 과거부터 사용되어 왔으며, 재선언 및 재할당 모두 가능함 |
let | 블록 스코프 | 가능 | 변수의 재선언은 금지되지만, 재할당은 가능함 |
const | 블록 스코프 | 불가능 | 선언과 동시에 초기화해야 하며, 상수로 취급되어 재할당이 불가능함 |
변수 선언과 동시에 값을 할당하는 것을 변수의 초기화라고 하며, 미리 선언만 하고 값은 나중에 할당할 수도 있다.
변수의 스코프와 사용 예시#
스코프는 변수의 접근 가능한 범위를 의미한다.
- var로 선언된 변수는 함수 레벨 스코프를 가지며, 전역 변수로 선언될 수도 있다. 이로 인해 코드가 복잡해질 경우 의도치 않은 변수 재정의나 충돌이 발생할 위험이 있다.
- let과 const는 블록 레벨 스코프를 갖기 때문에, 변수의 사용 범위를 보다 제한적으로 관리할 수 있으며, 이는 코드의 가독성과 유지보수성을 높인다.
함수 스코프(Function Scope)#
var
로 선언된 변수는 함수 스코프를 가진다.
함수 내에서 선언된 변수는 함수 외부에서 접근할 수 없다.
1
2
3
4
5
6
7
| function showName() {
var name = "홍길동"; // 함수 내부에서만 접근 가능
console.log(name);
}
showName(); // "홍길동" 출력
// console.log(name); // 오류 발생: name은 정의되지 않음
|
블록 스코프(Block Scope)#
let
과 const
로 선언된 변수는 블록 스코프를 가진다.
중괄호 {} 내에서 선언된 변수는 그 블록 내에서만 접근 가능하다.
1
2
3
4
5
6
7
| if (true) {
let x = 10; // 블록 내부에서만 접근 가능
const y = 20; // 블록 내부에서만 접근 가능
console.log(x, y); // 10, 20 출력
}
// console.log(x, y); // 오류 발생: x와 y는 정의되지 않음
|
호이스팅(Hoisting)#
호이스팅은 자바스크립트 엔진이 코드를 실행하기 전에 변수와 함수 선언을 메모리에 저장하는 동작이다.
Var 호이스팅#
1
2
| console.log(name); // undefined 출력 (오류 발생하지 않음)
var name = "홍길동";
|
위 코드는 자바스크립트 엔진에 의해 다음과 같이 해석된다:
1
2
3
| var name; // 선언이 최상단으로 끌어올려짐(호이스팅)
console.log(name); // undefined 출력
name = "홍길동"; // 할당은 원래 위치에 남음
|
Let과 Const 호이스팅#
let
과 const
도 호이스팅이 발생하지만, 선언 전에 접근하면 ‘Temporal Dead Zone(TDZ)’ 오류가 발생한다.
1
2
| // console.log(name); // 오류 발생: name에 접근할 수 없음
let name = "홍길동";
|
변수 네이밍 규칙#
자바스크립트 변수 이름은 다음 규칙을 따라야 한다:
- 문자, 숫자, $, _를 포함할 수 있다.
- 숫자로 시작할 수 없다.
- 대소문자를 구분한다(
name
과 Name
은 다른 변수). - 예약어(if, for, function 등)는 사용할 수 없다.
1
2
3
4
5
6
7
8
9
| // 올바른 변수명
let userName = "홍길동";
let $price = 100;
let _count = 5;
let camelCase = "카멜 케이스";
// 잘못된 변수명
// let 1user = "홍길동"; // 숫자로 시작할 수 없음
// let if = "조건문"; // 예약어 사용 불가
|
데이터 타입#
자바스크립트의 변수는 어떤 타입의 데이터도 저장할 수 있다.
기본 타입(Primitive Type)#
1
2
3
4
5
6
7
| let name = "홍길동"; // 문자열(String)
let age = 30; // 숫자(Number)
let isActive = true; // 불리언(Boolean)
let empty = null; // Null
let undefined_var; // Undefined
let bigNumber = 1234567890123456789012345n; // BigInt (ES2020)
let uniqueId = Symbol("id"); // Symbol (ES6)
|
참조 타입(Reference Type)#
1
2
3
4
| let user = { name: "홍길동", age: 30 }; // 객체(Object)
let numbers = [1, 2, 3, 4, 5]; // 배열(Array)
let sayHello = function() { console.log("안녕하세요!"); }; // 함수(Function)
let today = new Date(); // 날짜(Date)
|
변수 활용 예시#
다음은 변수를 활용한 간단한 예시:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| // 계산기 함수
function calculator(a, b, operation) {
let result; // 결과를 저장할 변수
// 연산 수행
if (operation === "add") {
result = a + b;
} else if (operation === "subtract") {
result = a - b;
} else if (operation === "multiply") {
result = a * b;
} else if (operation === "divide") {
result = a / b;
} else {
result = "지원하지 않는 연산입니다.";
}
return result; // 결과 반환
}
// 변수 선언 및 함수 호출
const num1 = 10;
const num2 = 5;
let sum = calculator(num1, num2, "add"); // 15
let difference = calculator(num1, num2, "subtract"); // 5
console.log(`${num1} + ${num2} = ${sum}`); // "10 + 5 = 15" 출력
console.log(`${num1} - ${num2} = ${difference}`); // "10 - 5 = 5" 출력
|
변수의 생명주기#
변수의 생명주기는 선언 방식과 스코프에 따라 달라진다.
- var 변수: 함수 내에서 선언된 경우 함수가 종료될 때 소멸. 전역에서 선언된 경우 웹 페이지가 닫힐 때까지 유지.
- let/const 변수: 블록 내에서 선언된 경우 블록이 종료될 때 소멸. 전역에서 선언된 경우 웹 페이지가 닫힐 때까지 유지.
좋은 변수 사용 습관#
- 의미 있는 이름 사용:
x
보다는 userName
과 같이 명확한 이름 사용. - camelCase 사용: 자바스크립트에서는 일반적으로 camelCase 스타일(첫 단어는 소문자, 이후 단어는 대문자로 시작) 사용.
- 상수는 대문자와 Snake_Case 사용:
MAX_SIZE
, API_KEY
와 같이 상수는 대문자와 언더스코어로 구분. - 불필요한 전역 변수 사용 자제: 가능한 함수나 블록 내에서 변수 선언.
- 적절한 키워드 선택: 변경할 필요가 없는 값은
const
사용.
참고 및 출처#
일시적 사각지대(Temporal Dead Zone, TDZ) 일시적 사각지대(Temporal Dead Zone, TDZ)는 JavaScript에서 변수가 선언되었지만 아직 초기화되지 않은 상태로 존재하는 코드 영역을 의미한다. 이 개념은 ES6(ECMAScript 2015)에서 let과 const 키워드가 도입되면서 함께 등장했다.
TDZ는 변수가 스코프에 들어가는 시점(코드 블록의 시작)부터 해당 변수의 선언문이 실행되는 시점까지의 구간을 가리킨다. 이 구간에서는 변수가 존재하지만 접근할 수 없는 상태이다.
1 2 3 4 5 6 { // TDZ 시작 (x에 대한) console.log(x); // ReferenceError: Cannot access 'x' before initialization let x = 10; // TDZ 종료 (x에 대한) console.log(x); // 10 (정상 작동) } 위 예제에서 x는 블록의 시작부터 존재하지만(호이스팅됨), let x = 10이 실행되기 전까지는 접근할 수 없다. 이 기간이 바로 TDZ이다.
...
Hoisting 호이스팅(Hoisting)은 JavaScript 엔진이 코드를 실행하기 전에 변수, 함수, 클래스 또는 임포트의 선언부를 스코프의 최상단으로 끌어올리는 것처럼 동작하는 JavaScript의 메커니즘으로, 이름 그대로 ‘끌어올린다(hoist)‘는 의미를 가진다.
그러나 실제로 코드가 물리적으로 재배치되는 것은 아니다. 이는 JavaScript 엔진의 컴파일 과정에서 일어나는 일종의 추상적 개념이다.
호이스팅은 JavaScript의 핵심 메커니즘 중 하나로, 코드의 실행 방식에 영향을 미친다.
효과적인 JavaScript 개발자가 되기 위해서는 호이스팅의 개념과 다양한 선언 방식에 따른 차이점을 이해하는 것이 중요하다.
모던 JavaScript에서는 let과 const를 사용하여 변수를 선언하고, 함수 표현식을 활용하는 것이 호이스팅으로 인한 예기치 않은 동작을 방지하는 데 도움이 된다. 또한, 모든 변수를 스코프의 최상단에서 선언하는 습관을 들이면 호이스팅으로 인한 혼란을 최소화할 수 있다.
...
Variable Declarations JavaScript에서 변수 선언(Variable Declarations)은 프로그램에서 데이터를 저장하고 참조하는 데 사용되는 중요한 개념이다. 변수 선언 방식에 따라 변수의 **유효 범위(Scope)**와 재할당 가능 여부 등이 결정된다.
ES6(ECMAScript 2015) 이전에는 var 키워드만을 사용하여 변수를 선언했으나, 이후 let과 const 키워드가 도입되어 보다 다양한 변수 선언이 가능해졌다.
JavaScript에서는 주로 세 가지 키워드를 사용하여 변수를 선언한다:
var 키워드 사용 let 키워드 사용 const 키워드 사용 Var 키워드 var는 JavaScript의 가장 오래된 변수 선언 방식이다.
...
변수 명명 규칙(Variable Naming Rules) JavaScript의 변수 명명 규칙(Variable Naming Rules)은 코드의 가독성과 유지보수성을 높이는 데 중요한 역할을 한다.
좋은 변수 이름을 사용하면 코드를 처음 보는 사람도 더 쉽게 이해할 수 있고, 나중에 자신이 작성한 코드를 다시 볼 때도 의도를 빠르게 파악할 수 있다.
필수 규칙 (문법적 제약) 변수 이름에는 다음과 같은 필수 규칙이 적용된다:
문자, 숫자, 밑줄(_), 달러 기호($)만 사용 가능하다.
1 2 3 let userName = "John"; // 올바른 이름 let user_name = "John"; // 올바른 이름 let $price = 100; // 올바른 이름 변수 이름은 숫자로 시작할 수 없다 (문자, 밑줄, 또는 달러 기호로 시작해야 한다).
...
Scopes JavaScript의 스코프는 변수와 함수의 접근성과 생존 기간을 결정하는 중요한 개념으로, 변수나 함수가 유효하게 접근할 수 있는 범위를 의미한다.
이를 이해하면 코드의 예측 가능성을 높이고 버그를 줄일 수 있으며, 변수의 생명 주기와 중첩된 함수, 클로저 등의 동작을 파악하는 데 큰 도움이 된다.
스코프의 기본 개념 스코프란 간단히 말해 ‘변수의 유효 범위’이다.
JavaScript에서 변수가 선언되면, 이 변수는 특정 범위 내에서만 접근 가능하다. 이 범위를 스코프라고 한다.
1 2 3 4 5 6 7 function exampleFunction() { let insideVariable = "이 변수는 함수 내부에서만 접근 가능합니다"; console.log(insideVariable); // 정상 작동 } exampleFunction(); // console.log(insideVariable); // 오류: insideVariable은 정의되지 않았습니다 위 예시에서 insideVariable은 exampleFunction 내부에서만 접근 가능한 지역 변수이다.
...