Javascript

[JavaScript] 자바스크립트 | 데이터타입 data types | let vs var | hoisting

@leem 2025. 3. 18. 19:43
이 글은 드림코딩 유튜브 강의를 보며 학습한 내용을 정리한 JavaScript 복습 노트입니다.

 

 

1. 변수 선언 (let vs var vs const)

JavaScript에서 변수를 선언하는 방법에는 let, const, var가 있습니다.

📌 Hoisting (호이스팅)

  • JavaScript에서 변수와 함수 선언이 코드 실행 전에 메모리에 미리 할당되는 동작을 의미.
  • 즉, 변수와 함수 선언이 코드의 최상단으로 끌어올려지는 것처럼 동작함.

1️⃣ 변수 Hoisting

  • var → 호이스팅 O (초기값 undefined)
  • let, const → 호이스팅 O (하지만 TDZ 때문에 초기화 전 접근 불가 → 오류 발생)

2️⃣ 함수 Hoisting

  • 함수 선언문 (function foo() {}) → 완전히 호이스팅 (호출 가능).
  • 함수 표현식 (const foo = function() {}) → Hoisting은 되지만, 변수가 먼저 undefined로 초기화되므로 호출 불가.

1. let (ES6 추가)

let name = 'ellie'; // 변수 선언
console.log(name); // ellie
name = 'hello'; // 값 변경 가능
console.log(name); // hello

특징

  • 블록 스코프(Block Scope)를 가짐 {} 내부에서만 사용 가능.
  • 값 변경 가능 (mutable).
  • 호이스팅(hoisting)은 되지만 초기화되지 않음 → 사용 전에 반드시 선언해야 함.

2. var (사용 지양)

{
  age = 4; // 선언 없이 할당 가능 (문제 발생 가능)
  var age; // 호이스팅됨
}
console.log(age); // 4 (블록을 빠져나와도 접근 가능)

문제점

  • 호이스팅(Hoisting) 발생 → 변수 선언이 코드의 최상단으로 끌어올려짐.
  • 블록 스코프가 없음 → {} 내부에서 선언해도 바깥에서 접근 가능.
  • 예기치 않은 오류 발생 가능 → 선언 전에 값을 할당해도 오류 발생 X.

결론:
👉 var 대신 let과 const를 사용해야 함!


3. const (값 변경 불가능)

const daysInWeek = 7;
const maxNumber = 5;

특징

  • 상수(Constant)로, 값을 변경할 수 없음.
  • 반드시 선언과 동시에 초기화해야 함.
  • 보안, 성능, 오류 방지를 위해 기본적으로 const 사용 권장.

결론:
👉 const는 변경되지 않는 값(상수) 저장에 사용.
👉 변경해야 하는 값이라면 let을 사용.


2. 불변(Immutable) vs 가변(Mutable) 데이터

1. 불변 데이터 타입 (Immutable)

  • 원시 타입 (Primitive Type): number, string, boolean, null, undefined, symbol
  • 객체 동결 (Object.freeze())

2. 가변 데이터 타입 (Mutable)

  • 객체(Object): JavaScript에서는 객체가 기본적으로 변경 가능(mutable).

불변성을 유지하는 이유

  • 보안(Security): 데이터 조작을 방지.
  • 스레드 안전(Thread Safety): 멀티스레드 환경에서도 안정적으로 작동.
  • 예상치 못한 변경 방지: 코드의 예측 가능성 증가.

3. JavaScript 데이터 타입

원시 타입 (Primitive Types)

number 숫자 (정수, 실수 포함)
string 문자열
boolean 참/거짓 값
null 값이 없음
undefined 값이 할당되지 않음
symbol 고유한 식별자
const count = 17; // 숫자
const size = 17.1; // 실수
console.log(`value: ${count}, type: ${typeof count}`); // number
console.log(`value: ${size}, type: ${typeof size}`); // number

숫자 타입 (Number)

const infinity = 1 / 0; // 무한대
const negativeInfinity = -1 / 0; // 음수 무한대
const nAn = 'not a number' / 2; // NaN (숫자가 아님)
console.log(infinity); // Infinity
console.log(negativeInfinity); // -Infinity
console.log(nAn); // NaN

📌 InfinityNaN(Not a Number) 처리를 잘해야 함!


BigInt (큰 숫자)

const bigInt = 1234567890123456789012345678901234567890n;
console.log(`value: ${bigInt}, type: ${typeof bigInt}`); // bigint

매우 큰 정수를 처리할 때 사용하지만 아직 일반적인 사용은 비추천!


문자열 (String)

const char = 'c';
const brendan = 'brendan';
const greeting = `hello ${brendan}!`; // 템플릿 리터럴
console.log(`value: ${greeting}, type: ${typeof greeting}`); // string

불리언 (Boolean)

const canRead = true;
const test = 3 < 1; // false
console.log(`value: ${canRead}, type: ${typeof canRead}`); // boolean
console.log(`value: ${test}, type: ${typeof test}`); // boolean

❌ false로 취급되는 값: 0, null, undefined, NaN, '' (빈 문자열)
✅ 그 외 모든 값은 true로 평가됨.


null vs undefined

let nothing = null;
console.log(`value: ${nothing}, type: ${typeof nothing}`); // object (오래된 JS 버그)

let x;
console.log(`value: ${x}, type: ${typeof x}`); // undefined

📌 null은 "값이 없음"을 명시적으로 나타냄, undefined는 "변수가 선언되었지만 값이 할당되지 않음".


심볼 (Symbol) - 유일한 식별자

const symbol1 = Symbol('id');
const symbol2 = Symbol('id');
console.log(symbol1 === symbol2); // false (서로 다른 고유 값)

const gSymbol1 = Symbol.for('id');
const gSymbol2 = Symbol.for('id');
console.log(gSymbol1 === gSymbol2); // true (전역 심볼은 같은 키를 공유)
console.log(`value: ${symbol1.description}, type: ${typeof symbol1}`);

📌 객체의 고유한 키를 만들 때 사용!


4. 동적 타이핑 (Dynamic Typing)

JavaScript는 변수 타입을 동적으로 결정하는 언어입니다.

let text = 'hello';
console.log(`value: ${text}, type: ${typeof text}`); // string
text = 1; // 숫자로 변경
console.log(`value: ${text}, type: ${typeof text}`); // number
text = '7' + 5; // 문자열과 숫자를 더하면 문자열이 됨
console.log(`value: ${text}, type: ${typeof text}`); // string
text = '8' / '2'; // 문자열이 숫자로 변환되어 연산 수행
console.log(`value: ${text}, type: ${typeof text}`); // number

📌 JavaScript는 타입이 변할 수 있으므로 예상치 못한 오류가 발생할 수 있음!