[Typescript] ๊ตฌ์กฐ์  ํƒ€์ดํ•‘๊ณผ ๋• ํƒ€์ดํ•‘
๐Ÿค” ๊ธฐ์กด์— ์•Œ๊ณ  ์žˆ๋˜ Duck typing๊ณผ Typescript ๊ตฌ์กฐ์  ํƒ€์ดํ•‘์˜ ์ฐจ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  ํ•œ๊ณ„๋ฅผ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.

Duck typing์ด๋ž€ “๋งŒ์•ฝ ์–ด๋–ค ์ƒˆ๊ฐ€ ์˜ค๋ฆฌ์ฒ˜๋Ÿผ ๊ฑท๊ณ , ํ—ค์—„์น˜๊ณ , ๊ฝฅ๊ฝฅ๊ฑฐ๋ฆฌ๋Š” ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ ์ƒˆ๋ฅผ ์˜ค๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ด๋‹ค.” ๋ผ๋Š” ๋ง์—์„œ ํƒ„์ƒํ•˜์˜€์œผ๋ฉฐ, ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„ ์‹œ ๊ฐ์ฒด์˜ ํ–‰์œ„์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ํƒ€์ž… ์ˆ˜์šฉ์„ฑ์„ ์ฒดํฌํ•˜๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

type Person = {
  name: string,
  age: number,
};

const personA = {
  name: 'ํฌ์€',
  age: 27,
};

const duckA = {
  name: '์˜ค๋ฆฌ',
  age: 2,
};

const person: Person = duckA; // it's okay

ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํƒ€์ž… ์—๋Ÿฌ๋ฅผ ์žก์•„๋‚ด๋„๋ก ์„ค๊ณ„ ๋˜์—ˆ์œผ๋‚˜, 2๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ์–‘์ด๋‚˜ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ํƒ€์ž… ์ˆ˜์šฉ์„ฑ์„ ์ฒดํฌํ•˜๋„๋ก ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋Ÿฐํƒ€์ž„์— ๋น„๊ตํ•˜์ง€ ์•Š๋Š” ๋‹ค๋Š” ์ ์—์„œ ๋ช…ํ™•ํžˆ Duck typing ์ด๋ผ ๋ณผ ์ˆ˜๋Š” ์—†์ง€๋งŒ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ง€์ •๋œ class๋‚˜ type์ด ์•„๋‹Œ ๊ตฌ์กฐ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋น„๊ตํ•œ๋‹ค๋Š” ์ ์—์„œ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ “๊ตฌ์กฐ์  ํƒ€์ดํ•‘” ํ˜น์€ “๊ตฌ์กฐ์  ํƒ€์ž… ์‹œ์Šคํ…œ”์ด๋ผ๊ณ  ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Java๋‚˜ C#์—์„œ ์‚ฌ์šฉํ•˜๋Š” “๋ช…๋ชฉ์  ํƒ€์ž… ์‹œ์Šคํ…œ” ์ฆ‰, type์ด๋‚˜ class๋ฅผ ๋ณ€์ˆ˜์— ์ง์ ‘ ์ •ํ•ด๋‘๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋Œ€์กฐ์  ์ž…๋‹ˆ๋‹ค.

 

ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๊ฐ€ ์‹ค์ œ๋กœ ๊ฐ™์€ type์„ ๊ฐ€์ง€๋Š” ์ง€๋ฅผ ๋น„๊ตํ•˜๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๋ณด๋‹ค Unique ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด๋‹น ๊ฐ์ฒด๋งŒ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด ๊ตฌ์กฐ๊ฐ€ ๋น„์Šทํ•œ ๋ณ€์ˆ˜๊ฐ€ ์ƒ๊ธฐ๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค.

type Person = {
  name: string,
  age: number,
  id: number,
};

const personA = {
  name: 'ํฌ์€',
  age: 27,
  id: '970716-xxxxxxx',
};

const duckA = {
  name: '์˜ค๋ฆฌ',
  age: 2,
};

const person: Person = duckA; // it's not okay
๋ฐ˜์‘ํ˜•