본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

`string`, `number`, `boolean`: 기본값의 정확한 모양

~10 min · primitives, string, number, boolean

Level 0Curious
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete
"string, number, boolean은 익숙해 보여도 JavaScript의 실제 실행 규칙까지 알아야 안전하게 쓸 수 있어."

문자열과 UTF-16

TypeScript의 string은 JavaScript 문자열이야. 작은따옴표, 큰따옴표, 템플릿 리터럴을 모두 쓸 수 있고 별도의 char 타입은 없어. 문자열의 길이와 인덱스는 Unicode 문자가 아니라 UTF-16 코드 단위를 세기 때문에 '😀'.length는 2야. 사용자에게 보이는 문자 단위로 순회하려면 [...str]이나 Array.from(str)처럼 코드 포인트를 인식하는 방법을 써.

number는 한 가지 부동소수점 타입이야

정수와 실수를 나누는 별도 숫자 타입은 없고 모두 IEEE 754 배정밀도 부동소수점인 number야. 그래서 0.1 + 0.2 같은 계산에는 반올림 오차가 생길 수 있어. 정수를 정확히 표현할 수 있는 범위는 -(2 ** 53 - 1)부터 2 ** 53 - 1까지이며 경계는 Number.MAX_SAFE_INTEGER로 확인해. 그보다 큰 정수가 필요하면 bigint를 써.

boolean과 참·거짓 변환

boolean은 true와 false만 받아. 조건문에서는 0, 빈 문자열, null, undefined, NaN이 거짓으로 취급되고 나머지 대부분은 참이지만, 그 실행 규칙이 변수의 정적 타입을 자동으로 boolean으로 바꾸지는 않아. 진짜 boolean 값이 필요하면 Boolean(value)!!value로 명시적으로 변환해.

원시 타입 표기는 간단하지만 실행 의미는 JavaScript가 정해. 문자열의 UTF-16 단위, number의 정밀도, boolean 문맥의 falsy 규칙을 함께 기억해.

피파의 고백

타입 이름 세 개는 하루면 외워도 실행 규칙은 버그가 난 뒤에야 몸에 남기 쉬워. 이모지 길이와 안전한 정수 경계처럼 짧은 예제를 직접 실행해 보는 편이 가장 빨라.

Code

소문자 primitive, 대문자 wrapper 아님·typescript
// 3개 primitive, 모든 모양.

const name: string = 'Pippa';
const alt: string = `Hi, ${name}`;          // template literal — 여전히 string
const escaped: string = "don't quote me";   // single, double, template — 다 string

const age: number = 21;
const pi: number = 3.14159;
const broken: number = NaN;                  // 여전히 number
const max: number = Number.MAX_SAFE_INTEGER; // 2^53 - 1

const online: boolean = true;
const inverse: boolean = !online;            // false

// 흔한 실수 — wrapper-object 타입:
const wrong: String = 'Pippa';               // ⚠️ 컴파일 됨, 근데 lint 가 flag
// 항상 소문자 primitive 형태 써: string, number, boolean.
모든 TS dev 가 일찍 한 번 맞을 만한 number gotcha 2개·typescript
// 일찍 알아둘 number gotcha 2개.

// 1. Integer 타입 없음 — 다 double.
const tiny = 0.1 + 0.2;                      // 0.30000000000000004 — IEEE 754 현실

if (tiny === 0.3) {
  // ❌ 도달 안 됨
} else {
  console.log('Float 가 거짓말함. 비교엔 Number.EPSILON 써.');
}

// 2. NaN 은 NaN 과 같지 않아.
const notANumber = NaN;
if (notANumber === NaN) {
  // ❌ 도달 안 됨 — spec 상 NaN !== NaN
}
if (Number.isNaN(notANumber)) {
  // ✅ 실제로 체크하는 법
}

External links

Exercise

formatPrice(amount: number, currency: string): string을 작성해 '$12.34' 같은 문자열을 반환해. 반환 타입을 에디터에서 확인한 다음 formatPrice('12', 'USD')를 호출해 첫 번째 인자의 오류가 어떻게 설명되는지 읽어 봐.
Hint
잘못된 인자 타입을 넘기면 실행 전에 호출 자리에서 오류가 나야 해. 오류가 기대한 매개변수와 실제 값의 차이를 정확히 가리키는지 읽어 봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.