JavaScript에서 데이터 타입은 값을 나타내는 중요한 개념입니다. 데이터 타입을 잘 이해하면 코드를 더 정확하게 작성하고 오류를 피할 수 있습니다. JavaScript의 데이터 타입은 크게 기본형(Primitive Type)과 참조형(Reference Type)으로 구분됩니다.
기본형 타입은 하나의 값만 가지며, 불변(immutable)한 특성을 갖습니다. JavaScript에서 제공하는 기본형 타입은 다음과 같습니다.
let price = 19.99;
let name = "John";
let greeting = 'Hello';
let template = `This is a string template`;
let isOpen = true;
let isClosed = false;
let myVar;
console.log(myVar); // 출력: undefined
let emptyValue = null;
let sym = Symbol('description');
참조형 타입은 객체, 배열, 함수 등과 같이 복잡한 데이터 구조를 나타냅니다. 참조형 타입은 메모리 주소를 통해 참조되며, 복사할 때는 값이 아닌 참조형이 복사됩니다.
let person = {
name: "John",
age: 30,
isStudent: false
};
let colors = ["red", "green", "blue"];
function greet(name) {
return `Hello, ${name}!`;
}
동적 타이핑은 변수를 선언할 때 특정 데이터 타입을 미리 지정하지 않는 특징을 말합니다. JavaScript에서는 변수에 할당된 값에 따라 자동으로 변수의 타입이 결정됩니다. 즉, 동일한 변수에 다양한 타입의 값을 할당할 수 있습니다.
let myVar = "Hello, World!"; // myVar는 지금 string 타입
console.log(typeof myVar); // 출력: string
myVar = 42; // 이제 myVar는 number 타입으로 변경
console.log(typeof myVar); // 출력: number
myVar = true; // 이제 myVar는 boolean 타입으로 변경
console.log(typeof myVar); // 출력: boolean
동적 타이핑의 장점
유연성: 같은 변수를 여러 타입으로 재사용할 수 있습니다.
간결한 코드: 타입을 미리 정의할 필요가 없어 코드가 간결해집니다.
동적 타이핑의 단점
타입 안정성 부족: 코드 작성시 타입 오류를 미리 잡아내기 어렵습니다. 런타임 오류가 발생할 가능성이 높아집니다.
가독성 문제: 코드가 복잡해질수록 변수의 타입을 추적하기 어려워질 수 있습니다.
타입 변환은 한 데이터 타입의 값을 다른 데이터 타입으로 변경하는 과정입니다. JavaScript에서는 암시적 타입 변환과 명시적 타입 변환의 두 가지 방식으로 타입 변환이 이루어집니다.
JavaScript는 필요에 따라 자동으로 데이터 타입을 변환합니다. 이 과정을 타입 강제 변환(Type Coercion) 이라고도 합니다.
let result = "5" + 2; // 문자열과 숫자를 더할 때
console.log(result); // 출력: "52" (2가 문자열로 변환된 후 결합됨)
let isTrue = "5" == 5; // 느슨한 동등 비교
console.log(isTrue); // 출력: true ("5"가 숫자 5로 변환된 후 비교됨)
덧셈 연산(+)에서는 문자열이 우선순위를 가지며, 숫자가 문자열로 변환되어 결합됩니다.
느슨한 동등 비교(==)에서는 두 피연산자가 같은 타입이 되도록 자동으로 변환되어 비교됩니다.
개발자가 의도적으로 데이터 타입을 변환하는 것을 의미합니다. 이 경우, number(), string(), boolean() 등의 함수를 사용하거나 간단한 연산자를 이용할 수 있습니다.
let strNum = "123";
let num = Number(strNum); // 문자열을 숫자로 변환
console.log(num); // 출력: 123
console.log(typeof num); // 출력: number
let boolValue = Boolean(0); // 0을 불리언으로 변환
console.log(boolValue); // 출력: false
let numToString = String(42); // 숫자를 문자열로 변환
console.log(numToString); // 출력: "42"
숫자로 변환할 때, Number()는 문자열이나 불리언 값을 숫자로 변환합니다. "123"은 123이 되고, "abc" 같은 변환 불가능한 문자열은 NaN이 됩니다.
불리언으로 변환할 때, Boolean()은 값이 0, null, undefined, NaN, ""(빈 문자열)일 경우 false로, 그 외의 값은 true로 변환됩니다
문자열로 변환할 때, String()은 숫자나 불리언을 문자열로 변환합니다. true는 "true", 42는 "42"가 됩니다.
let input = "42";
// 명시적 타입 변환
let numberInput = Number(input); // "42" -> 42
console.log(numberInput + 10); // 출력: 52
// 암시적 타입 변환
let stringResult = input + 10; // "42" + 10 -> "4210" (10이 문자열로 변환됨)
console.log(stringResult); // 출력: "4210"
// 동적 타이핑
input = true;
let booleanResult = input + 10; // true -> 1 (불리언이 숫자로 변환)
console.log(booleanResult); // 출력: 11
JavaScript의 동적 타이핑은 코드 작성 시 편리하지만, 암시적 타입 변환으로 인해 예상치 못한 결과를 초래할 수 있습니다. 따라서 변환이 필요한 경우 명시적으로 타입 변환을 사용하는 것이 좋습니다.