ahn heejong

ํƒ€์ž…๊ณผ ํƒ€์ž… ์‹œ์Šคํ…œ : ์—ฐ์žฌ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ

2017-10-11
ํƒ€์ž…
ํƒ€์ž… ์‹œ์Šคํ…œ
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
ํ•˜์Šค์ผˆ

ํƒ€์ž…๊ณผ ํƒ€์ž… ์‹œ์Šคํ…œ : ์—ฐ์žฌ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ

๋“ค์–ด๊ฐ€๋ฉฐ

ํƒ€์ž…type.

TypeError: unsupported operand type(s) for +: 'int' and 'str'
TypeError: "x" is not a function

ํƒ€์ž…!

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ผ๋ฉด ์ด ๋‹จ์–ด๋ฅผ ํ•˜๋ฃจ์—๋„ ๋ช‡ ๋ฒˆ์€ ๋งˆ์ฃผํ•  ๊ฒƒ์ด๋‹ค. ํƒ€์ž…์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ์—๋„, ๋ฌธ์„œ๋ฅผ ์ฝ์„ ๋•Œ๋„, ๋˜ ๋””๋ฒ„๊น…์„ ํ•  ๋•Œ๋„ ์ค‘์š”ํ•œ ์š”์†Œ๋กœ ์ž‘์šฉํ•œ๋‹ค. ํ›Œ๋ฅญํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ๊ฐ€์ง„ ์–ธ์–ด๋ฅผ ์“ธ๋• ํƒ€์ž… ์ฒด์ปคtype checker๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‹ค์ˆ˜๋ฅผ ์žก์•„์ค˜ ๋งˆ์น˜ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ๋“ฏํ•œ ์‹ ๊ธฐํ•œ ๊ฒฝํ—˜์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ํ•œํŽธ ์‚ฌ๋ ค ๊นŠ์ง€ ์•Š๊ฒŒ ๊ตฌํ˜„๋œ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ๋ณ„๋กœ ๋„์›€์€ ์ฃผ์ง€ ์•Š์œผ๋ฉฐ โ€๋Œ€์ฒด ์™œ ์ด๊ฑธ ์ผ์ผ์ด ์ ์–ด์ค˜์•ผ ํ•˜๋Š” ๊ฑฐ์•ผโ€ ๋”ฐ์œ„์˜ ๋ถˆํ‰๋งŒ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๋Š” ์ฃผ๋ฒ” ์ทจ๊ธ‰์„ ๋ฐ›๊ธฐ๋„ ํ•œ๋‹ค.

์–ด๋Š ์ชฝ์ด๋“ , ํƒ€์ž…๊ณผ ํƒ€์ž… ์‹œ์Šคํ…œtype system์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ต‰์žฅํžˆ ํฐ ๋น„์ค‘์„ ์ฐจ์ง€ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ๋„ ์ด ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃจ๋Š” ์ž๋ฃŒ ๋Œ€๋ถ€๋ถ„์ด ํŠน์ • ์–ธ์–ด์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๋Š” ์ˆ˜์ค€์—์„œ ๊ทธ์นœ๋‹ค. ๊ทธ ๋•Œ๋ฌธ์— ํƒ€์ž… ์‹œ์Šคํ…œ ์ „๋ฐ˜์— ๋Œ€ํ•œ ์ง€์‹์„ ํญ๋„“๊ฒŒ ๋‹ค๋ฃจ๋Š” ์ž๋ฃŒ๊ฐ€ ๋„ˆ๋ฌด ์—†๋‹ค๋Š” ์•„์‰ฌ์›€์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฐ ์•„์‰ฌ์›€์„ ํ•ด์†Œํ•˜๊ณ ์ž ํ•˜๋Š” ์กฐ๊ทธ๋งŒ ์‹œ๋„์˜ ํ•˜๋‚˜๋กœ ํƒ€์ž…๊ณผ ํƒ€์ž… ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์—ฐ์žฌ๋ฅผ ํ•ด๋ณด๋ ค ํ•œ๋‹ค.

๋ถ€๋”” ์ฆ๊ธฐ์‹œ๊ธธ!

๋…์ž๋ถ„๋“ค๊ป˜

ํ‰์–ด์ฒด๋กœ ์จ๋†“์œผ๋‹ˆ ์™œ์ธ์ง€ ์–ด์ƒ‰ํ•˜์—ฌ ์ด ๋ถ€๋ถ„๋งŒ ๊ฒฝ์–ด์ฒด๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด ์ฃผ์ œ๋กœ ํ•™์œ„๋ฅผ ๋ฐ›์€ ์ ๋„ ์—†๊ฑฐ๋‹ˆ์™€ ๊ฐ€์ง„ ๊ฒฝ๋ ฅ๋„ ๊ทธ๋‹ค์ง€ ๊ธธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธ€์„ ์จ๋‚˜๊ฐ€๋ฉฐ ๊ณต๋ถ€๋ฅผ ๊ฒŒ์„๋ฆฌํ•˜์ง€ ์•Š๊ฒ ์œผ๋‚˜ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ๋งŽ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธ€์—์„œ ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ๋ฐœ๊ฒฌํ•˜์‹ ๋‹ค๋ฉด ๋ถ€๋”” ๋ฉ”์ผ ๋“ฑ์˜ ์ˆ˜๋‹จ์œผ๋กœ ์•Œ๋ ค์ฃผ์‹œ๊ธธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด์–ด์งˆ ๊ธ€๋“ค์ด ์ฒซ ์„ ๋ณด์ž„ ์ดํ›„์—๋„ ๋…์ž๋ถ„๋“ค๊ป˜์„œ ์ง€์ /๋ณด์ถฉํ•ด ์ฃผ์‹  ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊พธ์ค€ํžˆ ๋‚˜์•„์ง€๋Š” ๊ฒƒ์ด ์ €์˜ ๋ฐ”๋žŒ์ž…๋‹ˆ๋‹ค. ๊ผญ ์ง€์ ์ด ์•„๋‹ˆ๋”๋ผ๋„ ์—ฐ์žฌ์— ๊ด€ํ•œ ์–ด๋–ค ์˜๊ฒฌ์ด๋“  ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. โค๏ธ

๋˜ํ•œ ์ €๋Š” ์ด ์—ฐ์žฌ๊ฐ€ ํƒ€์ž… ์‹œ์Šคํ…œ์— ์ด๋ฏธ ํฐ ๊ด€์‹ฌ์„ ๋‘๊ณ  ์žˆ๋Š” ์ผ๋ถ€๋งŒ์ด ์ฆ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์—์„œ ๋ฒ—์–ด๋‚˜, ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ํฅ๋ฏธ๋กญ๊ฒŒ ์ฝํžˆ๊ณ  ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ ๋•Œ๋ฌธ์— ์ด๋ก ์  ์—„๋ฐ€์„ฑ์„ ๋‹ค์†Œ ํฌ์ƒํ•˜๋Š” ํ•œ์ด ์žˆ๋”๋ผ๋„ ์ €์™€ ๊ฐ™์€ ๋ณดํ†ต์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ๋”์šฑ ์‰ฝ๊ฒŒ ๋‹ค๊ฐ€๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ ๊ธธ์„ ํƒํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋„ˆ๊ทธ๋Ÿฌ์šด ์–‘ํ•ด ๋ฐ”๋ž๋‹ˆ๋‹ค. ์—ฐ์žฌ์˜ ๊ธฐ์กฐ์— ๋Œ€ํ•œ ์˜๊ฒฌ๋„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. โค๏ธ


ํƒ€์ž…๊ณผ ํƒ€์ž… ์‹œ์Šคํ…œ, ํ˜„ ์œ„์น˜

ํ”ํžˆ ํƒ€์ž… ์‹œ์Šคํ…œ์€ (ํŠนํžˆ ์ƒˆ๋กœ์šด ์–ธ์–ด์— ๋ง‰ ๋ฐœ์„ ๋“ค์ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ) ๋ณ„๋ฌธ์ œ ์—†์–ด ๋ณด์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ๋…ธ๋ ฅ์„ ๋” ๋“ค์ด๊ฒŒ ๋งŒ๋“œ๋Š” ๊นŒ๋‹ค๋กœ์šด ์ž”์†Œ๋ฆฌ๊พผ์œผ๋กœ ์ธ์‹๋˜๊ณค ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Š” ๋ถ€์ •์ ์ธ ํŽธ๊ฒฌ์— ๋ถˆ๊ณผํ•˜๋‹ค. ๊ฒฌ๊ณ ํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ํ†ตํ•ด, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š”:

  • (์ฃผ์„๊ณผ ๋‹ค๋ฅด๊ฒŒ) ํ•ญ์ƒ ํ”„๋กœ๊ทธ๋žจ์˜ ์ตœ์‹  ์ƒํƒœ์™€ ํ•ฉ์น˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์„ ๊ธฐ์ˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • IDE๋ฅผ ๋น„๋กฏํ•œ ๋‹ค์–‘ํ•œ ๋„๊ตฌ์—๊ฒŒ ๋„์›€์„ ์คŒ์œผ๋กœ์จ ์ž๋™ ์™„์„ฑ ๋“ฑ์˜ ๊ธฐ๋Šฅ์˜ ์‚ฌ์šฉ์„ ์ˆ˜์›”ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํ”„๋กœ๊ทธ๋žจ์˜ ํƒ€์ž…์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ์ •์  ํƒ€์ดํ•‘์˜ ๊ฐ€์น˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ปค๋ฎค๋‹ˆํ‹ฐ ์‚ฌ์ด์—์„œ ๋‚ ์ด ๊ฐˆ์ˆ˜๋ก ์ ์  ์ธ์ •๋ฐ›๋Š” ์ถ”์„ธ๋‹ค. Python์˜ mypy์™€ 3.5 ๋ฒ„์ „์—์„œ ์ •์‹ ๋ฌธ๋ฒ•์— ๋“ค์–ด์˜จ ์˜ต์…”๋„ ํƒ€์ž… ํžŒํŒ… ๋ฌธ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  Javascript์˜ Flow์™€ TypeScript ๋“ฑ ๊ธฐ์กด์—๋Š” ๋Ÿฐํƒ€์ž„์—๋งŒ ํƒ€์ž…์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋˜ ์–ธ์–ด์— ์ •์  ํƒ€์ดํ•‘์„ ๋„์ž…ํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ํ™œ๋ฐœํžˆ ์ด๋ฃจ์–ด์ง€๊ณ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์ด๋Ÿฌํ•œ ๊ธฐ๋ฅ˜๋ฅผ ์ฆ๋ช…ํ•œ๋‹ค.

โ€˜ํƒ€์ž…์Šคํฌ๋ฆฝํŠธโ€™ ์ฃผ์ œ Google Trends โ€˜ํƒ€์ž…์Šคํฌ๋ฆฝํŠธโ€˜ ์ฃผ์ œ Google Trends

โ€˜mypyโ€™ ๊ฒ€์ƒ‰์–ด Google Trends โ€˜mypyโ€™ ๊ฒ€์ƒ‰์–ด Google Trends

์ธ๊ธฐ์™€ ๋ณ„๊ฐœ๋กœ ์‹ค์งˆ์ ์ธ ํšจ๊ณผ์— ๋Œ€ํ•œ ์˜๋ฌธ์—๋Š” ์ง€๋‚œ 5์›” ICSE 2017์— ๋ฐœํ‘œ๋œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์ •์  ํƒ€์ž… ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์„ํ•œ ๋…ผ๋ฌธ To type or not to: quantifying detectable bugs in JavaScript. ์ด ํ•˜๋‚˜์˜ ๋‹ต์„ ์ œ์‹œํ•  ๊ฒƒ์ด๋‹ค. ์ด ๋…ผ๋ฌธ์€ ์ •์  ํƒ€์ž… ์‹œ์Šคํ…œ์„ ๋„์ž…ํ–ˆ๋”๋ผ๋ฉด Github์— ๊ณต๊ฐœ์ ์œผ๋กœ ์˜ฌ๋ผ์˜จ ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ์ค‘ ์ตœ์†Œ 15%๋Š” ์ปค๋ฐ‹์กฐ์ฐจ ๋˜์ง€ ๋ชปํ•˜๊ณ  ์žกํ˜”์„ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์žˆ๋‹ค. ์ด ๊ฒฐ๊ณผ์˜ ์˜์˜์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ๋…ผ๋ฌธ ๋‚ด์— ์ธ์šฉ๋œ Microsoft ์‚ฌ์˜ ์—”์ง€๋‹ˆ์–ด๋ง ๋งค๋‹ˆ์ €์˜ ๋ฐœ์–ธ์„ ์žฌ์ธ์šฉ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐˆ์Œํ•œ๋‹ค.

์ถฉ๊ฒฉ์ ์ด๋‹ค. ๋งŒ์•ฝ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ์‹์— ์–ด๋–ค ๋ณ€ํ™”๋ฅผ ์ฃผ์–ด์„œ ์ €์žฅ์†Œ์— ๋“ค์–ด์˜ค๋Š” ๋ฒ„๊ทธ์ค‘ 10% ์ด์ƒ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ณ ๋ฏผํ•  ์ด์œ ๊ฐ€ ์ „ํ˜€ ์—†๋‹ค. ๊ฐœ๋ฐœ์— ์“ฐ์ด๋Š” ๋“œ๋Š” ์‹œ๊ฐ„์ด ๋‘ ๋ฐฐ ์ด์ƒ ๋Š˜์–ด๋‚˜๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š๋Š” ํ•œ, ์šฐ๋ฆฌ๋Š” ๊ทธ ๋ณ€ํ™”๋ฅผ ํƒํ•  ๊ฒƒ์ด๋‹ค. Thatโ€™s shocking. If you could make a change to the way we do development that would reduce the number of bugs being checked in by 10% or more overnight, thatโ€™s a no-brainer. Unless it doubles development time or something, weโ€™d do it.


ํƒ€์ž…๊ณผ ํƒ€์ž… ์‹œ์Šคํ…œ

๊ทธ๋ ‡๋‹ค๋ฉด ๊ณผ์—ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํƒ€์ž…์ด๋ž€ ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ์—ญํ• ์€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด์ž.

ํƒ€์ž…์˜ ์˜์˜

ํƒ€์ž…์€ ํ”„๋กœ๊ทธ๋žจ์˜ โ€˜์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘โ€™์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์˜๋„๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋‘ ์ •์ˆ˜๋ฅผ ๋”ํ•˜๋Š” ์ž‘์—…๊ณผ ๊ธฐ๊ณ„์˜ ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ ์–ด๋–ค ๊ฐ’๋งŒํผ ๋–จ์–ด์ง„ ์ฃผ์†Œ๋ฅผ ์ฐพ๋Š” ์ž‘์—…์„ ์ƒ๊ฐํ•ด๋ณด์ž. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋‘ ์—ฐ์‚ฐ์„ ์ „ํ˜€ ๋‹ค๋ฅธ ์˜๋„๋กœ ์ž‘์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ฒ ์ง€๋งŒ, ์ด ๋‘ ์—ฐ์‚ฐ ๋ชจ๋‘ ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆ˜์ค€์—์„œ๋Š” โ€œํ•œ ๊ฐ’์— ๋‹ค๋ฅธ ๊ฐ’์„ ๋”ํ•œ๋‹คโ€๋ผ๋Š” ๊ฐ™์€ ์—ฐ์‚ฐ์œผ๋กœ ํ™˜์›๋œ๋‹ค.

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

์ฃผ์„์ด๋‚˜ ๋ณ€์ˆ˜๋ช…๊ณผ ๋‹ค๋ฅด๊ฒŒ ํƒ€์ž…์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹ค์ œ ๋™์ž‘๊ณผ ์ผ์ • ์ˆ˜์ค€ ์ด์ƒ์œผ๋กœ ๋™๋–จ์–ด์งˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋œ๋‹ค. ์•„๋ž˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋ณด์ž.

// ์ž๊ธฐ ์ž์‹ ์„ ๋ฆฌํ„ดํ•œ๋‹ค
function sum(a, b) {
  return a + b;
}

function concat_string(a, b) {
  return a - b;
}
concat_string("a", "b") // NaN

์œ„์˜ concat_string, sum ํ•จ์ˆ˜๋Š” ๊ฐ๊ฐ ์ฃผ์„ ๋˜๋Š” ํ•จ์ˆ˜๋ช…์„ ์ฝ๊ณ  ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ๋Š” ์ „ํ˜€ ๋™๋–จ์–ด์ง„ ๋™์ž‘์„ ํ•˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋‘ ํ•จ์ˆ˜๋Š” ๋ถ„๋ช… ์œ ํšจํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์ด๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰๊ธฐ๋Š” ์กฐ๊ธˆ์˜ ๊ฑฐ๋ฆฌ๋‚Œ๋„ ์—†์ด ์ด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ์ฃผ์„๊ณผ ๋ณ€์ˆ˜๋ช…์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹ค์ œ ๋™์ž‘๊ณผ ์ง์ ‘ ๊ฒฐํ•ฉํ•˜์ง€ ์•Š๋Š”, ์ƒ๋Œ€์ ์œผ๋กœ ์ถ”์ƒ์ ์ธ ์ •๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Ÿฐ ๋ถˆ์ผ์น˜์— ๋ถˆ๋งŒ์„ ๊ฐ€์ง€๋Š” ๊ฑด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฟ์ผ ๊ฒƒ์ด๋‹ค.

๋ฐ˜๋ฉด ํƒ€์ž…์€ ์–ด๋–จ๊นŒ? ์•„๋ž˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

type IdentityFunction = (a: number) => number
const sum: IdentityFunction = (a: number, b: number) => {
    return a + b;
}
// error TS2322: Type '(a: number, b: number) => number' is not assignable to type 'IdentityFunction'.

function concat_string(a: string, b: string): string {
    return a - b;
}
// error TS2322: Type 'number' is not assignable to type 'string'.
// error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.
// error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.

๋‘ ํ•จ์ˆ˜๋Š” ๊ฐ๊ฐ ํ•จ์ˆ˜ ์•„๋ž˜์— ์ฃผ์„์œผ๋กœ ์ ํ˜€์ง„ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ํƒ€์ž… ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜๋‹จ์ด ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฃผ์„์ด๋‚˜ ๋ณ€์ˆ˜๋ช…๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ, ํƒ€์ž… ์ •์˜์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ์‹คํ–‰ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์€ ํƒ€์ž…์„ ์•ž์„œ ์–ธ๊ธ‰๋œ ๋‹ค๋ฅธ ์ˆ˜๋‹จ๋ณด๋‹ค ํ›Œ๋ฅญํ•œ ๋ช…์„ธ ์ˆ˜๋‹จ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘๊ณผ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•œ, โ€œ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘โ€์— ๋Œ€ํ•œ ๊ธฐ์ˆ  ์ˆ˜๋‹จ์ด๋ผ๋Š” ํƒ€์ž…์˜ ์˜์˜์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ๋‹ค๋ฃจ์–ด ๋ณด์•˜๋‹ค. ๋‹ค์Œ์œผ๋กœ โ€˜๊ฐ’์ด ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹คโ€™๋Š” ๊ฐœ๋…์„ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„์ง€ ์‚ดํŽด๋ณด์ž.

์ง‘ํ•ฉ์œผ๋กœ ํƒ€์ž… ์ดํ•ดํ•˜๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ํƒ€์ž…์€ ์ˆ˜ํ•™์—์„œ์˜ ์ง‘ํ•ฉ๊ณผ ๋งค์šฐ ๋งŽ์€ ํŠน์ง•์„ ๊ณต์œ ํ•œ๋‹ค.

์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด L๋กœ ์“ฐ์ธ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ’์˜ ์ง‘ํ•ฉ V๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. ์ด๋•Œ, V์˜ ์›์†Œ ์ค‘ ํŠน์ •ํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’๋“ค์„ ๋ชจ์€ ์ง‘ํ•ฉ์„ L์—์„œ์˜ ํƒ€์ž… T๋ผ๊ณ  ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, MIN_INT, MIN_INT + 1, ..., 0, 1, 2, ..., MAX_INT ๋ผ๋Š” ๊ฐ’์„ ๋ชจ๋‘ ๋ชจ์€ ์ง‘ํ•ฉ์„ Integer ๋ผ๋Š” ํƒ€์ž…์œผ๋กœ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

์ด๋ ‡๊ฒŒ ํƒ€์ž…์„ ์ง‘ํ•ฉ์œผ๋กœ์„œ ๋ฐ”๋ผ๋ณผ ๋•Œ, ์•„๋ž˜์™€ ๊ฐ™์€ ๋Œ€์‘ ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค.

  • ์›์†Œ x๊ฐ€ ์ง‘ํ•ฉ S์— ์†ํ•œ๋‹ค (x โˆˆ S) ๐Ÿ‘‰ ๊ฐ’ x๋Š” S ํƒ€์ž…์— ์†ํ•œ๋‹ค. (ํ˜น์€ S ํƒ€์ž…์„ ๊ฐ’ x์— ํ• ๋‹นassignํ•  ์ˆ˜ ์žˆ๋‹ค.)
  • ํ•œ ์›์†Œ๊ฐ€ ์—ฌ๋Ÿฌ ์ง‘ํ•ฉ์— ์†ํ•  ์ˆ˜ ์žˆ๋‹ค ๐Ÿ‘‰ ํ•œ ๊ฐ’์ด ์—ฌ๋Ÿฌ ํƒ€์ž…์— ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ง‘ํ•ฉ T๊ฐ€ ์ง‘ํ•ฉ S์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด๋‹ค (T โŠ‚ S) ๐Ÿ‘‰ ํƒ€์ž… T๊ฐ€ ํƒ€์ž… S์˜ ์„œ๋ธŒํƒ€์ž…subtype์ด๋‹ค.
  • ์กฐ๊ฑด ์ œ์‹œ๋ฒ•์„ ์ด์šฉํ•ด ๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” ์ง‘ํ•ฉ์œผ๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ์ง‘ํ•ฉ์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค ( Sโ€™ = { (x, y) | x โˆˆ S, y โˆˆ S }) ๐Ÿ‘‰ ๊ธฐ์กด ํƒ€์ž…์˜ ์ •์˜๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจ๋“  ์ง‘ํ•ฉ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ธ ๊ณต์ง‘ํ•ฉ ร˜์ด ์กด์žฌํ•œ๋‹ค ๐Ÿ‘‰ ๋ชจ๋“  ํƒ€์ž…์˜ ์„œ๋ธŒํƒ€์ž…์ธ ๋ฐ”๋‹ฅ ํƒ€์ž…bottom type์ด ์กด์žฌํ•œ๋‹ค (ํ˜น์€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค).

๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์œ„์˜ ๋น„์œ ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด์ž.

  • L ์ฝ”๋“œ์—์„œ์˜ ๊ฐ’ 0์€ ์œ„์—์„œ ์ •์˜ํ•œ Integer ์ง‘ํ•ฉ์˜ ์›์†Œ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๊ฐ’ 0์— Integer ๋ผ๋Š” ํƒ€์ž…์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
  • V์˜ ๊ฐ’ ์ค‘ 0๊ณผ 1๋งŒ์„ ์›์†Œ๋กœ ๊ฐ–๋Š” ์ง‘ํ•ฉ์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ง‘ํ•ฉ์„ Binary ๋ผ๋Š” ํƒ€์ž…์ด๋ผ๊ณ  ๋ถ€๋ฅด์ž. ์ด๋•Œ, ๊ฐ’ 0์€ Integer ํƒ€์ž…๊ณผ Binary ํƒ€์ž…์— ๋™์‹œ์— ์†ํ•œ๋‹ค.
  • Binary ํƒ€์ž…์— ๋Œ€์‘ํ•˜๋Š” ์ง‘ํ•ฉ์˜ ๋ชจ๋“  ์›์†Œ๋Š” Integer ํƒ€์ž…์— ๋Œ€์‘ํ•˜๋Š” ์ง‘ํ•ฉ์˜ ์›์†Œ์ด๋‹ค. ๋”ฐ๋ผ์„œ Binary ํƒ€์ž…์€ Integer ํƒ€์ž…์˜ ์„œ๋ธŒํƒ€์ž…์ด๋‹ค. ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด, Integer ํƒ€์ž… ๊ฐ’์„ ํ•„์š”๋กœ ํ•˜๋Š” ์ž„์˜์˜ ์ž๋ฆฌ์— Binary ํƒ€์ž…์˜ ๊ฐ’์„ ๋„ฃ์–ด๋„ ํ”„๋กœ๊ทธ๋žจ์€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•  ๊ฒƒ์ด ๋ณด์žฅ๋œ๋‹ค.
  • ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํƒ€์ž…์„ ์ด์šฉํ•ด ๋”์šฑ ๋ณต์žกํ•œ ์ž๋ฃŒํ˜•์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฌธ์ž์—ด ํƒ€์ž…์œผ๋กœ๋ถ€ํ„ฐ ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด ํ•„๋“œ๋ฅผ ๊ฐ–๋Š” ํ’€ ๋„ค์ž„์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. (interface FullName = { first: string; last: string; } )
  • ๋ฐ”๋‹ฅ ํƒ€์ž…์˜ ์กด์žฌ ์—ฌ๋ถ€๋Š” ์–ธ์–ด์˜ ๊ตฌํ˜„๋งˆ๋‹ค ๋‹ค๋ฅธ๋ฐ, ๊ทธ์ค‘ ํ•œ ์˜ˆ๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ never ํƒ€์ž…์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์„œ์— ์“ฐ์—ฌ ์žˆ๋“ฏ, never ํƒ€์ž…์„ ๊ฐ–๋Š” ์‹ค์ œ ๊ฐ’์€ ์กด์žฌํ•  ์ˆ˜ ์—†๊ณ , never ํƒ€์ž…์€ ๋ชจ๋“  ํƒ€์ž…์˜ ์„œ๋ธŒํƒ€์ž…์ด๋ฉฐ, ๋‹ค๋ฅธ ์–ด๋–ค ํƒ€์ž…๋„ never ํƒ€์ž…์˜ ์„œ๋ธŒํƒ€์ž…์ด ๋  ์ˆ˜ ์—†๋‹ค.

์ด๋Ÿฌํ•œ ๋งฅ๋ฝ์—์„œ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ ์ž๋ฃŒํ˜•์€ ์–ธ์–ด๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ฐ’ ์ค‘ ํŠน์ •ํ•œ ์œ ์šฉํ•œ ํŠน์„ฑ์„ ๊ณต์œ ํ•˜๋Š” ์ผ๋ถ€ ๊ฐ’๋“ค์„ ๋ฏธ๋ฆฌ ๋ฌถ์–ด ๋‘” ์ง‘ํ•ฉ์˜ ๋ชจ์Œ์ด๋‹ค. ๋˜ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ด๋Ÿฌํ•œ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์ง‘ํ•ฉ์˜ ๋ชจ์Œ์„ ์ด์šฉํ•ด ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ์ƒˆ๋กœ์šด ์ง‘ํ•ฉ(์กฐํ•ฉ ์ž๋ฃŒํ˜•composite data type)์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ ์ž๋ฃŒํ˜•์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๋‹ค์Œ (์–ธ์–ด์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š”) ๋‘ ์š”์†Œ์— ํฌ๊ฒŒ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

  • ๋‚ด์žฅ ์ž๋ฃŒํ˜•์˜ ์ข…๋ฅ˜. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ธ์–ด๊ฐ€ (๊ฐ€์ƒ) ๊ธฐ๊ณ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ๋“œ๋Ÿฌ๋‚ด๋Š” ์ž๋ฃŒํ˜•์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? ์ˆ˜(number)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ด์žฅ ์ž๋ฃŒํ˜•์„ ์–ผ๋งˆ๋‚˜ ๋งŽ์ด ์ œ๊ณตํ•˜๋Š”๊ฐ€? ๋“ฑ.
  • ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์˜ ์ˆ˜๋‹จ. ์˜ˆ๋ฅผ ๋“ค์–ด, โ€œ๋‘ ๋ฒˆ์งธ ๊ฐ’์ด ์ฒซ ๋ฒˆ์งธ ๊ฐ’๋ณด๋‹ค ํฐ ์งpairโ€๊ณผ ๊ฐ™์€ ํƒ€์ž…์„ ํ‘œํ˜„ํ•  ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? โ€œ์›์†Œ๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ ํƒ€์ž…์ธ, ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š์€ ๋ฆฌ์ŠคํŠธโ€์™€ ๊ฐ™์€ ํƒ€์ž…์€?

ํƒ€์ž… ์‹œ์Šคํ…œ

์ง€๊ธˆ๊นŒ์ง€ ํƒ€์ž…์˜ ์˜์˜, ๊ทธ๋ฆฌ๊ณ  ํƒ€์ž…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๊ด€์ ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ์—ˆ๋‹ค. ํƒ€์ž…์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์˜๋„๋ฅผ ํ‘œ๊ธฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชจํ‰์ด ๋ชจํ‰์ด๋งˆ๋‹ค ๊ทธ๋Ÿฌํ•œ ์˜๋„๋ฅผ ๊ธฐ์ˆ  ํ•ด๋‘์—ˆ๋‹ค ํ•œ๋“ค ๊ทธ ์˜๋„๊ฐ€ ์‹ค์ œ๋กœ ๊ฐ•์š”๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฌด์˜๋ฏธํ•  ๊ฒƒ์ด๋‹ค. ํƒ€์ž… ์‹œ์Šคํ…œ์€ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์— ํƒ€์ž…์„ ์ด์šฉํ•ด ๊ธฐ์ˆ ๋œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์—ฌ๋Ÿฌ ์˜๋„๊ฐ€ ๋ง์ด ๋˜๋Š”์ง€, ์„œ๋กœ ๋ชจ์ˆœ์„ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”์ง€ ๊ฒ€์‚ฌ(ํƒ€์ž… ๊ฒ€์‚ฌtype check)ํ•˜๋Š” ๊ฒ€์‚ฌ์›์ด๋‹ค.

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

๋” ์—„๋ฐ€ํ•˜๊ณ  ๋” ํ’๋ถ€ํ•œ ํ‘œํ˜„๋ ฅ์„ ๊ฐ€์ง„ ํƒ€์ž… ์‹œ์Šคํ…œ์ด ํ•ญ์ƒ ๋” ํ›Œ๋ฅญํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์ด ๊ทธ๋ ‡๋“ฏ, ์—ฌ๊ธฐ์—์„œ๋„ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์ผ์–ด๋‚œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ, ํƒ€์ž… ์‹œ์Šคํ…œ์ด ๋”์šฑ ์—„๋ฐ€ํ•˜๊ณ  ๊ฐ•๋ ฅํ•ด์งˆ์ˆ˜๋ก ์–ธ์–ด๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฉฐ, ์–ด์ง€๊ฐ„ํ•ด์„  ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์กฐ์ฐจ ๋ชป ์‹œํ‚ค๊ฒŒ ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒ ์ง„์ž… ์žฅ๋ฒฝ์œผ๋กœ ์ž‘์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ๋‹ค.

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

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

function sum(a: number, b: number): number {
    launchNuclearMissile(); // ํ•ต๋ฏธ์‚ฌ์ผ์„ ๋ฐœ์‚ฌํ•œ๋‹ค
    return (a + b);
}

sum ํ•จ์ˆ˜๋Š” ๋‘ ์ˆ˜๋ฅผ ๋ฐ›์•„ ๊ทธ ํ•ฉ์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋‹ค. ํƒ€์ž… ์ƒ์œผ๋กœ๋Š” ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ์‚ฌ๋žŒ๋„ ๋ชจ๋ฅด๊ฒŒ ํ•ต๋ฏธ์‚ฌ์ผ์˜ ๋ฐœ์‚ฌ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ๋Œ€์ฐธ์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ํ•จ์ˆ˜์˜ ์ธ์ž์˜ ๊ฐ’, ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’๋งŒ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋น„์Šทํ•œ ์ผ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ•˜์Šค์ผˆ๋กœ ์งœ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

sum a b = do
    launchNuclearMissle
    return (a + b)

ํ•˜์Šค์ผˆ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ์œ„ ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ Num a => a -> a -> IO a์œผ๋กœ ์ถ”๋ก ํ•œ๋‹ค. ์ •์ˆ˜์ธ์ง€, ๋ถ€๋™ ์†Œ์ˆ˜์ธ์ง€, ๋˜๋Š” ์•„์˜ˆ ๋‹ค๋ฅธ ์–ด๋–ค ํฌ๋งท์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜ ์ˆ˜(number)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” a ํƒ€์ž…์˜ ๋‘ ๊ฐœ ์ธ์ž๋ฅผ ๋ฐ›์•„ IO์™€ ์—ฐ๊ด€๋œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  a ํƒ€์ž… ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ์ด ์ •์˜๋กœ๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋„์›€์„ ๋ฐ›์•„ ์•„๋ž˜์™€ ๊ฐ™์€ ์‚ฌ๊ณ ์˜ ๊ณผ์ •์„ ์†์‰ฝ๊ฒŒ ๋ฐŸ์„ ์ˆ˜ ์žˆ๋‹ค.

  • ๋‘ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ์ž‘์—…์—๋Š” IO๊ฐ€ ๋ผ์–ด๋“ค ์—ฌ์ง€๊ฐ€ ์—†๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ๋„ ์ด sum์ด๋ผ๋Š” ํ•จ์ˆ˜์˜ ํƒ€์ž…์—๋Š” IO์™€ ์—ฐ๊ด€๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ์“ฐ์—ฌ ์žˆ๋‹ค.
  • ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ ๋‚ด๊ฐ€ sum ํ•จ์ˆ˜์— ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๋Š”, ์–ด์ฉŒ๋ฉด ์œ„ํ—˜ํ•œ, ์ผ์„ ํ•˜๊ณ  ์žˆ์Œ์ด ํ‹€๋ฆผ์—†๋‹ค.

์ด๋ ‡๋“ฏ, ํ•˜์Šค์ผˆ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ทธ๊ฒƒ์ด ์‰ฝ์‚ฌ๋ฆฌ (ํ˜น์€ ์ ˆ๋Œ€) ๋‹ด์•„๋‚ผ ์ˆ˜ ์—†๋Š” ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ํƒ€์ž… ๋‚ด์— ๋‹ด๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅ์ผ€ ํ•œ๋‹ค. ๋”๊ตฌ๋‚˜, ์œ„ ์ฝ”๋“œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํƒ€์ž…์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ „ํ˜€ ์ฃผ์ง€ ์•Š์•˜์Œ์—๋„ ํƒ€์ž… ์‹œ์Šคํ…œ์ด ์Šค์Šค๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚ด๋ถ€๋ฅผ ์‚ดํŽด ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ ๋„์ถœํ•ด ๋‚ด๊ณ  ์žˆ๋‹ค(ํƒ€์ž… ์ถ”๋ก ). ์ด ๋‹จ์ˆœํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด์•˜๋“ฏ์ด, ์„œ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ์ข…์ข… ๊ฐ™์€ ๊ฐœ๋…์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜๊ธฐ ํž˜๋“ค ์ •๋„๋กœ ์ „ํ˜€ ๋‹ค๋ฅธ ์ˆ˜์ค€์˜ ์ •๋ณด๋ฅผ ๋‹ด์•„๋‚ด๊ณค ํ•œ๋‹ค.


์—ฐ์žฌ ๊ณ„ํš ๋ฐ ๋ชฉํ‘œ

์—ฌ๊ธฐ๊นŒ์ง€ ์—ฐ์žฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๋™๊ธฐ์™€ ํƒ€์ž…๊ณผ ํƒ€์ž… ์‹œ์Šคํ…œ, ๊ทธ๋ฆฌ๊ณ  ์—ฐ๊ด€๋œ ๊ธฐ๋ณธ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. ์•ž์œผ๋กœ ์—ฐ์žฌ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์ถ”๊ฐ€๋กœ ๋‹ค๋ฃฐ ์ฃผ์ œ๋“ค์— ๊ด€ํ•ด ์ด์•ผ๊ธฐํ•˜๋ฉฐ ์ด๋ฒˆ ๊ธ€์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

์•„๋ž˜ ๊ณ„ํš์€ ์กฐ๊ธˆ๋„ ํ‹€๋ฆผ ์—†๋Š” ์ฒญ์‚ฌ์ง„์ด ์•„๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ธฐ๋ณด๋‹จ, ์—ฐ์žฌ ์‹œ์ž‘ ์ „ ์ ์–ด๋„ ์ด๋Ÿฐ ์ฃผ์ œ๋Š” ๋‹ค๋ฃจ์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋Œ€๊ฐ•์˜ ์˜ˆ์ธก์— ๋ถˆ๊ณผํ•˜๋‹ค. ์ฃผ์ œ, ๋ถ„๋Ÿ‰ ๋ฐ ์ˆœ์„œ๋Š” ์—ฐ์žฌ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ ๊ฐœ๋…

์ถ”ํ›„ ๊ตฌ์ฒด์ ์ธ ์ฃผ์ œ๋“ค์— ๋Œ€ํ•ด ๋…ผ์˜๋ฅผ ์ „๊ฐœํ•ด๋‚˜๊ธฐ์— ์•ž์„œ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค์„ ๋…ผํ•œ๋‹ค. ๊ฐ•ํƒ€์ž…๊ณผ ์•ฝํƒ€์ž…, ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ/๋™์  ํƒ€์ž… ๊ฒ€์‚ฌ, ํƒ€์ž… ์„ ์–ธ๊ณผ ์ ์ง„์  ํƒ€์ดํ•‘ ๋“ฑ์„ ๋‹ค๋ฃฌ๋‹ค.

๋‹คํ˜•์„ฑ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ œ์•ฝ์œผ๋กœ ์ž‘์šฉํ•˜๋Š” ํƒ€์ž…์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๋ฉด์„œ๋„ ์œ ์—ฐํ•จ์„ ์žƒ์ง€ ์•Š๊ธฐ ์œ„ํ•œ ํ•˜๋‚˜์˜ ์ˆ˜๋‹จ์ธ ๋‹คํ˜•์„ฑpolymorphism์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค. ๋‹คํ˜•์„ฑ์ด๋ž€ ๋ฌด์—‡์ด๊ณ  ์™œ ํ•„์š”ํ•œ์ง€, ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋‹คํ˜•์„ฑ์ด ์กด์žฌํ•˜๋ฉฐ ๊ฐ๊ฐ ์–ด๋–ค ํŠน์ง•์„ ๊ฐ–๋Š”์ง€, ์„œ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋“ฑ์„ ์†Œ๊ฐœํ•œ๋‹ค.

ํƒ€์ž… ๊ฐ„์˜ ๊ด€๊ณ„

์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž… ๊ฐ„์˜ ๊ด€๊ณ„์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค. ํƒ€์ž… ๊ฐ„์˜ ํ˜ธํ™˜์„ฑ๊ณผ ๋™์ผ์„ฑ์„ ํŒ๋‹จํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ๋ฒ•์ธ ๊ตฌ์กฐ์  ํƒ€์ž… ์‹œ์Šคํ…œstructural type system๊ณผ ์ด๋ฆ„์— ๊ธฐ๋ฐ˜์„ ๋‘” ํƒ€์ž… ์‹œ์Šคํ…œnominal(name-based) type system์„ ์†Œ๊ฐœํ•œ๋‹ค. ๋• ํƒ€์ดํ•‘duck typing๊ณผ ๊ฐ™์€ ์—ฐ๊ด€๋œ ๊ฐœ๋…๋„ ํ•จ๊ป˜ ๋‹ค๋ฃฌ๋‹ค.

๊ทธ ํ›„, ๋‘ ํƒ€์ž… ๊ฐ„์˜ ๊ด€๊ณ„๋กœ๋ถ€ํ„ฐ ๊ฐ๊ฐ์˜ ํƒ€์ž…์œผ๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋œ ํƒ€์ž… ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ทœ์ •ํ•˜๋Š” ๋ฐ˜๊ณต๋ณ€์„ฑcontravariance, ๊ณต๋ณ€์„ฑcovariance, ๋ถˆ๋ณ€์„ฑinvariance ์„ธ ๋ฐฉ๋ฒ•์— ๊ด€ํ•ด ์ด์•ผ๊ธฐํ•œ๋‹ค.

๋Œ€์ˆ˜ ์ž๋ฃŒํ˜•

์กฐํ•ฉ ์ž๋ฃŒํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ธ ๋Œ€์ˆ˜ ์ž๋ฃŒํ˜•algebraic data type์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœํ•œ๋‹ค. ๋Œ€์ˆ˜ ์ž๋ฃŒํ˜•์—๋Š” ์–ด๋–ค ์ข…๋ฅ˜๊ฐ€ ์žˆ๊ณ , ๋Œ€์ˆ˜ ์ž๋ฃŒํ˜•์„ ์ด์šฉํ•œ ์‚ฌ๊ณ  ๋ชจ๋ธ์ด ๋งค์ผ ๋งˆ์ฃผ์น˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฌธ์ œ๋“ค์„ ์–ด๋–ป๊ฒŒ ์šฐ์•„ํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š”์ง€ ๋‹ค๋ฃฌ๋‹ค.

ํƒ€์ž… ์ถ”๋ก 

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

ํƒ€์ž… ์‹œ์Šคํ…œ๊ณผ ๋ช…์ œ์˜ ์ฆ๋ช…

ํ”„๋กœ๊ทธ๋žจ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์ด ๋…ผ๋ฆฌ์  ๋ช…์ œ์˜ ์ฆ๋ช…๊ณผ ์–ด๋–ค ์—ฐ๊ด€์„ ๊ฐ€์ง€๋Š”์ง€์— ๋Œ€ํ•ด ๋ณด๋‹ค ์ž์„ธํžˆ ๋‹ค๋ฃฌ๋‹ค. ์ปค๋ฆฌ-ํ•˜์›Œ๋“œ ๋Œ€์‘/Curry-Howard isomorphism/์„ ์†Œ๊ฐœํ•˜๊ณ , ํ”„๋กœ๊ทธ๋žจ์ด ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•œ๋‹ค๋Š” ๊ฒƒ์˜ ์˜๋ฏธ๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋‹ค๋ฅธ ๊ด€์ ์„ ์†Œ๊ฐœํ•œ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ


๊ฐ์‚ฌ์˜ ๋ง

์นœ์ ˆํžˆ๋„ ๊ธ€์„ ๋จผ์ € ์ฝ์–ด ์ฃผ์‹œ๊ณ  ๋˜ ๋งŽ์€ ์œ ์šฉํ•œ ์กฐ์–ธ์„ ์ฃผ์‹  xtendo๋‹˜, dsm_ ๋‹˜, markhkim ๋‹˜, lifthrasiir ๋‹˜๊ป˜ ๊ฐ์‚ฌ์˜ ๋ง์”€์„ ์ „ํ•ฉ๋‹ˆ๋‹ค.