๐Ÿ‘จโ€๐Ÿ’ป

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ํƒ€์ž…์„ ์ขํžˆ๋Š” ๋ฐฉ๋ฒ•

์‹ค๋ฌด์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ 1๋…„ ์ •๋„ ๋‹ค๋ฃจ๋ฉฐ ๋” ๊นŠ์€ ์ดํ•ด์˜ ํ•„์š”์„ฑ์„ ๋Š๋ผ๋˜ ์ฐธ์— '์ดํŽ™ํ‹ฐ๋ธŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ'๋ผ๋Š” ์ฑ…์„ ์ฝ๊ฒŒ ๋๊ณ  ์‹ค์šฉ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•„ ์ •๋ฆฌํ•ด๋‘๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ์œ ๋‹ˆ์˜จ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ ํ•ฉ์ง‘ํ•ฉ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด๋”˜๊ฐ€์—์„œ ์›ํ•˜๋Š” ํƒ€์ž…์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ 'ํƒ€์ž… ์ขํžˆ๊ธฐ(narrowing)'๋ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธ€์—๋Š” ํƒ€์ž…์„ ์ขํžˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•˜๊ณ  ์‹ค๋ฌด์—์„œ ํƒœ๊ทธ๋œ ์œ ๋‹ˆ์˜จ(tagged union)์„ ํ™œ์šฉํ•ด ๊ฐœ์„ ํ–ˆ๋˜ ์‚ฌ๋ก€๋ฅผ ๋‹ด์•˜์Šต๋‹ˆ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํŠน์ง•

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž…์€ '์ œ๊ฑฐ ๊ฐ€๋Šฅ(erasable)'ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ๊ณผ์ •์—์„œ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค, ํƒ€์ž…, ํƒ€์ž… ๊ตฌ๋ฌธ์€ ๊ทธ๋ƒฅ ์ œ๊ฑฐ๋˜์–ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

โ€” ์•„์ดํ…œ 3. ์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ํƒ€์ž…์ด ๊ด€๊ณ„์—†์Œ์„ ์ดํ•ดํ•˜๊ธฐ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœ์ ํŠธ์— ์„ค์ •๋œ ๋ฒ„์ „์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ1๋ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜๋œ ๊ฒฐ๊ณผ๋ฌผ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ผ๋Š” ๊ฑด ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํƒ€์ž…๊ณผ ๊ด€๋ จ๋œ ๊ตฌ๋ฌธ๋“ค์ด ์ œ๊ฑฐ๋œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ถ๊ธˆํ•œ ์ ์ด ์ƒ๊น๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์œ ๋‹ˆ์˜จ์œผ๋กœ ์ •์˜๋œ ํƒ€์ž…์„ ์ „๋‹ฌ ๋ฐ›๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํƒ€์ž…์ด ์ œ๊ฑฐ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์—์„œ ์–ด๋–ป๊ฒŒ ํŠน์ • ํƒ€์ž…์ธ ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์šฐ์„  ํƒ€์ž…์ด ์ œ๊ฑฐ๋  ๊ฒฝ์šฐ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํƒ€์ž…์ด ์ •์˜๋œ ์ฝ”๋“œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์„ ์ž‘์„ฑ ๋‹จ๊ณ„์—์„œ ์ •ํ™•ํžˆ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.

interface Dog { run: VoidFunction; } interface Bird { fly: VoidFunction; } function runAway(animal: Dog | Bird) { animal.run(); // ~~~ Property 'run' does not exist on type 'Bird'. }

ํ•˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ์‹ฌ๊ฐํ•œ ๋ฒ„๊ทธ๋ฅผ ์ง€๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์กด์žฌํ•˜๋”๋ผ๋„ ์ฝ”๋“œ ์ƒ์„ฑ(์ปดํŒŒ์ผ)์€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํƒ€์ž„์€ ๋Ÿฐํƒ€์ž„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

โ€” ์•„์ดํ…œ 3. ์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ํƒ€์ž…์ด ๊ด€๊ณ„์—†์Œ์„ ์ดํ•ดํ•˜๊ธฐ

๋งŒ์•ฝ tsconfig.json ํŒŒ์ผ์— noEmitError๋ผ๋Š” ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ํƒ€์ž… ์—๋Ÿฌ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๋Ÿฐํƒ€์ž„์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

function runAway(animal) { animal.run(); } const animal = { fly: () => console.log(`Let's fly!`), }; runAway(animal) // Uncaught TypeError: animal.run is not a function

ํŠน์ • ํƒ€์ž…์„ ๋ณด์žฅํ•˜๋ ค๋ฉด ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ์—์„œ๋„ ํƒ€์ž…์„ ์ขํž ๋ฐฉ์•ˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

null, instanceof, typeof, ์†์„ฑ ์ฒดํฌ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜์˜ ํƒ€์ž…๊ณผ ๋ฌธ๋ฒ•์„ ํ™œ์šฉํ•ด ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ฒดํฌํ•˜๋Š” ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

const button = document.getElementById('button'); // HTMLElement | null // falsy ๊ฐ’ ์ฒดํฌ๋กœ ํƒ€์ž… ์ขํžˆ๊ธฐ if (button) { button // HTMLElement } else { button // null } // ์ธ์Šคํ„ด์Šค ์—ฌ๋ถ€ ์ฒดํฌ๋กœ ํƒ€์ž… ์ขํžˆ๊ธฐ function printTime(date: number | Date) { if (date instanceof Date) { date // Date } else { date // number } } // typeof ์ฒดํฌ๋กœ ํƒ€์ž… ์ขํžˆ๊ธฐ function stringify(value: number | string) { if (typeof value === 'string') { value // string } else { value // number } } // ์†์„ฑ ์œ ๋ฌด ์ฒดํฌ๋กœ ํƒ€์ž… ์ขํžˆ๊ธฐ interface Dog { run: VoidFunction; } interface Bird { fly: VoidFunction; } function runAway(animal: Dog | Bird) { if ('run' in animal) { animal // Dog } if ('fly' in animal) { animal // Bird } }

์ด ๊ธ€์˜ ์ดˆ๋ฐ˜๋ถ€์—์„œ ๋‚˜์™”๋˜ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์„ ์ขํžˆ๋Š” ๋ฌธ์ œ๋Š” ์†์„ฑ ์ฒดํฌ๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค๋ฌด์—์„œ ์ด ๋ฐฉ์‹์„ ์ ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด ์‚ฌ๋ก€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋ชจํŠธ์—์„œ ์ œ๊ณต๋˜๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฑฐ์˜ ์œ ์‚ฌํ•œ UI๋กœ ์ œ๊ณต๋˜๋Š” ์ผ€์ด์Šค์ธ๋ฐ์š”, ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type ArticleA = { field1: string; field2: string; author: string; }; type ArticleB = { field2: string; field3: string; author: string; }; type ArticleC = { field3: string; field4: string; author: string; };

React๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

type Props = { content: ArticleA | ArticleB | ArticleC; }; const Article: FC<Props> = ({ content }) => { return ( <article> <p>{content.author}</p> </article> ); };

์ด ์‹œ์ ๋ถ€ํ„ฐ ๊ณ ๋ฏผ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ณตํ†ต๋œ ํ•„๋“œ์ธ author๋Š” ๋ณ„๋‹ค๋ฅธ ์กฐ๊ฑด ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์œ ๋‹ˆ์˜จ ์—ฐ์‚ฐ์˜ ํŠน์„ฑ์€ ์ด์ „ ๊ธ€์—์„œ ์„ค๋ช…๋œ ๋ฐ” ์žˆ์Šต๋‹ˆ๋‹ค)

ํ•˜์ง€๋งŒ field1๋ถ€ํ„ฐ field4๋Š” ๊ณตํ†ต๋œ ํ•„๋“œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ์ขํžˆ๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ ๋‚˜์˜จ ๋ฐฉ๋ฒ• ์ค‘ ์†์„ฑ ์ฒดํฌ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฆ…๋‹ˆ๋‹ค.

type Props = { content: ArticleA | ArticleB | ArticleC; }; const Article: FC<Props> = ({ content }) => { if ('field1' in content) { content // ArticleA } if ('field2' in content) { content // ArticleA | ArticleB } return (...); };

ArticleA์—๋งŒ ์กด์žฌํ•˜๋Š” field1์€ ์‰ฝ๊ฒŒ ํƒ€์ž… ์ขํ˜€์ง‘๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋‘ ์ธํ„ฐํŽ˜์ด์Šค์— ์กด์žฌํ•˜๋Š” field2๋Š” ์ขํž ๋ฐฉ์•ˆ์ด ๋งˆ๋•…์น˜ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋ชจํŠธ ๋ฐ์ดํ„ฐ ํŠน์„ฑ์ƒ ํ•„๋“œ์˜ ๋ณ€๋™ ๊ฐ€๋Šฅ์„ฑ๋„ ๋ฐฐ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ช…์‹œ์  ํƒœ๊ทธ๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํƒœ๊ทธ๋œ ์œ ๋‹ˆ์˜จ (tagged union)

ํƒœ๊ทธ๋œ ์œ ๋‹ˆ์˜จ ๋˜๋Š” ๊ตฌ๋ณ„๋œ ์œ ๋‹ˆ์˜จ(discriminated union)์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ์ด ๋ฐฉ๋ฒ•์€ ํƒ€์ž…์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ช…์‹œ์  'ํƒœ๊ทธ'๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ž์„œ ๋‚˜์™”๋˜ ๊ฐ ํƒ€์ž…์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

type ArticleA = { kind: 'a'; field1: string; field2: string; author: string; }; type ArticleB = { kind: 'b'; field2: string; field3: string; author: string; }; type ArticleC = { kind: 'c'; field3: string; field4: string; author: string; };

์ด์ œ kind ํ•„๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ฐ ํƒ€์ž…์˜ ํ•„๋“œ ๋ณ€ํ™”์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Props = { content: ArticleA | ArticleB | ArticleC; }; const Article: FC<Props> = ({ content }) => { if (content.kind === 'a') { content // ArticleA } if (content.kind === 'b') { content // ArticleB } return (...); };

์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ๋‹จ์ˆœํ•ด ๋ณด์ด์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์—๋„ ํƒ€์ž…์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ๊ฐ€๋“œ (user-defined type guard)

๋•Œ๋กœ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๋ณด๋‹ค ์ฝ”๋“œ ์ž‘์„ฑ์ž๊ฐ€ ํƒ€์ž…์„ ๋” ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. DOM๊ณผ ๊ด€๋ จ๋œ ์ฒ˜๋ฆฌ๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ถ”์ƒํ™”๋œ ์ˆ˜์ค€์— ๋”ฐ๋ผ DOM ๊ณ„์ธต์˜ ํƒ€์ž…๋“ค์ด ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋Š” ๊ณ„์ธต ๊ตฌ์กฐ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

โ€” ์•„์ดํ…œ 55. DOM ๊ณ„์ธต ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ
ํƒ€์ž…์˜ˆ์‹œ
EventTargetwindow, XMLHttpRequest
Nodedocument, Text, Comment
ElementHTMLElement, SVGElement ํฌํ•จ
HTMLElement<small>, <strong>
HTMLButtonElement<button>

์„œ๋ธŒํƒ€์ž… ๊ด€๊ณ„๊ฐ€ ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— DOM ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ํƒ€์ž…์„ ๊ตฌ์ฒดํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ์–ธ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์•„๋ž˜์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function isInputElement(el: HTMLElement): el is HTMLInputElement { return 'value' in el; } function getElementContent(el: HTMLElement) { if (isInputElement(el)) { el // HTMLInputElement } else { el // HTMLElement } }

๋งˆ๋ฌด๋ฆฌ

๋ถ„๊ธฐ๋ฌธ ์™ธ์—๋„ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ œ์–ด ํ๋ฆ„์„ ์‚ดํŽด๋ณด๋ฉฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํƒ€์ž…์„ ์ขํžˆ๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ€” ์•„์ดํ…œ 22. ํƒ€์ž… ์ขํžˆ๊ธฐ

ํƒ€์ž…์ด ์ขํ˜€์ง€๋Š” ๊ณผ์ •์„ ํ™•์ธํ•  ๋•Œ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋Š” TypeScript Playground ์‚ฌ์ดํŠธ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  VSCode์™€ ๊ฐ™์ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ง€์›์ด ์ž˜๋˜๋Š” IDE์—์„œ๋Š” ์ปค์„œ๋งŒ ์˜ฌ๋ ค๋„ ํƒ€์ž… ์ •๋ณด๊ฐ€ ๋‚˜์˜ค๊ณ , ํƒ€์ž… ์ •์˜๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋กœ์ง์„ ์Œ“์•„๊ฐ€๋Š” ๊ณผ์ •์—์„œ ์ค‘๊ฐ„์ค‘๊ฐ„ ํƒ€์ž…์ด ์–ด๋–ป๊ฒŒ ์ถ”๋ก ๋˜๊ณ  ์žˆ๋Š”์ง€ ์ˆ˜์‹œ๋กœ ํ™•์ธํ•ด์•ผ ๋‚˜์ค‘์— ํƒ€์ž… ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋Ÿฐํƒ€์ž… ๋ถ„๊ธฐ ๋ฌธ๋ฒ•๊ณผ ํƒœ๊ทธ๋œ ์œ ๋‹ˆ์˜จ, ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ๊ฐ€๋“œ ๋“ฑ์˜ ๊ธฐ๋ฒ•์„ ์ž˜ ํ™œ์šฉํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.


Footnotes

  1. ํŠธ๋žœ์ŠคํŒŒ์ผ(translate + compile)์€ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๋™๋“ฑํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํ–‰์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. โ†ฉ