unknown과 any 이해하기
unknown이 any에 대한 타입 안전 대안인 이유를 알아봅니다.
unknown과 any 이해하기은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
최상위 타입 두 가지
TypeScript에는 any 값을 담을 수 있는 두 타입, any와 unknown이 있습니다. 겉보기에는 비슷하지만 동작은 매우 다릅니다. 올바른 타입을 선택하는 것은 타입 안전한 코드를 작성하는 핵심 기술입니다.
let a: any = 5;
let u: unknown = 5;
console.log(a, u);any는 타입 검사를 비활성화함
any는 해당 값에 대한 타입 검사를 끄는 탈출구입니다. 어떤 속성에도 접근하고 함수처럼 호출할 수 있으며, 실행 시점에 문제가 발생할 코드라도 컴파일러는 침묵합니다.
const a: any = 'hello';
console.log(a.toUpperCase()); // OK
// a.doesNotExist(); // no compile error, but crashes at runtimeunknown은 검사를 강제함
unknown도 어떤 값이든 허용하지만, 그 값이 무엇인지 증명하기 전에는 사용할 수 없습니다. 타입을 좁힐 때까지 컴파일러가 속성 접근과 호출을 차단합니다.
const u: unknown = 'hello';
// console.log(u.toUpperCase()); // Error: u is unknown
console.log(typeof u);typeof로 unknown 좁히기
typeof 가드는 블록 안에서 unknown을 구체적인 타입으로 좁힙니다. 타입이 좁혀진 뒤에는 해당 타입의 모든 메서드를 안전하게 사용할 수 있습니다.
function shout(value: unknown): string {
if (typeof value === 'string') {
return value.toUpperCase(); // safe here
}
return 'not a string';
}
console.log(shout('hi'), shout(42));unknown이 더 안전한 이유
unknown은 ‘아직 이것이 무엇인지 모른다’는 정직한 불확실성을 나타냅니다. 사용하기 전에 검증하도록 하여 컴파일 시점에 버그를 찾게 합니다. any는 불확실성과 버그를 그저 숨길 뿐입니다.
function len(value: unknown): number {
if (typeof value === 'string') return value.length;
if (Array.isArray(value)) return value.length;
return 0;
}
console.log(len('abc'), len([1, 2]), len(99));unknown으로 할당하기와 unknown에서 할당하기
모든 값은 to unknown으로 할당할 수 있습니다. 하지만 unknown은 unknown이나 any에만 할당할 수 있으며, 타입을 좁히지 않고는 구체적인 타입에 할당할 수 없습니다. 이러한 비대칭성이 안전성을 지켜 줍니다.
let u: unknown = 10;
u = 'now a string';
u = true;
const anyVal: any = u; // allowed
console.log(anyVal);
// const s: string = u; // Errorany는 코드 전체로 퍼짐
any의 위험한 특성 중 하나는 전파된다는 점입니다. 값이 한 번 any가 되면 그 값에서 파생된 모든 것도 조용히 any가 되어 프로그램 전체의 타입 안전성을 약화시킵니다.
const a: any = { count: 5 };
const total = a.count + 10; // total is any
const flag = total.whatever; // still any, no error
console.log(total);unknown은 위험을 가둠
unknown을 사용하면 불확실성이 그 자리에 머뭅니다. 각 경계에서 명시적으로 타입을 좁혀야 하므로 안전하지 않은 작업이 다른 곳으로 새어 나갈 수 없습니다. 위험을 있어야 할 곳에 가둘 수 있습니다.
const u: unknown = { count: 5 };
if (typeof u === 'object' && u !== null && 'count' in u) {
console.log('Has count property');
}API와 JSON 경계에 타입 지정하기
외부 데이터(JSON, 네트워크 응답, 사용자 입력)에는 아무런 보장도 없습니다. 이를 any 대신 unknown으로 지정하면 신뢰하기 전에 검증하도록 강제할 수 있으므로 안전한 기본값이 됩니다.
function parse(text: string): unknown {
return JSON.parse(text);
}
const data = parse('{"id":1}');
if (typeof data === 'object' && data !== null) {
console.log('Got an object');
}any를 사용해도 되는 경우
any가 실용적인 경우도 있습니다. 빠른 프로토타입, JavaScript에서의 점진적 마이그레이션, 타입이 지정되지 않은 라이브러리와의 상호 운용 등이 그 예입니다. 하지만 any를 습관이 아닌 임시 표시로 취급하십시오. 가능하면 언제나 unknown을 우선 사용하십시오.
// Migration placeholder, to be typed later
let legacy: any = getLegacyValue();
function getLegacyValue() { return { x: 1 }; }
console.log(legacy.x);실용적인 비교
나란히 비교해 보겠습니다. any 버전은 컴파일되지만 실행 중에 오류가 발생할 수 있고, unknown 버전은 안전하지 않은 접근을 컴파일 단계에서 거부합니다. 컴파일러가 여러분을 보호하는 본연의 역할을 수행하는 것입니다.
const a: any = 42;
console.log(a.toFixed(2)); // OK by luck
const u: unknown = 42;
if (typeof u === 'number') {
console.log(u.toFixed(2)); // checked, safe
}빠른 확인
unknown과 any에 대한 이해도를 확인해 보십시오.
복습: unknown과 any 비교
핵심 내용:
any는 타입 검사를 비활성화하고 파생된 값 전체로 전파됩니다.unknown은 어떤 값이든 허용하지만 타입을 좁히기 전까지 사용을 차단합니다.- 외부 데이터(JSON, API, 사용자 입력)에는
unknown을 사용해 검증을 강제하십시오. - 마이그레이션이나 타입이 지정되지 않은 상호 운용에는
any를 임시 표시로만 사용하십시오.
다음에는 빈 타입인 never를 살펴봅니다.
function safeLen(v: unknown): number {
return typeof v === 'string' ? v.length : 0;
}
console.log(safeLen('hello'), safeLen(123));자주 묻는 질문
“unknown과 any 이해하기” 강의는 무료인가요?
네 — “unknown과 any 이해하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“unknown과 any 이해하기”에서 뭘 배우나요?
unknown이 any에 대한 타입 안전 대안인 이유를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“unknown과 any 이해하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- unknown과 any 이해하기
- never 타입과 불가능한 상태
- 함수에서의 void 타입
- unknown의 타입 안전한 처리