Typescript: ๋น„๊ณต๊ฐœ ํ•„๋“œ ์ œ์•ˆ ๊ตฌํ˜„

์— ๋งŒ๋“  2016๋…„ 07์›” 26์ผ  ยท  134์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

TypeScript์—์„œ 1๋‹จ๊ณ„ private field ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ์˜ ์˜์‚ฌ ๋น„๊ณต๊ฐœ ๊ตฌํ˜„์„ ๋Œ€๋ถ€๋ถ„ ๋Œ€์ฒดํ•  ๊ฒƒ์ด๋ฉฐ ์™„์ „ํžˆ ์˜ฌ๋ฐ”๋ฅธ ๊ตฌํ˜„์€ ํด๋ž˜์Šค๋ณ„ WeakMaps๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ES6์—๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘ ์ž์ฒด๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ WeakMaps๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๊ณต๊ฐœ ์ƒํƒœ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋ฏ€๋กœ ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ œ์•ˆ์„œ์—๋Š” private _properties_๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ๋ฐฉ๋ฒ•์ด ๋”ฐ๋ฅผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ œ์•ˆ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ private ์†์„ฑ์ด ํด๋ž˜์Šค ์ž์ฒด ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Committed Fixed Suggestion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด "๋น„๊ณต๊ฐœ" ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์— ๋งŒ์กฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  134 ๋Œ“๊ธ€

TypeScript ํŒ€์€ ๊ตฌ๋ฌธ๊ณผ ๊ธฐํ˜ธ/๋ฌธ์ž ์ ‘๋‘์‚ฌ์˜ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์ด ๋”์ฐํ•ด ๋ณด์ธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๊ธฐ์ˆ ์  ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๋‚ด๊ฐ€ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋กœ ๊ฐ€์‹œ์„ฑ์„ ์‹๋ณ„ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ๋ฒ•).

TypeScript๊ฐ€ ํ˜„์žฌ์˜ private/protected ๊ตฌ๋ฌธ์„ ์žƒ๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์Šฌํ”Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ์–ธ์–ด์™€ ํ›จ์”ฌ ๋” ๊นจ๋—ํ•˜๊ณ  ์ผ๊ด€์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ผ์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด # ๋ฐ @ ๊ธฐํ˜ธ๋ฅผ ์ „ํ™˜ํ•  ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์ฆ‰, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์— # ์‚ฌ์šฉ). ์ด๋Š” ๋ถ„๋ช…ํžˆ TypeScript์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. .

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

๋‚ด๊ฐ€ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋กœ ์‚ฌ์šฉ๋ฒ•์€ ๊ฐ€์‹œ์„ฑ์„ ์‹๋ณ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋กœ ์‚ฌ์šฉ ์‚ฌ์ดํŠธ์—์„œ ์†์„ฑ์„ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹๋ณ„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ๊ฐœ์ธ ์†์„ฑ์— ๋Œ€ํ•ด "์•Œ" ํ•„์š” ์—†์ด ๋™์ผํ•œ ๊ฐœ์ธ ์ด๋ฆ„์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋ฅธ ์กฐํšŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ๊ตฌ๋ฌธ์˜ ํ•œ ๊ฐ€์ง€ ์žฅ์ ์€ this ์ƒ๋žตํ•˜๊ณ  #field ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ธ์žฅ์€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(https://github.com/tc39/proposal-private-fields/issues/32)๋กœ ๊ต์ฒด๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋Œ€์‹  @ ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ @field , ๋ฃจ๋น„์ฒ˜๋Ÿผ. ์ด ๊ตฌ๋ฌธ์ด ์—ฌ์ „ํžˆ ๋ชป์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด "๋น„๊ณต๊ฐœ" ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์— ๋งŒ์กฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

JavaScript๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ผ๋ฐ˜์ ์ธ eval ๋ฅผ ์ง€์›ํ•˜๋Š” ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ํ† ํฐ์€ ์•ฝ๊ฐ„์˜ ์ฐจ๋ณ„ํ™”๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  TypeScript์—์„œ์™€ ๊ฐ™์ด ์ •์  ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€ ์•Š๋Š” ๊ฐœ์ธ ์ƒํƒœ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. . ์šฐ๋ฆฌ๋Š” https://github.com/tc39/proposal-private-fields/issues/14 ์—์„œ ์—ฌ๋Ÿฌ ๊ตฌ๋ฌธ ๋Œ€์•ˆ์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์œผ๋ฉฐ TypeScript์˜ ํ˜„์žฌ ๊ตฌ๋ฌธ์€ ํ•ญ์ƒ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์ผ๋ฐ˜์ ์ธ JS ํ™˜๊ฒฝ.

์ฃผ๋กœ ์‚ฌ์šฉ ์‚ฌ์ดํŠธ์—์„œ ์†์„ฑ์„ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹๋ณ„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ๊ฐœ์ธ ์†์„ฑ์— ๋Œ€ํ•ด "์•Œ" ํ•„์š” ์—†์ด ๋™์ผํ•œ ๊ฐœ์ธ ์ด๋ฆ„์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋ฅธ ์กฐํšŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

JavaScript๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋” ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด here and here ์„ค๋ช… ๋œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์—ฌ์ „ํžˆ ๋ฏฟ๊ธฐ์ง€ ์•Š์ง€๋งŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์น˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ์ด ์—ฌ์ „ํžˆ ๋ชป์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ?

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋”๊ตฐ๋‹ค๋‚˜ ๋‚˜๋จธ์ง€ JavaScript ๊ตฌ๋ฌธ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋งŽ์€ ์–ธ์–ด์™€๋„ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

| ์–ธ์–ด | ๊ตฌ๋ฌธ | ๋ฉ”๋ชจ |
| --- | --- | --- |
| C# | ๊ฐœ์ธ ์ •์ˆ˜ x; | |
| C++ | ์‚ฌ์ ์ธ:
์ •์ˆ˜ x; | |
| ์ž๋ฐ” | ๊ฐœ์ธ ์ •์ˆ˜ x; | |
| PHP | ๊ฐœ์ธ $x; | |
| ํŒŒ์ด์ฌ | __x | "๋…ธ์ฝ”๋ฉ˜ํŠธ" |
| ๋ฃจ๋น„ | ์‚ฌ์ ์ธ
def ๋ฉ”์„œ๋“œ
# ...
๋ | ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ํ•„๋“œ๋Š” ๋น„๊ณต๊ฐœ์ž…๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. |
| ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ | ๊ฐœ์ธ x; | |
| ๋น„์ฃผ์–ผ ๋ฒ ์ด์ง | ๊ฐœ์ธ x ์ •์ˆ˜ | |

์œ„์˜ ์–ธ์–ด ์ค‘ _ํ•˜๋‚˜_๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์–ธ์–ด๋Š” private ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ Python์—๋Š” ์–ด์จŒ๋“  "์ ์ ˆํ•œ" ๊ฐœ์ธ ์ƒํƒœ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Python์„ ์ œ์™ธํ•˜๊ณ (๋‹ค์‹œ), ์–ด๋–ค ์–ธ์–ด๋„ ๊ฐ€์‹œ์„ฑ์— ๋”ฐ๋ผ ํ•„๋“œ ์„ ์–ธ ๋˜๋Š” ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ˜•์‹ํ™”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ชจ๋‘ ์ƒˆ๋กœ์šด ๊ฐ€์‹œ์„ฑ ์ˆ˜์ •์ž๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ # ๋ฐ @ ๋‘˜ ๋‹ค ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ๊ฐ™์€ ๊ฒƒ, ์ฆ‰ ์ผ€๋นˆ์˜ ๋ง์— ๋”ฐ๋ฅด๋ฉด "๊ตฌ๋ฌธ์ ์œผ๋กœ ๋ช…๋ นํ˜• ํ๋ฆ„์˜ '์™ธ๋ถ€'"์— ๋” ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

JavaScript๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ผ๋ฐ˜ ํ‰๊ฐ€๋ฅผ ์ง€์›ํ•˜๋Š” ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ‰์‹ ๋„ ์šฉ์–ด๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (https://github.com/tc39/proposal-private-fields/issues/14์— ์žˆ์„ ์ˆ˜ ์žˆ์Œ)

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์˜ ๋ชฉ๋ก์„ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ํ•œ ๊ณณ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์—ฌ์ „ํžˆ ๋ฏฟ๊ธฐ์ง€ ์•Š์ง€๋งŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์น˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

TypeScript์—์„œ์™€ ๊ฐ™์€ ๊ทœ์น™์— ๋น„ํ•ด ์ •๋ง ๋น„๊ณต๊ฐœ๋กœ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. JavaScript์—์„œ ์†์„ฑ์„ ์กฐํšŒํ•  ๋•Œ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ž์‹ ์˜ ์žฌ์‚ฐ์— ๋Œ€ํ•œ ์‚ฌ๋ก€๋ฅผ ๋ณด์‹ญ์‹œ์˜ค.
  2. ์†Œ์œ  ์žฌ์‚ฐ์ด ์—†๋Š” ๊ฒฝ์šฐ ์†Œ์œ  ์žฌ์‚ฐ์— ๋Œ€ํ•œ ํ”„๋กœํ† ํƒ€์ž…์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.
  3. ์†์„ฑ์„ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ƒ์Šน์‹œํ‚ต๋‹ˆ๋‹ค.
  4. ๋ฐœ๊ฒฌ๋œ ๊ฒฝ์šฐ ์†์„ฑ ์„ค๋ช…์ž(์“ฐ๊ธฐ ๊ฐ€๋Šฅ, ๊ฐ€์ ธ์˜ค๊ธฐ, ์„ค์ •, ๊ตฌ์„ฑ ๊ฐ€๋Šฅ)๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  5. ์ฐพ์ง€ ๋ชปํ•˜๊ณ  ์ฝํžˆ๋ฉด undefined ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ด‰์ธ ๋˜๋Š” ๋™๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐ’์„ ์ž์‹ ์˜ ์†์„ฑ์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์“ฐ์‹ญ์‹œ์˜ค.

์ด์ œ ์ด๋ฆ„์— ํŒจํ„ด์ด ์—†๋Š” privates๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ณ ์œ ํ•œ ์†์„ฑ์ด ์—†๊ณ  ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋Š” ์ž์ฒด private ์†์„ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐœ์ธ ์†์„ฑ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋„ ํ•ด๋‹น ์†์„ฑ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋Š ๊ฒƒ์ด ์ฐธ์กฐ๋˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฒ€์ƒ‰ํ•œ ๋‹ค์Œ ๋น„๊ณต๊ฐœ์—์„œ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋งค์šฐ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฐพ์•˜์ง€๋งŒ ๋น„๊ณต๊ฐœ ๋ฒ„์ „๋„ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” JavaScript ํด๋ž˜์Šค๊ฐ€ ์—ฌ์ „ํžˆ ์•ฝ๊ฐ„ ์ž˜๋ชป๋œ ์ด๋ฆ„์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋ณธ์งˆ์ ์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž… ์ƒ์† ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ž…๋‹ˆ๋‹ค. tc39/proposal-private-fields#14์— ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ‰์‹ ๋„ ์šฉ์–ด๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

class Foo {
    private foobar: string;
    baz() {
        const p = 'foo' + 'bar';
        console.log(this[p]);
    }
}

๋˜๋Š” eval ๊ตฌ์กฐ์™€ ๊ฐ™์€ ์šฉ๋„. ๋น„๊ณต๊ฐœ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ์•ก์„ธ์Šค ๋˜๋Š” ํ‰๊ฐ€ ์ง€์› ์—†์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ "์™œ ๊ท€์ฐฎ์•„"ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์ด ์ œ์•ˆ์„œ์—์„œ ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ง€์ ๋˜์—ˆ์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹"ํ•˜์ง€๋งŒ ๋‚˜๋Š” ์‚ฌ์ ์ธ ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค" ๐Ÿ˜.

๋‹น์‹ ์€ ์ž์‹ ์˜ ์žฌ์‚ฐ์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค, ๋‹น์‹ ์€ ์ž์‹ ์˜ ์‚ฌ์œ  ์žฌ์‚ฐ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค

์„ค๋ช…์ž์— visibility ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๋‹จ์ผ ์†์„ฑ ์ง‘ํ•ฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๋Š” ํ•ด๋‹น ์†์„ฑ์ด ํ˜„์žฌ ๊ฐœ์ฒด์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ์Šนํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ.

ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

AFAIK, ์–ด์จŒ๋“  ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( ref ).

๋‚˜๋Š” ์—ฌ์ „ํžˆ ํ‰๊ฐ€ ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†์„ฑ ์ด๋ฆ„์ด ๊ณ„์‚ฐ๋œ ํ›„ ์†์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹"ํ•˜์ง€๋งŒ ๋‚˜๋Š” ์‚ฌ์ ์ธ ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค"

์ €๋Š” ๊ทธ๋Ÿฐ ์‚ฌ๋žŒ๋“ค ์ค‘ ํ•œ ๋ช…๋„ ๋˜์ง€ ์•Š๊ณ  ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ œ์•ˆ๋œ ๊ตฌ๋ฌธ์ด ์ €๋ฅผ ๋ถˆํŽธํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. =)

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

์„ค๋ช…์ž์— ๊ฐ€์‹œ์„ฑ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๋‹จ์ผ ์†์„ฑ ์ง‘ํ•ฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๋Š” ํ˜„์žฌ ๊ฐœ์ฒด์— ์†์„ฑ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ƒ์Šนํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ . ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ํด๋ž˜์Šค์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ •์˜์ƒ non-private๊ฐ€ ์•„๋‹Œ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด (์ผ๋ฐ˜ ๊ณต๊ฐœ ์†์„ฑ ์กฐํšŒ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ) ์–ด์จŒ๋“  ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์œ„๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. private ์•ก์„ธ์Šค์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ž‘์—…์€ ์—†์Šต๋‹ˆ๋‹ค.

(๋‚˜๋Š” ์•„๋งˆ๋„ ๋ช…๋ฐฑํ•œ ๊ฒƒ์„ ๋†“์น˜๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค)

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ํด๋ž˜์Šค์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ •์˜์ƒ non-private๊ฐ€ ์•„๋‹Œ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด (์ผ๋ฐ˜ ๊ณต๊ฐœ ์†์„ฑ ์กฐํšŒ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ) ์–ด์จŒ๋“  ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์œ„๋กœ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ๋‹น์‹ ์€ ์˜ฌ๋ผ๊ฐ€๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ ๋ ˆ์ด๋ธ”์€ ์ƒ์†๋˜์ง€ ์•Š์œผ๋ฉฐ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ๋งˆ์Šคํ‚น/์ด๋ฆ„ ์ถฉ๋Œ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ๊ฐœ์ธ ๋ ˆ์ด๋ธ”์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@glen-84 ์–ธ๊ธ‰ํ•œ ๋‘ ๊ฒŒ์‹œ๋ฌผ ๋ชจ๋‘ ์„œ๋ช…๋˜์ง€ ์•Š์€ ๊ฐœ์ธ ์ƒํƒœ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์กฐํšŒ ์ฒด์ธ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ˜ธํ™˜์„ฑ ๋ฉด์—์„œ ์œ„ํ—˜ํ•˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข‹์€ ์„ฑ๋Šฅ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ (๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์„ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ) ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋ก์‹œ์™€ ์ œ๊ณฑํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์–ธ์–ด์˜ ์ •์‹  ๋ชจ๋ธ์„ ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋น„๊ต์  ๋ณต์žกํ•œ ๊ฐ์ฒด ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ).

์–ธ์–ด ๊ฐ„ ๋น„๊ต์—์„œ Ruby๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Ruby๊ฐ€ @ _with_ ๊ฐœ์ธ ์ƒํƒœ์˜ ์ข‹์€ ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. sigil ์—†์ด getter ๋ฐ setter ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ๋‹น์‹ ์€ ์˜ฌ๋ผ๊ฐ€๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ ๋ ˆ์ด๋ธ”์€ ์ƒ์†๋˜์ง€ ์•Š์œผ๋ฉฐ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ๋งˆ์Šคํ‚น/์ด๋ฆ„ ์ถฉ๋Œ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ๊ฐœ์ธ ๋ ˆ์ด๋ธ”์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ์ด ํ˜„์žฌ ํด๋ž˜์Šค์— ์—†์œผ๋ฉด ์œ„๋กœ ์ด๋™ํ•˜์—ฌ ๊ณต๊ฐœ ๋˜๋Š” ๋ณดํ˜ธ ์†์„ฑ์„ ์ฐพ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ธ๊ธ‰ํ•œ ๋‘ ๊ฒŒ์‹œ๋ฌผ ๋ชจ๋‘ ์„œ๋ช…๋˜์ง€ ์•Š์€ ๊ฐœ์ธ ์ƒํƒœ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

JavaScript์˜ ๋‚ด๋ถ€ ์ž‘๋™์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์—†๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

You'd have to somehow encode a "private key" into each lexical environment.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค. ๋ฌด์—‡์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ? ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

You'd have to change the semantics of each and every property access (because any property access might result in a private field). Engines are highly optimized around the current property lookup semantics.

๊ฐ€์‹œ์„ฑ์„ ์ผœ๋Š” ๋‹จ์ผ ์Šค์œ„์น˜๊ฐ€ ์„ฑ๋Šฅ์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ •๋„๋กœ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

Would for-in enumerate over these properties?

๋ฌธ๋งฅ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ๊ฒƒ ๊ฐ™์•„์š”. ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์—์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ private ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด๋ฉฐ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์ด๋ฏธ ์ด๋Ÿฌํ•œ ์งˆ๋ฌธ์— ๋‹ตํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Can someone shadow a private property with a normal property lower on the prototype chain? What about the reverse?

์•„๋งˆ๋„ ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์—๋Š” ์˜ˆ(๊ฐ€์‹œ์„ฑ์ด ์ฆ๊ฐ€ํ•จ)์ด๊ณ  ๋‘ ๋ฒˆ์งธ ์งˆ๋ฌธ์—๋Š” ์•„๋‹ˆ์˜ค์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ์€ ๋ชจ๋‘ ์ด์ „์— ์ˆ˜ํ–‰๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

How do you prevent leaking the names of private fields to clients that shouldn't know that information? This is probably a fatal information leak.

๊ฐ€์‹œ์„ฑ์€ ๊ณต๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์บก์Šํ™”ํ•˜๊ณ  ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์˜ 99%๋Š” ์•„๋งˆ๋„ "์ •๋ณด ์œ ์ถœ"์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์—ฌ๊ธฐ์—์„œ ๋‘ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ๊ธฐ๋Šฅ์„ ์ œ์•ˆ

All of this runtime stuff is going to be terrible for performance

์„ฑ๋Šฅ์„ ์›ํ•˜๋ฉด "์ˆจ๊น€/๋ณด์•ˆ ์ƒํƒœ"๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. :D ์ง„์ง€ํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด ์–ด๋–ค ์œ ํ˜•์˜ ์„ฑ๋Šฅ ์†์‹ค์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋ˆ„๊ตฐ๊ฐ€ ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. =)

Also, we couldn't use such a solution to self-host the built-ins

์ž์ฒด ํ˜ธ์ŠคํŒ… ๋‚ด์žฅ ๊ธฐ๋Šฅ(์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด)์ด ์„ฑ๋Šฅ์— ์ •๋ง ์ข‹์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ... "์ˆจ๊ฒจ์ง„/๋ณด์•ˆ ์ƒํƒœ"๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์œ„ ์ˆ˜์ค€์˜ ๊ฐœ์ธ/๋ณดํ˜ธ๋œ ๊ฐ€์‹œ์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์กฐํšŒ ์ฒด์ธ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ˜ธํ™˜์„ฑ ์ธก๋ฉด์—์„œ ์œ„ํ—˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

Ruby๋Š” sigil--@์ด ์žˆ๋Š” private state์˜ ์ข‹์€ ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

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

TypeScript ํŒ€์€ ๊ตฌ๋ฌธ๊ณผ ๊ธฐํ˜ธ/๋ฌธ์ž ์ ‘๋‘์‚ฌ์˜ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๊ฐœ์ธ์ ์œผ๋กœ ๋ฌด์„ญ๊ฒŒ ์ƒ๊ฒผ๋‹ค๋Š” ์ƒ๊ฐ์ด...

์ฐธ๊ณ  ์ €๋Š” # ๊ตฌ๋ฌธ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ์ œ์•ˆ ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

@shelby3 ๋ถˆํ–‰ํžˆ๋„, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ˜„์‹ค์ ์ธ ์˜ต์…˜์œผ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. tl;dr, ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์ด eval ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. sigil์„ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด "๋„ˆ๋ฌด ์—ญ๋™์ "์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@littledan ๋‚˜๋Š” ์ง€๊ธˆ ๊ฑฐ๊ธฐ์— ๋”ฐ๋ผ sigil ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ ๊ณผ TypeScript์™€์˜ ํ˜ธํ™˜์„ฑ ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค . ๋ฉ”์„œ๋“œ์˜ ํ˜•์‹ํ™”๋˜์ง€ ์•Š์€ ์ธ์ˆ˜์— ๋Œ€ํ•ด ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์ด์ œ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

@isiahmeadows

ํ˜„์žฌ์˜ ์œ ์‚ฌ ๋น„๊ณต๊ฐœ ๊ตฌํ˜„์„ ๋Œ€๋ถ€๋ถ„ ๋Œ€์ฒดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. [...] ๋˜ํ•œ, ์ œ์•ˆ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ๋น„๊ณต๊ฐœ ์†์„ฑ์ด ํด๋ž˜์Šค ์ž์ฒด ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฑด์ถ•๊ฐ€์˜ ๊ด€์ ์—์„œ TS private -keyword ๋ฐ ์œ ์‚ฌ ๋น„๊ณต๊ฐœ ํŠน์„ฑ์— ๋Œ€ํ•ด ๋งค์šฐ ์ข‹์€ ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์œ ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณ„์•ฝ๊ณผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • TS ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ณ„์•ฝ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ํŠนํžˆ ํ™”์ดํŠธ๋ฐ•์Šค ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„์— ๊ณ„์•ฝ์„ ์˜์‹์ ์œผ๋กœ "์œ„๋ฐ˜"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„ ์‹œ private ์†์„ฑ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ฐ€๋Šฅ์„ฑ์€ ํ…Œ์ŠคํŠธ ์ค‘์ธ ํด๋ž˜์Šค์— private ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ private state๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— any ๋ฆฌํŒฉํ† ๋ง ์ง€์›), ์˜ˆ:

let instance: ClassUnderTest = new ClassUnderTest();
instance["_privateField"] = "My injected state";

ํŠน์ •(๋น„๊ณต๊ฐœ) ์ƒํƒœ์˜ ํด๋ž˜์Šค๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ณต์žกํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
pseudo-private ์†์„ฑ์˜ ๋˜ ๋‹ค๋ฅธ ์žฅ์ ์€ ์›์ˆญ์ด ํŒจ์น˜์— ํ•„์ˆ˜์ ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TypeScript ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ชจ๋“  private variable ํ–‰์„ private #variable ๊ธฐ๊บผ์ด ๋ณ€๊ฒฝํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

ํ•˜์ง€๋งŒ ๋‚˜๋จธ์ง€๋Š” JS private์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C++, Java, C# ๋“ฑ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ณ  ์‰ฌ์šด private convenient ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ ๊ณ ํ†ต์ด ๋˜์ง€ ์•Š๋Š” ํ•ด๊ฒฐ์ฑ…์— ํˆฌํ‘œํ•ด ์ฃผ์‹ญ์‹œ์˜ค. ์•„๋งˆ ์†Œํ”„ํŠธ ํ”„๋ผ์ด๋น—? ์šฐ๋ฆฌ๊ฐ€ sigil private #variable ์„ ์›ํ•˜๋Š”์ง€ ์˜์‹ฌ์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด TS private ์™€ ES private์ด ๋‹ค๋ฅธ ๊ฐœ๋…์ผ๊นŒ์š”? ๋ชป์ƒ๊ธด.

@igabesz

TypeScript ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ชจ๋“  private variable ํ–‰์„ private #variable ๊ธฐ๊บผ์ด ๋ณ€๊ฒฝํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๊ทธ ์ œ์•ˆ์œผ๋กœ private ๋Š” ๋ถˆํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  # sigil์€ ์ถฉ๋Œ ์—†์ด ์™„์ „ํžˆ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚˜๋จธ์ง€๋Š” JS private์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C++, Java, C# ๋“ฑ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ณ  ์‰ฌ์šด ๊ฐœ์ธ์šฉ ํŽธ๋ฆฌํ•œ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

TypeScript์˜ private์€ ๋Œ€๋ถ€๋ถ„์˜ OO ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ soft private์ž…๋‹ˆ๋‹ค. Java์˜ private ๋ณ€์ˆ˜์กฐ์ฐจ๋„ ์—ฌ์ „ํžˆ ๊ธฐ์ˆ ์ ์œผ๋กœ soft-private์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํƒˆ์ถœ ํ•ด์น˜๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. JS private์€ this ๊ฐ€ ์•„๋‹Œ ์ธ์Šคํ„ด์Šค์˜ private ์ƒํƒœ์— ๊ณ„์† ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ ๊ณ ํ†ต์ด ๋˜์ง€ ์•Š๋Š” ํ•ด๊ฒฐ์ฑ…์— ํˆฌํ‘œํ•ด ์ฃผ์‹ญ์‹œ์˜ค. ์•„๋งˆ ์†Œํ”„ํŠธ ํ”„๋ผ์ด๋น—? ์šฐ๋ฆฌ๊ฐ€ sigil private #๋ณ€์ˆ˜๋ฅผ ์›ํ•˜๋Š”์ง€ ์˜์‹ฌ์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด TS private๊ณผ ES private์ด ๋‹ค๋ฅธ ๊ฐœ๋…์ผ๊นŒ์š”? ๋ชป์ƒ๊ธด.

๊ทธ๊ฒƒ๋“ค์€ ๋‹ค๋ฅธ ๊ฐœ๋…์ด์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ํƒˆ์ถœ์šฉ ํ•ด์น˜๋Š” ์‹ค์ œ๋กœ ๊ฑฐ์˜ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์˜ˆ์™ธ๋Š” ๊ฐ์ฒด ๊ฒ€์‚ฌ(์˜ˆ: ๊ฐœ๋ฐœ์ž ๋„๊ตฌ, Node.js util.inspect )์ด์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ ํ˜ธ์ŠคํŠธ ์ •์˜์ด๋ฉฐ ํ˜„์žฌ ์ด๋ฏธ ๊ถŒํ•œ ์žˆ๋Š” ๊ธฐ๋ณธ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์‚ฌ์–‘์— ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ES๊ฐ€ ๋น„๊ณต๊ฐœ ์ƒํƒœ๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๋ฉด TS๋Š” ์ด๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ๋‹ค์Œ ๋ฉ”์ด์ € ๋ฒ„์ „์—์„œ ์ œ๊ฑฐ๋  ์ž์ฒด ์†Œํ”„ํŠธ ๋น„๊ณต๊ฐœ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ญ์ƒ ES์˜ ์—„๊ฒฉํ•œ ์ƒ์œ„ ์ง‘ํ•ฉ์ด์—ˆ์œผ๋ฉฐ ES ์ž์ฒด๊ฐ€ ์ง„ํ™”ํ•จ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๋งŒํผ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€(๋น„๋™๊ธฐ ํ•จ์ˆ˜), ๋ณ€๊ฒฝ(ํด๋ž˜์Šค) ๋ฐ/๋˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ( /// <amd-dependency /> )ํ•˜์—ฌ ์—„๊ฒฉํ•œ ES๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ƒ์œ„ ์ง‘ํ•ฉ์ด๋ฉฐ ํ˜„์žฌ ์‚ฌ์–‘์„ ๋ณต์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ES๊ฐ€ ๋น„๊ณต๊ฐœ ์ƒํƒœ๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๋ฉด TS๋Š” ์ด๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ๋‹ค์Œ ๋ฉ”์ด์ € ๋ฒ„์ „์—์„œ ์ œ๊ฑฐ๋  ์ž์ฒด ์†Œํ”„ํŠธ ๋น„๊ณต๊ฐœ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ˜ญ

๋˜ํ•œ ES๊ฐ€ ๋น„๊ณต๊ฐœ ์ƒํƒœ๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๋ฉด TS๋Š” ์ด๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ๋‹ค์Œ ๋ฉ”์ด์ € ๋ฒ„์ „์—์„œ ์ œ๊ฑฐ๋  ์ž์ฒด ์†Œํ”„ํŠธ ๋น„๊ณต๊ฐœ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ TS ํŒ€์˜ ์ž…์žฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์กฐ๋งŒ๊ฐ„ ์–ด๋–ค ๊ฒƒ์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.
๋น„๊ณต๊ฐœ ์ƒํƒœ ์ œ์•ˆ์ด ์˜ฌ๋ฐ”๋ฅธ ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋ฉด TS๊ฐ€ ์ด๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ค๋Š˜๋‚  TS๊ฐ€ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด private์— ์–ด๋–ค ์˜๋ฏธ๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@mhegazy ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ •์ •ํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๊ฒƒ์€ ๊ต์œก๋ฐ›์€ ์ถ”์ธก์ด์—ˆ์Šต๋‹ˆ๋‹ค, BTW.)

ํด๋ž˜์Šค ํ•„๋“œ ์ œ์•ˆ ์ด ํ˜„์žฌ 2๋‹จ๊ณ„์— ์žˆ์œผ๋ฏ€๋กœ TypeScript ํŒ€์ด ์ด๋ฅผ ๊ณ ๋ คํ•˜๊ณ  EcmaScript ํ‘œ์ค€์„ ๋”ฐ๋ฅผ ์ค€๋น„๊ฐ€ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค ๐Ÿ’ฏ

๋น„๊ณต๊ฐœ ์ƒํƒœ ์ œ์•ˆ์ด ์˜ฌ๋ฐ”๋ฅธ ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋ฉด TS๊ฐ€ ์ด๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

@mhegazy 3๋‹จ๊ณ„๊ฐ€ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์ ์ ˆํ•œ ์‹œ๊ธฐ์ž…๋‹ˆ๊นŒ?

ํŽธ์ง‘: ๋‚ด ๋Œ€๋‹ต ์„ ์ฐพ์•˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

@styfle ์€ ๊ตฌํ˜„๊ณผ ๊ด€๋ จ๋œ ํ˜„์žฌ ๊ณ ๋ ค ์‚ฌํ•ญ์„ ๋…ผ์˜ํ•˜๋Š” ๋””์ž์ธ ํšŒ์˜ ๋…ธํŠธ(#16415)์˜ ํ† ๋ก ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

3๋‹จ๊ณ„๊ฐ€ ์‹œํ–‰ํ•˜๊ธฐ์— ์ ์ ˆํ•œ ์‹œ๊ธฐ์ž…๋‹ˆ๊นŒ?

์˜ˆ. ์šฐ๋ฆฌ๋Š” ์ด ๊ธฐ๋Šฅ์— ๊ฐ€๋Šฅํ•œ ๋‹ค์–‘ํ•œ ๋””์ž์ธ์„ ์กฐ์‚ฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ํ•„๋“œ ์ œ์•ˆ์€ ํ˜„์žฌ 3๋‹จ๊ณ„ ์ž…๋‹ˆ๋‹ค. (ํ•œ ๋‹ฌ ์ „ ๊ธฐ์ค€)

ํด๋ž˜์Šค ํ•„๋“œ ์ œ์•ˆ์€ ํ˜„์žฌ 3๋‹จ๊ณ„ ์ž…๋‹ˆ๋‹ค. (ํ•œ ๋‹ฌ ์ „ ๊ธฐ์ค€)

ํด๋ž˜์Šค ํ•„๋“œ๊ฐ€ Stage 3์— ๋„๋‹ฌํ•˜๋Š” ๋™์•ˆ Private Methods ๋ฐ Accessors๋Š” ๊ทธ ์ดํ›„๋กœ Stage 2์— ์žˆ์—ˆ๊ณ  ์–ด์ œ๊นŒ์ง€ Stage 3์œผ๋กœ ์˜ฎ๊ฒจ์กŒ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด Stage 3์— ์žˆ์Šต๋‹ˆ๋‹ค.

#[field] ๊ตฌ๋ฌธ ์ฑ„ํƒ์— ๋Œ€ํ•œ TS ํŒ€์˜ ์ž…์žฅ/์ง„ํ–‰ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ž ์‹œ ๋™์•ˆ 3๋‹จ๊ณ„์— ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ •๋ง๋กœ ์‹ซ์–ดํ•˜๊ณ  TS์˜ ๊ธฐ์กด private ํ‚ค์›Œ๋“œ๋ฅผ ํ›จ์”ฌ ์„ ํ˜ธํ•˜์ง€๋งŒ ๋™์‹œ์— ๊ฐ€๋Šฅํ•œ ํ•œ ํ‘œ์ค€์— ๊ฐ€๊น๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋„ˆ๋ฌด ์‹ซ๊ณ  TS์˜ ๊ธฐ์กด private ํ‚ค์›Œ๋“œ๋ฅผ ํ›จ์”ฌ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋„ ๋„ˆ๋ฌด ๋ชป์ƒ๊ฒผ์–ด

ํ•˜์ง€๋งŒ @mhegazy ๋‚˜๋Š” ์ด๊ฒƒ์„ (์‹œ๋„)ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

์—ฌ๊ธฐ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@weswigham ์•Œ์•˜์–ด ํฌ๊ธฐ ๐Ÿ˜‚

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ( @Neuroboy23 ๋ฐ ๊ธฐํƒ€ ์‚ฌ๋žŒ๋“ค๊ณผ ํ•จ๊ป˜) ๊ฐœ์ธ ํ•„๋“œ ๊ตฌํ˜„์„ ์‹คํ—˜ํ•  ๊ฒƒ์ด๋ผ๋Š”

์—…๋ฐ์ดํŠธ: ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…์ด ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค .

์˜ˆ. ์šฐ๋ฆฌ๋Š” ์ด ๊ธฐ๋Šฅ์— ๊ฐ€๋Šฅํ•œ ๋‹ค์–‘ํ•œ ๋””์ž์ธ์„ ์กฐ์‚ฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ # ๊ตฌ๋ฌธ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด ๊ตฌ๋ฌธ ๋’ค์— ์žˆ๋Š” ๊ธฐ์ˆ ์ ์ธ ์ด์œ ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. @mhegazy TypeScript๊ฐ€ namespace , private ์™€ ๊ฐ™์€ ๊ตฌ์‹ ๊ตฌํ˜„์œผ๋กœ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€ ์ƒ๊ฐํ•˜๋Š” ์ƒˆ๋กœ์šด ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•œ ํ›„ TypeScript ํŒ€์ด ์‹ค์ œ๋กœ ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๋” ๋‚˜์€ es-standard ๋ฐฉ๋ฒ•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋˜ํ•œ protected ๋Œ€ํ•œ ๋ช‡ ์„ผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. (์ง€๊ธˆ ํฌ๋ง์ ์œผ๋กœ) ์–ธ์  ๊ฐ€ private ํ‚ค์›Œ๋“œ๋ฅผ ์ œ๊ฑฐ/์‚ฌ์šฉ ์ค‘๋‹จํ•˜๋ ค๋Š” ๊ฒฝ์šฐ protected ํ‚ค์›Œ๋“œ๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์˜ˆ, ์ถ”๊ฐ€ ๊ฐ€์‹œ์„ฑ ๋ฒ”์œ„๊ฐ€ ๋•Œ๋•Œ๋กœ ํŽธ๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๊ฒƒ์˜ ์ „๋ฐ˜์ ์ธ ๊ฐ€์น˜๋Š” ๊ทธ๋‹ค์ง€ ๋†’์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@pleerock ,

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ TypeScript์—์„œ ๋ณผ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

class Example {
    private a = 1;
    #b = 2;
}

๋ฐฉ์ถœ(ESNext ๋Œ€์ƒ):

class Example {
    a = 1;
    #b = 2;
}

๋ฐฉ์ถœ(ESNext๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ณ  ES ๊ฐœ์ธ ํ•„๋“œ๋กœ ๊ฐœ์ธ์œผ๋กœ ํ‘œ์‹œ๋œ ํ•„๋“œ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” ์ƒˆ๋กœ์šด ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ ์‚ฌ์šฉ):

class Example {
    #a = 1;
    #b = 2;
}

์ด๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์–ด์•ผ ํ•˜๋ฉฐ ๊นจ๋—ํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ES ๊ฐœ์ธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@glen-84 ๋‹น์—ฐํžˆ ๊ทธ๋ ‡๊ฒ ์ฃ . ์ €๋Š” ๊ตฌ์‹ ํ‚ค์›Œ๋“œ์™€ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์žฅ๊ธฐ ๊ณ„ํš์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์ด๋‚˜ ํ‚ค์›Œ๋“œ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ private ๋ฅผ # ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์˜ต์…˜์ด ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. # ๋Š” ํ•˜๋“œ ๋Ÿฐํƒ€์ž„ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ์ด๋ฉฐ private ๋Š” ๋””์ž์ธ ์‹œ๊ฐ„ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ์ž…๋‹ˆ๋‹ค.

@weswigham ์ €๋„ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @RyanCavanaugh ์˜ˆ, ์˜ˆ์ƒ๋œ ๋‹ต๋ณ€์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋‚˜๋Š” ์ตœ์‹  ecmascript ์ œ์•ˆ์œผ๋กœ ์ธํ•ด ์“ธ๋ชจ ์—†๊ฒŒ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค/๋น„๊ณต๊ฐœ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ ๋ช‡ ๊ฐ€์ง€ ์ „๋žต์„ ์ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋ฌผ๋ก  ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฌธ์„œ ์ฝ๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๊ฒƒ์„ ์•Œ์•„๋ƒ…๋‹ˆ๋‹ค. module foo { ๋Š” ์—ฌ์ „ํžˆ ์–ธ์–ด์— ์žˆ์ง€๋งŒ namespace foo { ์ด์ „์˜ ์•„์ฃผ ์˜ค๋ž˜๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋” ์ด์ƒ ์•ผ์ƒ์—์„œ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ private๋ฅผ #๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์˜ต์…˜์ด ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. #์€ ํ•˜๋“œ ๋Ÿฐํƒ€์ž„ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ์ด๋ฉฐ private์€ ๋””์ž์ธ ์‹œ๊ฐ„ ๊ฐœ์ธ ์ •๋ณด์ž…๋‹ˆ๋‹ค.

๋„์˜ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ... ๋ถˆํ–‰ํ•œ ๊ตฌ๋ฌธ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์—„๊ฒฉํ•œ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด ์„ ํƒ์ ์œผ๋กœ private ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  soft-private๋Š” ๋‚ด (ํ˜„์žฌ) ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ๊ฑฐ๋Œ€ํ•˜๊ณ  ๋ฒ„์ „ 3์ด ์‚ฌ๋žŒ๋“ค์ด ์ƒˆ๋กœ์šด # ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋„๋ก ํ•˜๋Š” ์ข‹์€ ๊ธฐํšŒ๋กœ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ž์œผ๋กœ ๋‚˜์˜ฌ TypeScript 3 ๋ฒ„์ „์— ์ด ๊ตฌ๋ฌธ ์ง€์›์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋ฒ„์ „ 3์ด ์ด๋ฏธ ์ถœ์‹œ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, ์ตœ๊ทผ TC39 ์ œ์•ˆ์„œ์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๊ฐœ์ธ ํ•„๋“œ/์Šฌ๋กฏ/๋ฌด์—‡์ด๋“  ๊ฐ„์— ์•ฝ๊ฐ„์˜ ๋ณ€๋™์ด ์žˆ์œผ๋ฏ€๋กœ ํ˜„์žฌ ํ˜•์‹์˜ ์ œ์•ˆ์ด ์„ฑ๊ณตํ• ์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ๊ด€๋ จ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ €๋Š” TC39๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๊ฐœ์ธ์ ์œผ๋กœ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ๋จผ์ € ๊ตฌ๋ฌธ์ด ๋‹ค์‹œ ๊ตณ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ( 4๋‹จ๊ณ„๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Œ) ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

FWIW ๋‚˜๋Š” tc39/proposal-class-fields#100์˜ ๋…ผ์˜๋ฅผ ํŠน์ •ํ•œ ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ ํ•ด์„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. # ๋Š” ์ฒ˜์Œ์—๋Š” ๋‚ฏ์„ค์ง€๋งŒ ์„ ํ˜ธ๋˜๋Š” ๊ตฌ๋ฌธ ํ˜•์‹์€ ์ œ์•ˆ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜๋Š” ์œ ์ผํ•œ ๊ตฌ๋ฌธ์€ ๋ถ„๋ช…ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ์ข…์˜ ์ ‘๋‘์‚ฌ sigil์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ this.someProp ๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ํ—ˆ์šฉํ•˜๋ ค๋Š” ๋ชจ๋“  ์‹œ๋„๋Š” ์‹คํŒจํ•  ์šด๋ช…์ž…๋‹ˆ๋‹ค.

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

์—„๊ฒฉํ•œ ๋Ÿฐํƒ€์ž„ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ๊ฐ€ ์ •๋ง๋กœ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ํ•œ ์•„๋ฌด๋„ ๊ฐœ์ธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ตœ์ข… ๋ชฉํ‘œ์ธ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ๋ฐ ๋””๋ฒ„๊น… ๊ฐ€๋Šฅ์„ฑ ์ธก๋ฉด์—์„œ ์›น์— ์ข‹์€ ๊ฒฐ๊ณผ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ธ๊ธ‰ํ•˜๊ธฐ์— ์ด์ƒ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š”,
tc39/proposal-class-fields#106, ์•„๋งˆ๋„ ํ›จ์”ฌ ๋” ์•”์‹œ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ๋ฌด์—‡๋ณด๋‹ค๋„ ์•ฝํ•œ ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ง„์ง€ํ•œ ํ† ๋ก 
ํ”„๋ก์‹œ interop์€ ๋ถ„๋ช…ํžˆ ์งœ์ฆ๋‚ฉ๋‹ˆ๋‹ค.


์ด์‚ฌ์•„ ๋ฉ”๋„์šฐ์ฆˆ
[email protected]
www.isiahmeadows.com

2018๋…„ 7์›” 30์ผ ์›”์š”์ผ ์˜คํ›„ 3:38 Ryan Cavanaugh ์•Œ๋ฆผ @github.com
์ผ๋‹ค:

FWIW ๋‚˜๋Š” ํ† ๋ก ์„ ํ•ด์„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค
tc39/proposal-class-fields#100
https://github.com/tc39/proposal-class-fields/issues/100 ์˜ˆ์ •
ํŠนํžˆ ์–ด๋–ค ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. # ์ฒ˜์Œ์—๋Š” ์–ผ๊ตด์ด ๋ถ‰์–ด์ง€๋Š”๊ฒŒ ์˜ˆ์˜์ง€ ์•Š์ง€๋งŒ
์„ ํ˜ธ๋˜๋Š” ๊ตฌ๋ฌธ ํ˜•์‹์€ ์ œ์•ˆ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์œ ์ผํ•œ ๊ตฌ๋ฌธ์€
์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
์ผ์ข…์˜ ์ธ์žฅ๊ณผ this.someProp์„ ๋น„๊ณต๊ฐœ๋กœ ํ—ˆ์šฉํ•˜๋ ค๋Š” ๋ชจ๋“  ์‹œ๋„
์‹คํŒจํ•  ์šด๋ช…์ž…๋‹ˆ๋‹ค.

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

์ตœ์ข… ๊ฒŒ์ž„์ด ์ •๋ง๋กœ ๊ฐœ์ธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ์•„๋ฌด๋„ ๊ฐœ์ธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋ผ๋ฉด
์—„๊ฒฉํ•œ ๋Ÿฐํƒ€์ž„ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•„๋งˆ๋„ ์›น์—์„œ ์ข‹์€ ๊ฒฐ๊ณผ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์„ฑ๋Šฅ ๋ฐ ๋””๋ฒ„๊น… ๊ฐ€๋Šฅ์„ฑ ์ธก๋ฉด์—์„œ.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/9950#issuecomment-408984395 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AERrBGCphyQUu5lJQW7lgsqALLL3e0_Wks5uL2DLgaJpZM4JVDwV
.

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

์ €๋Š” Proxy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด ๋Œ์—ฐ๋ณ€์ด๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด๊ฒƒ์ด ๊ฐœ์ธ ํ•„๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ„์˜ ํ† ๋ก ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ™”์— ์ฐธ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@RyanCavanaugh

FWIW ์ €๋Š” tc39/proposal-class-fields#100 ์˜ ํ† ๋ก ์„ ํŠน์ • ํ•ญ๋ชฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ ํ•ด์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. # ๋Š” ์ฒ˜์Œ์—๋Š” ๋‚ฏ์„ค์ง€๋งŒ ์„ ํ˜ธ๋˜๋Š” ๊ตฌ๋ฌธ ํ˜•์‹์€ ์ œ์•ˆ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜๋Š” ์œ ์ผํ•œ ๊ตฌ๋ฌธ์€ ๋ถ„๋ช…ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ์ข…์˜ ์ ‘๋‘์‚ฌ sigil์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ this.someProp ๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ํ—ˆ์šฉํ•˜๋ ค๋Š” ๋ชจ๋“  ์‹œ๋„๋Š” ์‹คํŒจํ•  ์šด๋ช…์ž…๋‹ˆ๋‹ค.

๋Šฆ์—ˆ์ง€๋งŒ ์‹ค์ œ๋กœ this->var ๊ตฌ๋ฌธ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค .

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

๋Ÿฐํƒ€์ž„์— ์ ์šฉ๋˜๋Š” ์ผ์ข…์˜ _soft_ private๋กœ private ๋ณ€ํ™˜ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง„์ •ํ•œ hard private์„ ํ•„์š”๋กœ ํ•˜๋Š” ์œ ์Šค ์ผ€์ด์Šค๊ฐ€ ํŠนํžˆ ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ # ๊ตฌ๋ฌธ์„ ์‹ซ์–ดํ•˜๋”๋ผ๋„ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ private ๋ฅผ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ „์šฉ์€ _๋„ˆ๋ฌด_ soft IMO์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ์˜ต์…˜์€ ๊ฐ€๋Šฅํ•œ private ๋ณ€ํ˜•์˜ ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ๋ชจ๋‘ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Demo {
  private a

  #b

  <strong i="9">@reflect</strong>
  #c
}

๊ทธ๋ž˜์„œ ์ €๋Š” ์ƒˆ๋กœ์šด ์˜ต์…˜์ด ํ™œ์„ฑํ™”๋˜๋ฉด private a ๊ฐ€ <strong i="13">@reflect</strong> #a ๋ณ€ํ™˜๋  ๊ฒƒ์ด๋ผ๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ @reflect ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์› API๋ฅผ ํ†ตํ•ด ์†์„ฑ์„ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ @reflect ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(๋˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ถ€๋ฅด๊ณ  ์‹ถ์€ ๊ฒƒ์€ ๋ฌด์—‡์ด๋“ )๋Š” ๋ฏธ๋ž˜์— ํ‘œ์ค€ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ฉด์—์„œ ์ข‹์€ ํ›„๋ณด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ œ์•ˆ์˜ ์ฃผ์š” ๋‹จ์ ์€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€ JS์— ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌํ˜„๋˜๋Š” ํ‘œ์ค€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜์— ๋Œ€ํ•œ ํ˜„์‹ค์€ <strong i="19">@reflect</strong> #x ๊ฐ€ #x ๋ณด๋‹ค ๋Š๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์˜ต์…˜์œผ๋กœ ์ œ์•ˆํ•  ๋ฟ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด).

@MichaelTheriot

๋Šฆ์—ˆ์ง€๋งŒ ์‹ค์ œ๋กœ this->var ๊ตฌ๋ฌธ์„ ์ œ์•ˆํ•˜๋Š” ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ์ด ์ œ์•ˆ์€ ์ฃฝ์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค("์œ„์›ํšŒ๊ฐ€ ์—ด๊ด‘ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค"๊ฐ€ ๋‚ด๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋˜ ์œ ์ผํ•œ ์ด์œ ์ž„).

์œ„์›ํšŒ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด https://github.com/tc39/proposal-class-fields/issues/100#issuecomment -429460917๊ณผ ๊ฐ™์ด ํด๋ž˜์Šค 1.1 ์ œ์•ˆ ๋Œ€์‹  ํ˜„์žฌ ์ œ์•ˆ์„ ์ง€์ง€ํ•˜๋Š” ์ถฉ๋ถ„ํ•œ ์ด์œ ๋ฅผ ์ œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

@mbrowne

๋†“์ณค์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค 1.1์˜ ์ด์Šˆ ํŽ˜์ด์ง€๋Š” ๋ฐ˜๋…„ ๋™์•ˆ ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ๊ณ  ๋งํฌ ๋œ ์˜ˆ์ œ์กฐ์ฐจ๋„ ๋‚ด ์˜๊ฒฌ๋ณด๋‹ค ํ•œ ๋‹ฌ ํ›„์— ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, ๋ช‡ ๋‹ฌ ์ „์— ๋งํฌํ•œ ์Šค๋ ˆ๋“œ์—์„œ ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค . ์—ฌ๊ธฐ์— ๋‚ด ์˜๊ฒฌ์€ ๋Œ€์ฒด ๊ตฌ๋ฌธ์ด ์ œ์•ˆ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์˜คํ•ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ด€๋ จ๋œ ๋ชจ๋“  ๋‹น์‚ฌ์ž๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๋‚ด ์˜๊ฒฌ์€ TypeScript๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์„œ์˜ ์ฐธ์กฐ๋œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@MichaelTheriot ๋Œ€์•ˆ ์ œ์•ˆ์„ ์•Œ๋ ค์•ผ ํ•˜๋Š” ๋‹น์‚ฌ์ž๋Š” ์ด ๋Œ€ํ™”์— ๊ด€๋ จ๋œ ๋‹น์‚ฌ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. TypeScript๋Š” ๋น„์ค€์„ ์œ„ํ•ด ์ง„ํ–‰ ์ค‘์ธ ์ œ์•ˆ์„ ๋”ฐ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ฒด ๊ตฌ๋ฌธ์ด ์ œ์•ˆ๋˜์—ˆ์ง€๋งŒ ์ฑ„ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋‚ด ์ƒ๊ฐ์— ์ด ๋Œ€ํ™”์— ์‹ค์ œ๋กœ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ๋Ÿฐํƒ€์ž„ ๋ณดํ˜ธ/๋น„๊ณต๊ฐœ ๋ฉค๋ฒ„์˜ ๊ตฌํ˜„์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

lowclass ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋Ÿฐํƒ€์ž„ public/protected/private ๋ฉค๋ฒ„์˜ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์‚ฌ์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ตฌํ˜„์€ ๊ธธ์ง€ ์•Š์œผ๋ฉฐ ์ตœ์†Œํ•œ์˜ ๋ณดํ˜ธ/๊ฐœ์ธ ๊ธฐ๋Šฅ๋งŒ ๊ฐ–๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธํŠธ:

  • WeakMaps๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณดํ˜ธ/๊ฐœ์ธ ์ƒํƒœ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด๊ฐ€ ๋ณธ ๋‹ค๋ฅธ ๊ตฌํ˜„๊ณผ ๋‹ฌ๋ฆฌ ๋™๊ธฐ ํ˜ธ์ถœ ์Šคํƒ ์ถ”์ ์— ์˜์กดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— callbacks/promises/await๊ฐ€ ์žˆ๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • getter/setter(์ˆ˜ํผ ํ˜ธ์ถœ ํฌํ•จ)์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ ์ฐธ์กฐ).
  • ๊ธฐ๋ณธ super ๋˜๋Š” ES5์šฉ Super ๋„์šฐ๋ฏธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ ์ฐธ์กฐ).
  • constructor ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ ์ฐธ์กฐ).
  • ๊ธฐ๋ณธ ์ œ๊ณต ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ธฐ๋Šฅ(๋‚ ์งœ ์ œ์™ธ, ํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋งํ•˜์ง€๋งŒ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ๋กœ ์ž‘์—…ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฐธ์กฐ).
  • ์ผ๋ฐ˜ ๊ธฐ๋ณธ class es๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ธฐ๋Šฅ(ํ…Œ์ŠคํŠธ ์ฐธ์กฐ).
  • ๋„ค์ดํ‹ฐ๋ธŒ class es๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ๋ณดํ˜ธ ๋ฐ ๋น„๊ณต๊ฐœ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ ์ฐธ์กฐ).
  • ๊ธฐ๋ณธ class ๋Œ€์‹  ES5 ์Šคํƒ€์ผ function ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ ์ฐธ์กฐ).
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋งŽ์€ ์—ฌ์ง€(fe caching super/protected/private helper calls and optimizing lookup algos)

ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด:

npm install
npm test

๋˜ํ•œ Babel ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ๋ฌธ์ œ๋Š” https://github.com/babel/proposals/issues/12 ๋ฐ https://github.com/babel/babel/issues/8421 ์„ ์ฐธ์กฐ ํ•˜์„ธ์š” .

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๊ฐœ์ธ ํด๋ž˜์Šค ํ•„๋“œ ์‚ฌ์–‘์„ ๊ตฌํ˜„ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค.

์ด ๊ธ€์„ ์ฝ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ์•„์ด๋””์–ด๋ฅผ ์‚ดํŽด๋ณด๊ณ (๋” ๋งŽ์€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค) ์˜๊ฒฌ์„ ๋งํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

fe ์—ฌ๊ธฐ์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (ํ˜„์žฌ # IMHO๋ณด๋‹ค ๋” ๋‚˜์€ ๊ตฌ๋ฌธ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Œ).


์ด๋ฏธ public/private/protected๋ฅผ ๋„๋ฆฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” JavaScript ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด TypeScript ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” JS private/protected์˜ ๋ฏธ๋ž˜๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ private ํด๋ž˜์Šค ํ•„๋“œ๋Š” V8 v7.2์™€ Chrome 72์—์„œ ์ œ๊ณต๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. private ํ•„๋“œ ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@ChrisBrownie55 ๊ณต๊ฐœ ํ•„๋“œ๊ฐ€ ๋ฐฐ์†ก๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@jhpratt ๋‚ด ์ž˜๋ชป์ด์ง€๋งŒ Chrome ํŒ€์ด ๊ฐ€๊นŒ์šด ์‹œ์ผ ๋‚ด์— ๋น„๊ณต๊ฐœ๋กœ ๋ฐฐ์†กํ•  ๊ณ„ํš์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : https://v8.dev/blog/v8-release-72#public -class-fields

V8 7.2๋ถ€ํ„ฐ ๊ณต๊ฐœ ํด๋ž˜์Šค ํ•„๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ฌธ์„œํ™”ํ•˜์ง€๋งŒ ๊ฐœ์ธ ํ•„๋“œ(๊ฐ•์กฐ ๊ด‘์‚ฐ)์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ ํด๋ž˜์Šค ํ•„๋“œ์— ๋Œ€ํ•œ ์ง€์› ์€ ํ–ฅํ›„ V8 ๋ฆด๋ฆฌ์Šค์—์„œ ๊ณ„ํš๋ฉ๋‹ˆ๋‹ค .

@isiahmeadows ์‹ค์ œ๋กœ Google ๊ฐœ๋ฐœ์ž ๋ธ”๋กœ๊ทธ์˜ ๋‹ค๋ฅธ ๊ฒŒ์‹œ๋ฌผ์„ ์ฐธ์กฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Screenshot of Google Developers page

๊ฒฐ๋ก 

๊ณต๊ฐœ ํด๋ž˜์Šค ํ•„๋“œ๋Š” V8 v7.2 ๋ฐ Chrome 72์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋น„๊ณต๊ฐœ ํด๋ž˜์Šค ํ•„๋“œ๋Š” ๊ณง ์ œ๊ณตํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

Google ๊ฐœ๋ฐœ์ž ๋ธ”๋กœ๊ทธ์˜ ๊ธฐ์‚ฌ ๋งํฌ

์ด ๊ธฐ์‚ฌ๋Š” @mathiasbynens ์™€ Andreas Haas๊ฐ€ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์„ค๋ช…์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ฐ ๊ฒŒ์‹œ๋ฌผ์ด ๊ฝค ๋ช…ํ™•ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ). cc @gsathya ์™€ @joyeecheung ์€ V8 ๊ตฌํ˜„์˜ ๋งˆ๋ฌด๋ฆฌ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , 2019๋…„ 1์›” TC39 ํšŒ์˜๋Š” ์ œ์•ˆ์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์žฌํ™•์ธํ•˜๋ฉด์„œ ๋ฏผ๊ฐ„ ๋ถ„์•ผ ๋ฐ ๋ฐฉ๋ฒ• ์ œ์•ˆ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์„ ์žฌ๊ณ ํ•˜๋Š” 1๋…„ ๋ฐ˜์„ ๋งˆ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฒ„์ „์ด ์•ˆ์ •์ ์ด๊ณ  TypeScript๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Chrome์—์„œ ๋น„๊ณต๊ฐœ ํด๋ž˜์Šค ํ•„๋“œ๋ฅผ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค ๐ŸŽ‰
ํ˜„์žฌ _canary_ ๋นŒ๋“œ๋กœ ์ถœ์‹œ๋œ Chrome 74์—๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

screenshot of tweet

๋ฐฉ๊ธˆ Chrome 74์—์„œ ๊ฐœ์ธ ํด๋ž˜์Šค ํ•„๋“œ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค! ์ง€๊ธˆ Chrome ์นด๋‚˜๋ฆฌ์•„์—์„œ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”!
โ€” Twtiter๋ฅผ ํ†ตํ•œ Sathya Gunasekaran

๊ฐœ์ธ ํด๋ž˜์Šค ํ•„๋“œ์— ๋Œ€ํ•œ ํŠน์ • ๊ตฌํ˜„(๋˜๋Š” ๊ตฌํ˜„)์„ ์„ ํƒํ•˜๋Š” ๋ฐ ์žˆ์–ด ์šฐ๋ฆฌ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? @trusktr ์ด ๋ณด์•˜์ง€๋งŒ "_Private Inheritance_"๊ฐ€ ์‚ฌ์–‘์˜ ์ผ๋ถ€์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๊ฒฐ์ •์ ์œผ๋กœ ์•„๋‹™๋‹ˆ๋‹ค. private ํ•„๋“œ๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ๊ฑท์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋‹ค๋ฅธ ๊ฐœ์ฒด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ private๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ).

๊ฐœ์ธ ํ•„๋“œ๊ฐ€ WeakMaps(ํ•„๋“œ๋‹น ํ•˜๋‚˜์˜ WeakMap, Babel์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹)๋กœ ๋ณ€ํ™˜๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ # ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋…์ ์ ์œผ๋กœ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์ตœ์ข… ์ถœ๋ ฅ์—

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

๊ตฌํ˜„ ์ง„ํ–‰ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ํ…Œ์ŠคํŠธํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” PR์ด ์•„๋‹๊นŒ์š”?

@jhpratt ํ™•์‹คํžˆ! ์ด PR ์˜ ๋ถ„๊ธฐ๋ฅผ ํ™•์ธํ•˜๋ฉด ํ”„๋ผ์ด๋น— ์ด๋ฆ„์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ๋ฐ ์ ‘๊ทผ์ž๊ฐ€ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด ์ž‘์—…์„ ์—…์ŠคํŠธ๋ฆผํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด ์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ PR์ด ๋ณ‘ํ•ฉ๋˜๋Š” ์ฆ‰์‹œ ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ(Microsoft/TypeScript)์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ PRํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/Microsoft/TypeScript/pull/30467.

ํ”ผ๋“œ๋ฐฑ์„ ๊ฐ€์žฅ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

"๊ฐœ์ธ ์ƒ์†"์ด ์‚ฌ์–‘์˜ ์ผ๋ถ€์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Sidenote, 100% ์ง„์ •ํ•œ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ €๊ธ‰์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ญ์ œํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ ํ•„์š”๋กœํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋” ๋งŽ์€ ์‹คํ—˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , "๊ฐœ์ธ ์ƒ์†"์— ๋Œ€ํ•œ ์ด๋ก ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.


๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

"๋น„๊ณต๊ฐœ ์ƒ์†"(ํ˜„์žฌ ๋ฒ„์ „์˜ ๋กœ์šฐํด๋ž˜์Šค์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Œ)์€ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ˆ˜ํผํด๋ž˜์Šค์—์„œ ์ƒ์†๋œ ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ•ด๋‹น ํ•˜์œ„ ํด๋ž˜์Šค์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ์ธ์Šคํ„ด์Šค์˜ ๋น„๊ณต๊ฐœ ์†์„ฑ ์—๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•˜์œ„ ํด๋ž˜์Šค์—๋Š” ์ž์ฒด ์ •์˜์—์„œ ์ „์šฉ ๋ฉ”์„œ๋“œ๋กœ ์ •์˜๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ๋˜๋Š” ํ˜•์ œ ํด๋ž˜์Šค ๋ฒ”์œ„์—์„œ ์ธ์Šคํ„ด์Šค์˜ ์ „์šฉ ์†์„ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด์— ๋น„ํ•ด "๋ณดํ˜ธ๋œ ์ƒ์†"์—์„œ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ž์ฒด ์ธ์Šคํ„ด์Šค ๋˜๋Š” ์ƒ์œ„ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ์†์„ฑ์„ _can_ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํ˜•์ œ ํด๋ž˜์Šค์˜ ์†์„ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ณดํ˜ธ๋œ ์ƒ์†์—์„œ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค(์ˆ˜ํผ ํด๋ž˜์Šค๋Š” ๋ชจ๋‘ ๋™์ผํ•œ ์†์„ฑ์— ๋Œ€ํ•ด ์ฝ๊ธฐ/์“ฐ๊ธฐ).

๋‹ค์‹œ ๋งํ•ด์„œ "๋น„๊ณต๊ฐœ ์ƒ์†" ๊ฐœ๋…์—์„œ ๊ฐ ํด๋ž˜์Šค์—๋Š” ๋น„๊ณต๊ฐœ ๋ฒ”์œ„๊ฐ€ ์žˆ๊ณ  ์ƒ์†๋œ ๋ชจ๋“  ๋น„๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋Š” ๋กœ์ปฌ ํด๋ž˜์Šค ๋ฒ”์œ„์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋ณดํ˜ธ๋œ ๋ฉ”์„œ๋“œ๋Š” ์ „์ฒด ํด๋ž˜์Šค ๊ณ„์ธต์— ๋Œ€ํ•œ ๋‹จ์ผ ๋ฒ”์œ„์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ˜„์žฌ ecma proposal-class-fields private field ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•œ ๊ฒฝ์šฐ "๋น„๊ณต๊ฐœ ์ƒ์†"์ด ๋ฌด์—‡๊ณผ ์œ ์‚ฌํ•œ์ง€ ์„ค๋ช…ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


์˜ˆ์ œ ์ฝ”๋“œ๊ฐ€ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

Proposal-class-fields์—๋Š” "๊ฐœ์ธ ์ƒ์†"์ด ์—†์œผ๋ฏ€๋กœ ๋‹ค์Œ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ง„์ •ํ•œ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค).

class Foo {
    test() {
        this.#privateMethod()
    }

    #foo = 'foo'

    #privateMethod() {
        console.log(this.#foo)
    }
}

class Bar extends Foo {
    test() {
        // This does not work, no private inheritance:
        this.#privateMethod()
    }

    // #foo is private only inside Bar code, it is NOT the same #foo as in Foo
    // scope.
    #foo = 'bar'
}

๋‚ฎ์€ ํด๋ž˜์Šค์—์„œ "๋น„๊ณต๊ฐœ ์ƒ์†"์€ ํŽธ์ง‘๊ธฐ์—์„œ ์ผ๋ถ€ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๊ฒƒ์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋น„ DRY ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class Foo {
    test() {
        this.#privateMethod()
    }

    #foo = 'foo'

    #privateMethod() {
        console.log(this.#foo)
    }
}

class Bar extends Foo {
    test() {
        // This does not work, no private inheritance:
        this.#privateMethod()
    }

    // #foo is private only inside Bar code, it is NOT the same #foo as in Foo
    // scope.
    #foo = 'bar'

    // copy the method over by hand (because there's no private inheritance):
    #privateMethod() {
        console.log(this.#foo)
    }
}

๋‘ ์˜ˆ์—์„œ #foo ๋ณ€์ˆ˜๋Š” ๊ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ํŠน์ • ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. #foo ๋ณ€์ˆ˜๋Š” ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋‘ ๊ฐœ์ž…๋‹ˆ๋‹ค. ๊ฐ๊ฐ์€ ๋™์ผํ•œ ํด๋ž˜์Šค ์ •์˜์˜ ์ฝ”๋“œ๋กœ๋งŒ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ๊ธฐ ๋ฐฉ๋ฒ•์€ ์ƒ๊ธฐ ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฒ”์œ„์—์„œ ๋™์ž‘ _but_ lowclass์—์„œ ๊ฐœ์ธ ์ƒ์†, ์žฌ์‚ฌ์šฉ ์ „์šฉ ์ˆ˜ํผ ๋ฐฉ๋ฒ•์—์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์˜ˆ์™€ ๊ฐ™์ด ์Šˆํผํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์„œ๋ธŒํด๋ž˜์Šค์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ ๋ณ„๋„ #foo ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ์šฐํด๋ž˜์Šค์—์„œ ์Šˆํผํด๋ž˜์Šค์—์„œ #someMethod ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šˆํผํด๋ž˜์Šค์˜ #foo ์—์„œ ๋™์ž‘ํ•œ๋‹ค. ๊ฒฝ์šฐ #someMethod ์„œ๋ธŒ ํด๋ž˜์Šค์˜ ๋ฒ”์œ„์— ์‚ฌ์šฉ๋˜๋Š”, ๊ทธ๊ฒƒ์€์—์„œ ์ž‘๋™ #foo ๊ฐ€ ์•„๋‹Œ ์„œ๋ธŒ ํด๋ž˜์Šค์˜ #foo ์Šˆํผ ํด๋ž˜์Šค์˜!

๊ทธ๊ฒƒ์ด ๊ฐœ๋…์„ ์„ค๋ช…ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋”๋ผ๋„ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์•„์ด๋””์–ด๋ฅผ ์ด‰๋ฐœ์‹œํ‚ค๋Š” ๋ฐ ํฅ๋ฏธ๋กญ๊ฑฐ๋‚˜ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด์ œ Chrome ์•ˆ์ •์ ์ธ ์ฑ„๋„์— ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋Œ€๋ถ€๋ถ„ VSCode ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋‹๋ผ .js ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ VSCode๋Š” ์ด๋ฅผ ์˜ค๋ฅ˜๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. VSCode์—์„œ Vanilla JS์˜ private ํด๋ž˜์Šค ํ•„๋“œ์— ๋Œ€ํ•œ ์ง€์›์„ Typescript์— ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ํ† ๋ก ๊ณผ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” TS๊ฐ€ 4๋‹จ๊ณ„์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ์ง€์›์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TS๋Š” ์ด๋ฏธ ํ˜„์žฌ ์ถฉ๋ถ„ํžˆ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๋น„๊ณต๊ฐœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 4๋‹จ๊ณ„์— ๋„๋‹ฌํ•œ ํ›„์—๋Š” ๊ทธ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (ํ† ๋ก ์—์„œ ๋•Œ๋•Œ๋กœ ์œ ๋™์ ์ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์ด ํ™ฉ๊ธˆ ์‹œ๊ฐ„๋Œ€์— ์ค€๋น„๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์—…๋ฐ์ดํŠธ: Node 12 ์•ˆ์ • ๋ฒ„์ „์—์„œ๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Babel์—๋Š” ์ด ๊ตฌ๋ฌธ์„ ๋ณ€ํ™˜ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ข…์ข… 4๋‹จ๊ณ„ ์ œ์•ˆ์ด ๋˜๊ธฐ ์ „์— ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Vanilla JS(non-ts)์—์„œ ์ด ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ jsconfig.json ํ†ตํ•ด ํ™œ์„ฑํ™”ํ•˜์—ฌ VSCode๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. VSCode ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” JS ์ง€์›์ด TypeScript์—์„œ ์ง€์›๋˜๋ฉฐ ์ด ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ํ–ˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

TypeScript๊ฐ€ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €์™€ Node.js์˜ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์ด๋ฏธ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์„ ์ „ํ˜€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ๋งํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ TypeScript๊ฐ€ ์ง€๊ธˆ ๋ชจ๋“  ๊ฒƒ์„ ์™„์ „ํžˆ ๊ตณํ˜€์„œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์œผ๋กœ ์ถœ์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ง์€ ์•„๋‹™๋‹ˆ๋‹ค.

TypeScript๋Š” ์ด ๊ธฐ๋Šฅ์ด ์‹คํ—˜์ ์ด๋ฉฐ 3๋‹จ๊ณ„์™€ 4๋‹จ๊ณ„ ์‚ฌ์ด์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ”Œ๋ž˜๊ทธ ์•„๋ž˜ ๊ฐœ์ธ ํ•„๋“œ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜๋ฏธ ์—†์ด ๊ตฌ๋ฌธ ์ง€์›์„ ๋จผ์ € ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์˜๋ฏธ ์—†์ด ๊ตฌ๋ฌธ ์ง€์›์„ ๋จผ์ € ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์œ ํ˜• ๊ฒ€์‚ฌ/์ธํ…”๋ฆฌ์„ผ์Šค์˜ ๊ฒฝ์šฐ ์ผ์ข…์˜ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ BigInt ์™€ ๊ฐ™์€ ํ•˜์œ„ ๋ณ€ํ™˜ ์ง€์›์€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค( esnext ์™€ ํ•จ๊ป˜๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ).

fwiw, ๊ตฌํ˜„ ํ”ผ๋“œ๋ฐฑ์œผ๋กœ ์ธํ•ด 3๋‹จ๊ณ„์—์„œ๋งŒ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๋กฌ์ด ๋ฐฐ์†ก ์ค‘์ด๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์–ด๋–ค ๋ณ€ํ™”๋„ ๊ฑฐ์˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ChrisBrownie55 ์ด ๊ธฐ๋Šฅ์ด ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์€ ๋ง์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ง„ํ–‰ ์ค‘์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://github.com/microsoft/TypeScript/pull/30829
(๋ถ„๋ช…ํžˆ https://github.com/microsoft/TypeScript/pull/30467์—์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)

๋งž์Šต๋‹ˆ๋‹ค. #30829๋Š” ๋ฆฌ๋ฒ ์ด์Šค ํ›„ ๋ณ‘ํ•ฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ์ผ๋ถ€ ๊ธฐ๋Šฅ ๊ฒŒ์ดํŒ…์„ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ private-named ๋ฉ”์†Œ๋“œ์—์„œ ํญํŒŒ์‹œํ‚ต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ณ  ํ•ด์„œ(๋Š๋‚Œ์„ ํ™•์ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ) ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๊ทธ๋ž˜์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ† ๋ก ์—์„œ ๊ฐ€๋” ์œ ๋™์ ์ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ํ™ฉ๊ธˆ ์‹œ๊ฐ„๋Œ€์— ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@isiahmeadows๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํด๋ž˜์Šค ํ•„๋“œ ์ œ์•ˆ์€ ๋…ผ๋ž€์ด

๋‚ด๊ฐ€ ์–ธ์–ด ๊ตฌํ˜„์ž๋ผ๋ฉด ์ด์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ๊ฒƒ์ด๋ฉฐ ์ˆ˜์ฒœ ๋ช…์˜ (์•Œ์ง€ ๋ชปํ•˜๋Š”) ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ.

Private ํ•„๋“œ๋Š” ์•„๋งˆ๋„ ES6 ์ดํ›„ ๋„์ž…๋œ ๋ชจ๋“  ๊ธฐ๋Šฅ ์ค‘ ๊ฐ€์žฅ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ๋žŒ์ด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ™•์ •ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๊ธฐ ์ „์— ์‹ซ์–ดํ•จ์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@trusktr ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ๊ธฐ๋Šฅ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€๋Š” ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์ž์—๊ฒŒ

๋…ธ๋“œ์—์„œ๋„ ๋ฐฐ์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Node์˜ JS ์—”์ง„์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” Chrome ๋ฆด๋ฆฌ์Šค์˜ ๋ถ€์ž‘์šฉ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ๊ธฐ๋Šฅ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€๋Š” ๋„๊ตฌ๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งก๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๋˜ํ•œ ํด๋ž˜์Šค ํ•„๋“œ์™€ ๊ด€๋ จ๋œ ๋ฐœ ์ด์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๊ณ  ์ œ๊ณต๋œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์–ธ์–ด ์ž์ฒด์™€ ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์˜ ๋ฏธ๋ž˜์— ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ํŠน์ • ์‹ค์ˆ˜๋ฅผ ์ทจ์†Œํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋Šฆ๊ธฐ ์ „์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐœ์ „ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฐœ๋ฐœ์ž๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์ ์€ ์ƒˆ ๊ฐœ์ธ ํ•„๋“œ๊ฐ€ # ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— private ํ‚ค์›Œ๋“œ๋ฅผ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•  ์—ฌ์ง€๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TS๋Š” ์ •๋ง ํ‘œ์ค€์„ 100% ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์œ„์›ํšŒ๊ฐ€ thisGlobal ๋˜๋Š” #privateLol ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋ฐ˜๋Œ€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋„ˆ๋ฌด ๋Šฆ๊ธฐ ์ „์— Google์ด JavaScript์— ๋Œ€ํ•ด ๋…์ ๊ถŒ์ด ์—†๋‹ค๊ณ  ๋งํ•  ๋•Œ์ž…๋‹ˆ๊นŒ?

@TeoTN ๋น„๊ณต๊ฐœ ํ•„๋“œ๋Š” Google์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ์ตœ์‹  ํ‘œ์ค€๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ TC39๋ฅผ ํ†ตํ•ด ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ:

  • ์šฐ๋ฆฌ๋Š” ์•„์ง ์™„์ „ํžˆ ๊ตฌ์›Œ์ง€์ง€ ์•Š์€ ES ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋‘๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์„ ํƒ์  ์—ฐ๊ฒฐ, null ๋ณ‘ํ•ฉ, throw ์‹, ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์ž, nameof ๋“ฑ ์ฐธ์กฐ).
  • ๋ฐ˜๋Œ€๋กœ, ์Šน์ธ๋œ ES ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ์–ด๋–ค ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ์–ด๋Š ์ชฝ์ด๋“  ์š”์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • ๊ฐœ์ธ ํ•„๋“œ๋Š” ์‹ฌ๊ฐํ•œ ์‚ฌ์šฉ์ž ๊ณ ํ†ต์„ ์•ผ๊ธฐํ•˜๋Š” ์ถ”ํ›„ ์„ค๊ณ„ ๋ณ€๊ฒฝ(๋˜๋Š” ์ทจ์†Œ) ์—†์ด ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฒฝ์šฐ TS์— ํฌํ•จ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@RyanCavanaugh ์„ค๋ช…๊ณผ ๋ชจ๋“  ๋ฉ‹์ง„ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ž‘์€ ์ œ์•ˆ: ES๋Š” ์ง€์†์ ์œผ๋กœ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ๊ณ  ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋‹จ๊ณ„์—์„œ - 4๋‹จ๊ณ„?๋ผ๋Š” ๊ทœ์น™์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 3๋‹จ๊ณ„? ์•„๋‹ˆ๋ฉด ๊ทธ ์‚ฌ์ด ์–ด๋”˜๊ฐ€? - ES ๊ธฐ๋Šฅ์€ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•ž์œผ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋…ผ์˜๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ผ์ด๋น— ํ•„๋“œ๋Š” ์™„์ „ํžˆ ๊ตฌ์›Œ์กŒ๋‹ค๊ณ  ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@kkimdev Stage 4๋Š” ์—ฌ๊ธฐ๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€์˜ ์ผ๋ถ€๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์™„์ „ํžˆ ๊ตฌ์›Œ์ง€์ง€ ์•Š์€ ES ๊ธฐ๋Šฅ

์™„์ „ํžˆ ๊ตฌ์šด ES ๊ธฐ๋Šฅ์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ "์™„์ „ํžˆ ๊ตฌ์›Œ์กŒ๋‹ค"๋Š” ๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์Šน์ธ๋œ ES ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ ๋ฐฐ์†ก์€ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ TypeScript์˜ ๋ชฉํ‘œ๊ฐ€ ๋ฐ”๋‹๋ผ JS๋ณด๋‹ค ๋‹จ์ˆœํ•œ ์œ ํ˜•์ด๋ผ๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์™„์ „ํžˆ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ namespace ์™€ ๊ฐ™์€ ๊ฒƒ์€ ํ˜„์žฌ ๋ชฉํ‘œ์™€ ๊ด€๋ จํ•˜์—ฌ ์ž˜๋ชป๋œ ์„ ํƒ์ด์—ˆ๊ณ  enum ๋„ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Œ).

TypeScript๋Š” ๋ชจ๋“  ์ฃผ์š” ์—”์ง„์ด ์ง€์ •๋œ ๊ธฐ๋Šฅ์„ ๋งŒ์žฅ์ผ์น˜๋กœ ์ œ๊ณตํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Œ์œผ๋กœ์จ ์–ธ์–ด ์‚ฌ์–‘์ด ํ”๋“ค๋ฆฌ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋•๊ฑฐ๋‚˜ ๋•์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TS ํŒ€ ๊ตฌ์„ฑ์›์ด TC39์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋“ค์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฒ˜์Œ์— ๊ธฐ๋Šฅ์„ ์ถœ์‹œํ•˜๊ธฐ ์ „์— ์ด๋ฏธ 3๋‹จ๊ณ„์ธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ•ฉ์˜์˜ ์ผ๋ถ€์˜€์Šต๋‹ˆ๋‹ค(์ด ๊ธฐ๋Šฅ์ด ํฌํ•จ๋จ).

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

์ด๋Ÿฌํ•œ ์–ธ์–ด ๋””์ž์ธ ๊ฒฐ์ •์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ์žฅ์†Œ๋Š” ์ œ์•ˆ ์ €์žฅ์†Œ, TC39 ํšŒ์˜ ๋ฐ ์ด ์ž‘์—…์— ์ „๋…ํ•˜๋Š” ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” @trusktr ๊ณผ ํ•จ๊ป˜ private ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ ์ œ์•ˆ์— ๋Œ€ํ•ด ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ

๊ถ๊ทน์ ์œผ๋กœ TC39๋Š” ์–ธ์–ด ์„ค๊ณ„๋ฅผ ๊ณ„์†ํ•ด์•ผ ํ•˜๋Š” ๊ณณ์ด๋ฉฐ TypeScript ์ €์žฅ์†Œ๋Š” ๊ธฐ๋Šฅ์˜ ์šฐ์„  ์ˆœ์œ„ ๋ฐ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ, ๊ธฐ๋Šฅ์ด ์–ธ์ œ ํ•„์š”ํ•œ์ง€ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ธก๋ฉด์„ ๋…ผ์˜ํ•˜๋Š” ๊ณณ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋ถ„ํžˆ ์•ˆ์ •์ ์œผ๋กœ ๋ฐฐ์†ก๋ฉ๋‹ˆ๋‹ค.

TypeScript Intellisense๋Š” VS Code์—์„œ JavaScript ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฅผ ๊ฐ•ํ™”ํ•˜๊ณ  VS Code ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ฐพ์€ ๋‘ ๊ฐ€์ง€ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ๋ฌธ์ œ(Microsoft/vscode#72867 ๋ฐ Microsoft/vscode#39703)๋ฅผ ์—ฌ๊ธฐ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋ฏ€๋กœ TypeScript๋กœ์˜ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด JavaScript ํŒŒ์ผ์˜ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ๊ฒƒ์ด ๋ฉ‹์งˆ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•จ์œผ๋กœ์จ ๊ธฐ์—ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ตฌ๋ฌธ์„ ์ง€์›ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ JavaScript๋Š” VS Code์—์„œ ์ž˜๋ชป๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. :-)

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

์ œ๊ฐ€ TypeScript ํŒ€์— ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ, ๊ทธ๋“ค์€ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ ๊ทน์ ์œผ๋กœ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด ์‹œ์ ์—์„œ ๊ฐœ์ธ ํ•„๋“œ๊ฐ€ ์ง€์›๋  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ๋Š” ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. https://github.com/microsoft/TypeScript/pull/30829๋ฅผ ์ฐธ์กฐ

์ž‘์—… ์ค‘์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” TS ํŒ€๊ณผ ํ˜‘๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ๋ฆฌ๋ฒ ์ด์Šค๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. TS(๋ฐ ํ™•์žฅ์— ๋”ฐ๋ผ Language Server)์˜ private-named ํ•„๋“œ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค.

https://github.com/microsoft/TypeScript/pull/30829 ์—์„œ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ Bloomberg์˜ ๊ณต๋™ ์ž‘์—…์ž์—๊ฒŒ ํฐ ๊ฐ์‚ฌ๋ฅผ ๋“œ๋ฆฝ๋‹ˆ๋‹ค

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ๋ง์”€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๊ทผ๊ฑฐ๊ฐ€ ๋ฐœ๊ด‘์„ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•™์Šต์— ๊ด€์‹ฌ์ด์žˆ์–ด ํŠน๋ณ„ํ•œ #private PropertyDeclaration ์„ ์ฃผ๋„ํ•˜๋Š” ๊ฒƒ์ด ์ด ๋ฌธ์ œ .

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์„ ์–ธ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

// index.d.ts
declare class Foo {
    #private;
    // ...
}

...์ž…๋ ฅ์ด ์ฃผ์–ด์ง€๋ฉด:

// index.ts
class Foo {
    #name: string;
}

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฑฐ๊ธฐ์— ์žˆ์–ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ๋จผ์ € ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์„ ์–ธ ์ƒ์„ฑ์„ ์ค‘์‹ฌ์œผ๋กœ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฑฐ๊ธฐ์— ์žˆ์–ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ๋จผ์ € ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์„ ์–ธ ์ƒ์„ฑ์„ ์ค‘์‹ฌ์œผ๋กœ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

private์˜ ์กด์žฌ๋Š” ์šฐ๋ฆฌ์˜ ๋ถ„์„์—์„œ ํด๋ž˜์Šค๋ฅผ ๋ช…๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค๋ฏ€๋กœ ์„ ์–ธ ํŒŒ์ผ์—์„œ ์ด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. dts-downlevel ์™€ ๊ฐ™์€ ์‚ฌํ›„ ๋ฐฉ์ถœ ์„ ์–ธ ๋ณ€ํ™˜๊ธฐ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์ด์ „ TS์— ๋Œ€ํ•œ ๊ฐœ์ธ ์„ ์–ธ์˜ ์ˆ˜์ค€์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (์•„์ง #privates์— ๋Œ€ํ•œ ํ•˜์œ„ ๋ ˆ๋ฒจ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค)

Wesley๊ฐ€ ๋งํ•œ ๊ฒƒ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด: downlevel-dts ๋Š” ์ด์ „ ๋ฒ„์ „์˜ TypeScript์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด #private๋ฅผ private ์ˆ˜์ •์ž๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

private์˜ ์กด์žฌ๋Š” ์šฐ๋ฆฌ์˜ ๋ถ„์„์—์„œ ํด๋ž˜์Šค๋ฅผ ๋ช…๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค๋ฏ€๋กœ ์„ ์–ธ ํŒŒ์ผ์—์„œ ์ด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ž˜์Šค๋ฅผ ๋ช…๋ชฉ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๐Ÿ™‚ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ์†์„ฑ #foo ๋ฐ #bar ์ฃผ์–ด์ง€๋ฉด ์—ฌ์ „ํžˆ ํ•˜๋‚˜์˜ ํŠน๋ณ„ํ•œ #private ์•ฐ๋น„์–ธํŠธ ์„ ์–ธ #private ์†์„ฑ ์„ ์–ธ์œผ๋กœ ๋Œ€์ฒด๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. #foo ๋ฐ #bar ์ด๋ฆ„์„ ๋ณด์กดํ–ˆ๋‹ค๋ฉด ๋” ์ž˜ ์ดํ•ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ LanguageService๊ฐ€ #private ์†์„ฑ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ถˆํ‰ํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ ์•ฝ๊ฐ„ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ private ํ•„๋“œ๋Š” ํ˜•์‹์˜ public ์†์„ฑ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ฉฐ ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ก ์ ์œผ๋กœ ์™œ ๊ทธ๋“ค์ด ์„ ์–ธ์˜ ์ผ๋ถ€๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. KeyOf ์œ ํ˜•์ด ์•„๋‹ˆ๊ณ  ์•ฐ๋น„์–ธํŠธ ์„ ์–ธ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ public ์ด์™ธ์˜ ๋‹ค๋ฅธ ์•ก์„ธ์Šค ์ˆ˜์ •์ž๋กœ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ํ•„๋“œ ๋ฐ ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ์›์น™์ด ์ ์šฉ๋˜์–ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

Wesley๊ฐ€ ๋งํ•œ ๊ฒƒ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด: downlevel-dts ๋Š” TypeScript์˜ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด #private๋ฅผ private ์ˆ˜์ •์ž๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด private ์ˆ˜์ •์ž๋ฅผ ์ œ๊ณตํ•˜๋Š” ์†์„ฑ์ด ์œ ํ˜•์˜ ๊ณต์šฉ ์†์„ฑ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ .d.ts ํŒŒ์ผ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” ํŠนํžˆ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์˜ˆ์ œ์—์„œ๋„ #private ๋ผ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์†์„ฑ์— ๋Œ€ํ•œ ์ง„๋‹จ์„ ์ƒ์„ฑํ•˜๋Š” ์„ ์–ธ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@wessberg ์›์น˜ ์•Š๋Š” ์–ธ์–ด ์„œ๋น„์Šค ๊ฒฝ๊ณ ๋กœ ๋ฐœ๊ฒฌํ•œ ๋ฒ„๊ทธ๋ฅผ ๋ณด๊ณ ํ–ˆ์œผ๋ฉฐ ์•„๋งˆ๋„ ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์งˆ๋ฌธ์„ ๋‹ค์‹œ:

ํด๋ž˜์Šค๋ฅผ ๋ช…๋ชฉ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ˆ„๊ตฐ๊ฐ€ ์ „์— ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค .

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— ๋ช…๋ชฉ์ƒ์„ ๋งŒ๋“œ๋Š” ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” ํด๋ž˜์Šค์˜ ๊ตฌํ˜„์ž๊ฐ€ private ํ•„๋“œ ๊ฐ„์— ์ˆจ๊ฒจ์ง„ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•ญ์ƒ ์ •๋ ฌ๋จ" ๋˜๋Š” "์ง๊ฒฝ์€ 2 * ๋ฐ˜๊ฒฝ์ž…๋‹ˆ๋‹ค."

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

class A {
    #foo = getFoo();
    bar = "bar";
    equals(other: A) {
        return this.#foo === other.#foo && this.bar === other.bar;
    }
}

new A().equals({ bar: "bar" }); // error: missing property '#foo'

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์šฐ๋ฆฌ๊ฐ€ #private ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋„ˆ๋ฌด ๊ธฐ์ฉ๋‹ˆ๋‹ค! ๊ทธ๊ฒƒ์€ ๊ต‰์žฅ!

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†๊ธฐ ๊ตฌ๋ฌธ(์ œ์•ˆ ์ฐธ์กฐ)์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด ์ •๋ง ๋ถ€๋„๋Ÿฝ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

class Counter {
  #count = 0
  increment() {
    return #count++
  }
}

์‹คํ—˜์  ๊ธฐ๋Šฅ์œผ๋กœ ์†๊ธฐ ๊ตฌ๋ฌธ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด typescript ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ tsconfig ์˜ต์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋ถˆํ•„์š”ํ•œ this. ๋ฐ˜๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋งค๋„๋Ÿฌ์šด ์ธ์ฒด ๊ณตํ•™์  ๊ฐœ์„ ์„ ์œ„ํ•ด ์ฃฝ์–ด ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์„œ์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์•ฝ์‹ ๊ตฌ๋ฌธ์˜ ๋‹จ์ ์€ ์ œ๊ฐ€ ๊ฑฑ์ •ํ•  ์ค‘์š”ํ•œ ๋ฌธ์ œ๋กœ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ํ™•์‹คํžˆ ๋‚ด ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ์—์„œ "experimentalPrivateShorthand": true ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์„ค์ •ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ด€๋ จ๋œ ์ž‘์—…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฑด๋ฐฐ!

:์›จ์ด๋ธŒ:์ถ”๊ฒฉ

@chase-moskal TypeScript๋Š” ECMAScript ํ‘œ์ค€ ์ด์™ธ์˜ ์œ ํ˜•์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ฐœ์ธ ํ•„๋“œ์™€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@chase-moskal this ํ•ญ์ƒ ์ž…๋ ฅํ•˜์ง€ ์•Š๋Š” ๊ฐ€์žฅ ์‹ค์šฉ์ ์ธ ๋ฐฉ๋ฒ•์€ ์†”์งํžˆ IDE์—์„œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: F3). TS ํŒŒ์„œ ๋˜๋Š” Babel ํŒŒ์„œ๋ฅผ ๋ถ„๊ธฐํ•˜๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์„ฑํ•˜์—ฌ ๋งŽ์€ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ชจ๋‘ ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋ฉฐ ๊ณต์‹ ๋„๊ตฌ์™€ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์€ ๋ฌผ๋ก  ๊ณต์‹ ์ง€์›์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ์ œ ์ƒ๊ฐ์„ ๊ณต์œ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@jhpratt โ€” ๋‚ด๊ฐ€ ํž™ํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ. ์˜ˆ์ „์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค! ์ ์–ด๋„ ์ง€๊ธˆ๋ณด๋‹ค๋Š” babel๊ณผ ๊ฒฝ์Ÿ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ, ๋‚˜๋Š” 1๋…„ ์ „์— ๋‚ด babel์„ ์‚ฌ์šฉํ•˜๋Š” ์ƒ๋Œ€๋ฐฉ์ฒ˜๋Ÿผ ๋ฉ‹์ง„ ๋ฏธ๋‹ˆ๋ฉ€๋ฆฌ์ฆ˜ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์œผ๋ฉฐ babel์—๋Š” ๋‚ด๊ฐ€ ๊ฐˆ๋งํ•˜๋Š” ๋ชจ๋“  ์ข…์†Œ๋ฆฌ์™€ ํœ˜ํŒŒ๋žŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค!


@mbrowne โ€” ๊ฐ€๋…์„ฑ ๋งŒํผ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ฝ”๋“œ์˜ "์“ฐ๊ธฐ ๊ฐ€๋Šฅ์„ฑ"์ด ์•„๋‹ˆ๋ฏ€๋กœ ํ‚ค ๋ˆ„๋ฆ„ ๊ณ„์‚ฐ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‚ด ์š”์ ์€ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ this ๋ฐ˜๋ณต์ด ๋„ˆ๋ฌด ์ž์ฃผ ๋ถˆํ•„์š”ํ•œ ๋ถˆํ•„์š”ํ•œ ํ˜ผ๋ž€์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค. #private ๊ตฌ๋ฌธ์ด ์•ฝ์‹์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉด this ๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ๋งˆ๋‹ค ๊ณต๊ฐœ ๋ฉค๋ฒ„ ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋…์„ฑ!


์–ด์จŒ๋“ , ๋‚˜๋Š” typescript๊ฐ€ ์•„์ง private ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด ๋ชจ๋“  ๊ฒƒ์€ ๋” ๋งŽ์€ ์ž‘์—…๊ณผ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋ธ”๋ฃธ๋ฒ„๊ทธ ์‚ฌ๋žŒ๋“ค์ด

ํ•„๋“œ๋ฅผ ์ผ์น˜์‹œํ‚ค๋Š” ๊ฐœ์ธ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋‹ค๋ฆฌ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(์•„๋ฌด๋„ ๊ฐ™์€ ํด๋ž˜์Šค์—์„œ ๋ฏธ์ณ๋ฒ„๋ฆฌ์ง€ ์•Š๊ณ  typescript-privates์™€ ํ•ด์‹œํƒœ๊ทธ-privates๋ฅผ ํ˜ผํ•ฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!)

๊ทธ๋ž˜์„œ, ์—ฌ๊ธฐ์—์„œ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋ธ”๋ฃธ๋ฒ„๊ทธ ํŒ€์ด๊ณ , 1๋…„ ์ „์—๋„ babel์„ ์œ„ํ•œ ๋™์ผํ•œ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ๊ธฐ๋Šฅ์— ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ์‹ ์˜ ์ผ์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์™œ ๊ทธ๋Ÿฐ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๊ฒƒ์„ ์œ ์ง€! ๊ฑด๋ฐฐ!

:์›จ์ด๋ธŒ:์ถ”๊ฒฉ

์˜ˆ, TypeScript๋Š” ๋ช‡ ๋…„ ์ „์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ญ”์ง€ ๋งž์ถฐ๋ด? ์˜๋ฏธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํฐ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ด์ œ TypeScript๋Š” ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ๋ ˆ๊ฑฐ์‹œ API๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉฐ ์ œ๊ฑฐํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ๋•Œ๋งˆ๋‹ค ์—„์ฒญ๋‚œ ์†์ƒ์„ ์ผ์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ECMAScript ์‚ฌ์–‘์˜ ์ผ๋ถ€์ด๋ฏ€๋กœ ์ด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์€ ์ „ํ˜€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

TypeScript๋Š” ํ˜„์žฌ 3๋‹จ๊ณ„์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ECMAScript ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์—ฌ๊ธฐ์—์„œ TS๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ–๊ธฐ ์ „์— ์•ฝ์–ด๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, TypeScript๋Š” ๋ช‡ ๋…„ ์ „์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ญ”์ง€ ๋งž์ถฐ๋ด? ์˜๋ฏธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํฐ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด์ƒ์ ์ธ ์„ธ์ƒ์— ์‚ด๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉฐ ํ˜„์žฌ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ œ์•ˆ์€ ์•„์ง 2๋‹จ๊ณ„์ด์ง€๋งŒ ์ผ๋ถ€ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ(Angular)์—์„œ๋Š” ์˜ค๋žซ๋™์•ˆ ์ด๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์˜ˆ: ECMAScript๋Š” ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ํด๋ž˜์Šค ๋ฉค๋ฒ„์— ๋Œ€ํ•ด protected ์ˆ˜์ •์ž๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ œ TypeScript๋Š” ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ๋ ˆ๊ฑฐ์‹œ API๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉฐ ์ œ๊ฑฐํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ๋•Œ๋งˆ๋‹ค ์—„์ฒญ๋‚œ ์†์ƒ์„ ์ผ์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ ์•„๋ž˜์— ์‹คํ—˜์  ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

TypeScript๊ฐ€ 1๋‹จ๊ณ„ ๋˜๋Š” 2๋‹จ๊ณ„์—์„œ ๊ฐ ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€๋Š” ์•Š์ง€๋งŒ TS์— ๋Œ€ํ•œ ๋งŽ์€ ํฅ๋ฏธ๋กœ์šด ์ œ์•ˆ์ด ๋ง‰ํ˜”์Šต๋‹ˆ๋‹ค. ECMAScript์—๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์˜ˆ: https://github.com/microsoft/TypeScript/issues/2000).

@ikokostya TypeScript๊ฐ€ ๊ตฌํ˜„ํ•œ ํ›„ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์˜ ์˜ˆ๋กœ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์†๊ธฐ๊ฐ€ "์ง€๊ธˆ ๋‹น์žฅ ํ•„์š”ํ•˜๋‹ค"๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”? ์ €๋ฅผ ๋ฏฟ์œผ์„ธ์š”. ์ถ”๊ฐ€๋กœ 5๋ช…์˜ ์บ๋ฆญํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ ์ค‘์š”ํ•˜๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ํฌํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript๋Š” ํ”Œ๋ž˜๊ทธ ์•„๋ž˜์—์„œ๋„ 3๋‹จ๊ณ„ ์ด์ „์— ์–ด๋–ค ๊ฒƒ๋„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ํ™•๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ „์— ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ๋ฌธ์ œ์—์„œ ์ฒ ์ €ํžˆ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋น™๊ธ€๋น™๊ธ€ ๋„๋Š” ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณด์ด์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฃผ๋ชฉํ• ๋งŒํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ํ•œ ๋” ์ด์ƒ ์‘๋‹ตํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

@jhpratt ๋‚ด ์š”์ ์€ ์†๊ธฐ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ œ ๋Œ“๊ธ€์„ ๋๊นŒ์ง€ ์ฝ์–ด์ฃผ์„ธ์š”.

ํฌํฌ์— ๋Œ€ํ•œ ์ œ์•ˆ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์†๊ธฐ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด ์ •๋ง ๋ถ€๋„๋Ÿฝ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ด์•ผ

๊ทธ ์†๊ธฐ๋Š” # ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋Š” ํŒŒ์ดํ”„๋ผ์ธ ์ œ์•ˆ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋ฏธ 2๋‹จ๊ณ„ ์ œ์•ˆ์ด ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ผ์ฐ ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ๋Š” ์–ด๋–ค ์ œ์•ˆ์ด ์Šน๋ฆฌํ• ์ง€์กฐ์ฐจ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜๋”๋ผ๋„ ์ ‘๋‘์‚ฌ # ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ์ž๋Š” 5๊ฐœ์˜ ์ถ”๊ฐ€ ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ์•ฝ์‹๋ณด๋‹ค ๋” ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

... ํŠนํžˆ ๊ฐœ์ธ ํ•„๋“œ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ์ƒ๋‹น ๋ถ€๋ถ„์ด this ์— ์ „ํ˜€ ์—†๋Š” ๊ฒฝ์šฐ(์˜ˆ: static isMe(obj) { try { obj.#x; return true; } catch { return false; } } , ํ•œ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด).

@phaux โ€” ์†๊ธฐ ๋Œ€ ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•œ ์ •๋ง ์ข‹์€ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@jhpratt

TypeScript๋Š” ํ”Œ๋ž˜๊ทธ ์•„๋ž˜์—์„œ๋„ 3๋‹จ๊ณ„ ์ด์ „์— ์–ด๋–ค ๊ฒƒ๋„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ํ™•๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์ถฉ๋ถ„ํžˆ ๊ณตํ‰ํ•˜์ง€๋งŒ ๊ฐœ์ธ์  ๋ฐฉ๋ฒ•์€ ์‚ฌ์‹ค 3๋‹จ๊ณ„ ์ด์ง€๋งŒ ์•„์ง ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ์ง€์›์ด ์—†๋‹ค๋Š”

๋‚˜๋Š” ๋ธ”๋ฃธ๋ฒ„๊ทธ ํŒ€์ด 1๋…„ ์ „ babel์—์„œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹ ์˜ ์ผ์„ ๊ณ„์†ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋„)? ๊ทธ๋ ‡๋‹ค๋ฉด ์ •๋ง ์ธ๋‚ด์‹ฌ์„ ๊ฐ–๊ณ  ์ชผ๊ทธ๋ ค ์•‰์•„๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. :)

ecmascript ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด babel ๋ฐ ๋ธŒ๋ผ์šฐ์ €์™€ ๋น„๊ตํ•˜์—ฌ ํ›จ์”ฌ ๋” ๊ฒฝ์Ÿ๋ ฅ์ด ์žˆ์—ˆ๋˜ typescript์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ด์ œ๋Š” ์‹ค์ œ๋กœ ๋„ˆ๋ฌด ๋ณด์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” babel ๊ณผ chrome ์ด ๋ชจ๋‘ 1๋…„ ์ „์— ๋น„๊ณต๊ฐœ ํ•„๋“œ(ํ”Œ๋ž˜๊ทธ ์—†์Œ)๋ฅผ ์ œ๊ณตํ•œ ์ƒํ™ฉ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธ”๋ฃธ๋ฒ„๊ทธ๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Ÿฌ ์™”๋‹ค

์ €๋Š” ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ์™€ babel ๊ธฐ๋Šฅ ์ง‘ํ•ฉ ์‚ฌ์ด์˜ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๊ฐ€ ๋ถˆ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ œ babel ์นœ๊ตฌ๋“ค์€ ์ž‘๋…„์— ์•„๋ฆ„๋‹ต๊ฒŒ ๋งค๋„๋Ÿฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ์™”์ง€๋งŒ ์ €๋Š” ์—ฌ์ „ํžˆ ์—ฌ๊ธฐ์— ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ํŒจ๋„ํ‹ฐ๋ฅผ ์ง€๋ถˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ €๋ฅผ ๋น„์›ƒ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

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

์ ์  ๋” ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด๋‚˜ ์ •์  ์œ ํ˜•์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๋‘ ์„ธ๊ณ„์˜ ์žฅ์ ์„ ๋ชจ๋‘ ๊ฐ€์งˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์•ˆ์— ์ธ์ง€ ๋ถ€์กฐํ™”๊ฐ€ ์ปค์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

3๋‹จ๊ณ„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด typescript์— ๋Œ€์—ญํญ์ด ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋ถ€์กฑํ•œ๊ฐ€์š”?

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

:์›จ์ด๋ธŒ:์ถ”๊ฒฉ

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

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

๊ฐœ์ธ ๋ฉ”์†Œ๋“œ ๋ฐ ์ ‘๊ทผ์ž์— ๊ด€ํ•ด์„œ๋Š”: V8์—์„œ๋„ ๊ตฌํ˜„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์™€ ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋ฉฐ... ์Šค์œ„์น˜๋ฅผ ์ผœ์„œ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ๋Š” ์‹ค์ œ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๊ณ  ์ด๋ฏธ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ์˜ ์ž‘์—…์œผ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ๊ณ  ์ž‘์€ ํŒ€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ทœ์น™์€ ์ œ์•ˆ์ด 3๋‹จ๊ณ„์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ์ œ์•ˆ์˜ ์˜๋ฏธ๊ฐ€ ์ตœ์ข…์ ์ด๋ผ๋Š” ํ™•์‹ ์„ ๊ฐ–๊ณ  ์‹ถ๋‹ค๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋ฌผ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์˜๋ฏธ ์ฒด๊ณ„๋Š” 3๋‹จ๊ณ„์—์„œ _can_ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ํ•ฉ๋‹นํ•œ ์ด์œ  ์—†์ด V8์—์„œ ๊ตฌํ˜„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์˜คํ•ดํ•˜์ง€ ๋งˆ์„ธ์š”. ์ €๋„ ๊ทธ ์ œ์•ˆ์ด ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ๊ณ  ๋นจ๋ฆฌ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„์˜ ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„ ๋‚ญ๋น„์ด๋ฉฐ TS ํŒ€์˜ ์‹œ๊ฐ„์€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. _์˜ค๋Š˜_ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ 2, 1, 0๋‹จ๊ณ„ ์ œ์•ˆ์ด ์…€ ์ˆ˜ ์—†์ด ๋งŽ์ง€๋งŒ ์•„์ง ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์นœ๊ตฌ์•ผ ์ฐธ์•„.

๋˜ํ•œ babel์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ babel์„ ๋…์ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@0kku โ€” ์ฒ ํ•™์  ๋ฌธ์ œ๋ผ๊ธฐ ๋ณด๋‹ค๋Š” ๋‹จ์ง€ ๋Œ€์—ญํญ/์šฉ๋Ÿ‰ ๋ฌธ์ œ๋ผ๊ณ  ๋ง์”€ํ•˜์‹œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค โ€” ์ด์ œ ๋ฒ„๊ทธ ๋ฐฑ๋กœ๊ทธ๊ฐ€ 3๋‹จ๊ณ„ ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์ง€๋งŒ typescript์˜ ์ดˆ๊ธฐ ์—ญ์‚ฌ๋กœ ๋Œ์•„๊ฐ€๋ฉด ์•„๋งˆ๋„ ๋ฒ„๊ทธ๊ฐ€ ๋” ์ ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. , ๊ทธ๋ž˜์„œ ์‹คํ—˜์  ๊ตฌํ˜„์— ์šฉ๋Ÿ‰์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์› ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด ์ด๋ก ์„ ์‚ด ์ˆ˜ ์žˆ๊ณ  ์šฐ๋ฆฌ์˜ ์‘๋‹ต์€ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ๊ธฐ์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

@ljharb โ€” ์˜ค, ์ด์ œ ๋งค์šฐ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค โ€” ์‹ค์ œ๋กœ ๊ทธ๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ typescript์™€ babel์„ ํ•จ๊ป˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‘ ์„ธ๊ณ„์˜ ์ตœ๊ณ ๋ฅผ ๋‹ฌ์„ฑํ•˜๋ ค๋ฉด?

ํ•˜์ง€๋งŒ vscode ts ์–ธ์–ด ์„œ๋น„์Šค๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ตฌ๋ฌธ(์˜ˆ: ๊ฐœ์ธ ๋ฉ”์„œ๋“œ)์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? Intellisense๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด typescript์˜ ๊ฐ€์น˜ ์ œ์•ˆ์—์„œ ๋„ˆ๋ฌด ํฐ ๋ฉ์–ด๋ฆฌ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. Intellisense๋ฅผ ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ „๋žต์€ ์‹œ์ž‘์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์žฅ๊ธฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ ์‹คํ—˜ ๊ธฐ๋Šฅ์˜ ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ํŠน์ • ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๋ฅผ โ€‹โ€‹๊ตฌ๋ถ„ํ•˜๊ณ  ๋˜ํ•œ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ๊ฐ€ tsconfig ์ˆ˜์ค€์—์„œ ์ด๋Ÿฌํ•œ ํŠน์ • ์˜ค๋ฅ˜๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด โ€” babel ๊ธฐ๋Šฅ๊ณผ typescript ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์‹œ์— - ์ •๋ง ๋ฉ‹์ง„ ์‚ฌ๋žŒ์ด๊ณ  ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ถˆ๋งŒ์„ ๋…น์ด๋Š” ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค. ๊ฑด๋ฐฐ!

:์›จ์ด๋ธŒ:์ถ”๊ฒฉ

@ljharb

๋˜ํ•œ babel์„ ๋…์ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚œ ๋‹น์‹ ์ด (๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๋“ค์˜ ์ข…๋ฅ˜ํ•˜์ง€๋งŒ ํœด๊ฐ€) ๋‹จ์ง€ ๊ฐœ์ธ ๋ฐ”๋ฒจ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ transpile๊ณผ ํ•จ๊ป˜ ๊ทธ ์ฝ”๋“œ์— ์œ ํ˜• ๊ฒ€์‚ฌ ์•Š๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ ๊ณผ์ •์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๊ฐ€์ • tsc . (์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•œ ํ›„ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋Š” Babel๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.) ํ•˜์ง€๋งŒ IDE์—์„œ ๋งŽ์€ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@chase-moskal @0kku๊ฐ€ ๋งํ•œ ๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ

์šฐ๋ฆฌ๊ฐ€ ์‹คํ—˜์  ๊ธฐ๋Šฅ์— ๋›ฐ์–ด๋“ค์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด --useDefineForClassFields ์—„์ฒญ๋‚œ ๋ณต์žก์„ฑ clusterfoxtrot ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊ฐ€์ง„ ๊ฐ€๋Šฅํ•œ TC39 ์ œ์•ˆ์ด ๊ทธ๋Ÿด๋“ฏํ•˜๊ฒŒ ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ๋งค์šฐ ์ผ์ฐ ํด๋ž˜์Šค ์†์„ฑ ์ดˆ๊ธฐํ™”๋ฅผ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ ์šฐ๋ฆฌ๋Š” ๋งค์šฐ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค.

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

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

์šฐ๋ฆฌ์˜ ๊ด€์ ์—์„œ, ๋‹น์‹ ์€ ๋ถ€์ฃผ์˜์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ํฌ๊ธฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฒ„์ „ ๊ฐ„ ๋Ÿฐํƒ€์ž„ ํ˜ธํ™˜์„ฑ์„ ๋ถ€์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๋Œ€๊ทœ๋ชจ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ฐ˜๋ฐœ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์„ ํƒ์  ์ฒด์ธ์˜ ์กฐ๊ธฐ ์ฑ„ํƒ์„ ๋ณด๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ "๊ธ€์Ž„, ๊ทธ๋ƒฅ ๊นƒ๋ฐœ ๋’ค์— ๋‘์‹ญ์‹œ์˜ค"๋ผ๊ณ  ๋งํ•  ๋•Œ๋งˆ๋‹ค ๋‚ด๊ฐ€ ๋‹ˆ์ผˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ณดํŠธ์—์„œ ํƒ€์ดํ•‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์˜ณ์€ ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” (null)?.prop ์ƒ์‚ฐํ–ˆ๋Š”์ง€ ์ถ”์ธกํ•ด์•ผ ํ–ˆ๊ณ  null ( undefined ์•„๋‹˜)๋ฅผ ์ ˆ๋Œ€์ ์œผ๋กœ ์ถ”์ธกํ–ˆ์„ ๊ฒƒ์ด๊ณ  ์šฐ๋ฆฌ๋Š”' d ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด ๋˜ ๋‹ค๋ฅธ ์ง€์†์ ์ธ ๋ณต์žก์„ฑ ๋ถ€๋‹ด์„ ์•ˆ๊ณ  ์‚ด์•„๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•ํ•œ ์‹ค์  ์ธ์€ ์•„๋ฌด๋„ ๊ฐ€๋“ 300 ๋งŒ ๊ฐœ ๋ผ์ธ์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋ถ™์–ด ์•‰์•„ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฑฐ๊พธ๋กœ ์—ฌ๊ธฐ๊ฐ€ ?. ๊ทธ๋“ค์ด ๊ทธ ์ƒ์‚ฐ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ด null ๋•Œ๋•Œ๋กœ์„ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ, ๋‹ค๋ฅธ undefined ๋™์ž‘์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ์•„๋ณด์„ธ์š”.

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

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

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ˜„์žฌ ํด๋ž˜์Šค ํ•„๋“œ ์ œ์•ˆ ๋ฐ ๋ชจ๋“  ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ํ˜„์žฌ ํ˜•์‹์œผ๋กœ 4๋‹จ๊ณ„์— ๋„๋‹ฌํ• ์ง€ ์—ฌ๋ถ€๋„ 100% ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(ํŠนํžˆ ์ง€๊ธˆ์€ ์ œ์•ˆ์„ ์™„์ „ํžˆ ํ๊ธฐํ•˜๊ณ  ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์„ ๋™ํ•˜๋Š” TC39 ํšŒ์›์‚ฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—) ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ). ๋‚˜๋Š” 95%์˜ ํ™•์‹ค์„ฑ์„ ์ถ”์ธกํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ 3๋‹จ๊ณ„ ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ์œ„ํ—˜์ด ์™„์ „ํžˆ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋งŒ 3๋‹จ๊ณ„ ์ดํ›„ ์ถ”๊ฐ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์€ ๋งค์šฐ ๋‚ฎ์•„์„œ ํ˜„์žฌ์˜ TS ์ •์ฑ…์ด ์ข‹์€ ๋ฐฉํ–ฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ [class fields] ์ œ์•ˆ์„ ์™„์ „ํžˆ ํ๊ธฐํ•˜๊ณ  ๋‹ค๋ฅธ ์ œ์•ˆ์œผ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์„ ๋™ํ•˜๋Š” TC39 ํšŒ์›์‚ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๋„ค์š”. ๊ทธ ๋งํฌ๊ฐ€ ๋งˆ์Œ์— ๋“œ์‹œ๋‚˜์š”?


์—ฌ๊ธฐ์— ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ TS ํŒ€์€ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ž‘์„ฑ์ž์—๊ฒŒ ์ปดํŒŒ์ผ ์‹œ๊ฐ„๊ณผ ์–ธ์–ด ์„œ๋ฒ„ ํ”„๋กœํ† ์ฝœ ์ธํ…”๋ฆฌ์„ผ์Šค ์‹œ๊ฐ„์— ์—ฐ๊ฒฐ๋˜๋Š” ๋ช…ํ™•ํ•œ API๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ œ3์ž๋Š” ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ํฌํ•จํ•˜์—ฌ ์›ํ•˜๋Š” ์‹คํ—˜์  ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  IDE ๋ฐ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ ๋‚ด์—์„œ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜๋Š” ์ธํ…”๋ฆฌ์„ผ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ttypescript ๋Š” tsconfig.json ์—์„œ TypeScript ๋ณ€ํ™˜๊ธฐ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ฉฐ IDE์˜ ์ธํ…”๋ฆฌ์„ผ์Šค์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํƒ€์‚ฌ์—์„œ ๋‹ค์Œ๊ณผ ์ž˜ ํ†ตํ•ฉ๋˜๋Š” ์˜๋ฏธ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. VS Code์™€ ๊ฐ™์€ ๊ธฐ์กด ๋„๊ตฌ๋Š” ์•„์ง ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ttypescript ๋กœ ์ „ํ™˜ํ•˜๊ณ  VS Code๊ฐ€ ๊ตฌ๋ฌธ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋™์•ˆ ํ„ฐ๋ฏธ๋„ ์ถœ๋ ฅ์— ์˜์กดํ•ด์•ผ ํ•˜๋Š” ์ข‹์€ VS Code ๊ฒฝํ—˜์„ ํฌ๊ธฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด TypeScript๋Š” ์•ˆ์ •์ ์ธ ๊ธฐ๋Šฅ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์ œ3์ž๊ฐ€ ์œ„ํ—˜ํ•œ ์‹คํ—˜ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(Babel ์ƒํƒœ๊ณ„์—์„œ์ฒ˜๋Ÿผ ์‰ฝ์Šต๋‹ˆ๋‹ค).

ํฅ๋ฏธ๋กญ๋„ค์š”. ๊ทธ ๋งํฌ๊ฐ€ ๋งˆ์Œ์— ๋“œ์‹œ๋‚˜์š”?

https://github.com/microsoft/TypeScript/pull/30829#issuecomment -541338266

Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ์  ์ž‘์—…์€ ๋งค์šฐ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ์„œ๋Š” ์ด๋ฏธ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด do ํ‘œํ˜„์‹ "ํ”Œ๋Ÿฌ๊ทธ์ธ"์€ ์—ฌ์ „ํžˆ โ€‹โ€‹Babel ์ž์ฒด์˜ ํ•ต์‹ฌ์— ๋…ผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. https://github.com/babel/babel/blob/master/packages/babel-parser/src/parser /expression.js#L991 ์ปค๋งจ๋“œ๋ผ์ธ ์Šค์œ„์น˜์™€

๊ฐœ์ธ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ ๋ฐ ์ ‘๊ทผ์ž์— ๋Œ€ํ•ด ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@RyanCavanaugh

์ด ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ ๋ชจ๋‘์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๋Š” ํ‰์ƒ ๋™์•ˆ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์—ฌ๊ธฐ์— ์ฐฉ๋ฅ™ํ•œ ๊ฒƒ์„ ํ›„ํšŒํ•ฉ๋‹ˆ๋‹ค :/

@RyanCavanaugh

Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ์  ์ž‘์—…์€ ๋งค์šฐ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ์„œ๋Š” ์ด๋ฏธ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ง„์‹ค. ๊ทธ๋Ÿฌ๋‚˜ TypeScript์™€ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด Babel์—์„œ๋Š” ํŒŒ์„œ๋ฅผ ๋ถ„๊ธฐํ•˜๊ณ  babel.config.js ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ์„œ์™€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ๋ฌธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๋งŽ์€ ์ž‘์—…(ํŠนํžˆ ์ฒ˜์Œ์œผ๋กœ ์ƒˆ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ธฐ)์ด์ง€๋งŒ TS์— ํ•ด๋‹นํ•˜๋Š” ์˜ต์…˜์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  Babel์—์„œ๋Š” ๊ธฐ์กด ๊ตฌ๋ฌธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€ํ™˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค. TypeScript์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์˜ต์…˜์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ์–ด๋–ค์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ช‡ ๋…„ ์ „์— ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฒ€ํ† ํ–ˆ์„ ๋•Œ ์ „์ฒด๋ฅผ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค : https://github.com/dsherret/ts-morph

private IMO์˜ ํ•ด์‹œ๋Š” ์ถ”ํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๊ตฌํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹œํ–‰ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. TS์™€ ๊ฐ™์€ ๋นŒ๋“œ ๋‹จ๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ํšจ๊ณผ๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐœ์ธ์šฉ์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€๋ฅด์นจ์„ ๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— JS๋ฅผ ์ž‘์„ฑํ•˜๋Š” '์˜ฌ๋ฐ”๋ฅธ' ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ ํ•จ๊ป˜ "ํ•˜๋“œ ๊ฐœ์ธ์šฉ"์˜ ์•„์ฃผ ์•ฝ๊ฐ„์˜ ์ด๋“์„ ์œ„ํ•ด ๊ธฐํ˜ธ๋กœ ์ฝ”๋“œ๋ฅผ ๋ง‰๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํŠนํžˆ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ช…๋ฐฑํ•œ ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ‘œ์ค€์œผ๋กœ ๋ฐ€์–ด๋„ฃ๊ธฐ ์ „์— ๋” ๋งŽ์€ ์ œ์•ˆ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@robot56 ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„๊ณต๊ฐœ ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค . ๊ทธ๋“ค์€ ๋ชจ๋“  ๊ฒƒ์ด ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค . ์ด๋Š” ์‚ฌ์‹ค ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์ข‹์€ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@ljharb ์˜ˆ, this.#x = this.#something(); ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋ณด๊ณ  ํด๋ž˜์Šค์—์„œ ์„ ์–ธ์„ ํ–ˆ์„ ๋•Œ ๋‚ด ์ฒซ ๋ฒˆ์งธ ์ƒ๊ฐ์€ ํ•ด์‹œ๊ฐ€ ๋ณ€์ˆ˜ ์ž์ฒด์™€ ๋ณ„๊ฐœ๋ผ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ˆ˜์ •์ž๋ผ๊ณ  ๊ฒฐ์ฝ” ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ค‘์„ ์œ„ํ•œ ๋ฐ‘์ค„, ๊ทธ๊ฒƒ๋„ ๊ฑฐ๊พธ๋กœ ๋ณด์ธ๋‹ค. ์ด๊ฒƒ์€ TS์™€ ์‹ค์ œ๋กœ ๊ด€๋ จ์ด ์—†์ง€๋งŒ ์„ฑ๊ฐ€์‹  ์š•์„ค ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์ต์ˆ™ํ•ด์ง€๋ฉด ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์ ์‘์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” JS ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋ฐฐ์šธ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค!

(ํ•ด์‹œ ๋Š” ๋ณ€์ˆ˜ ์ž์ฒด์˜ ์ผ๋ถ€์ด๋ฉฐ this.#x ์˜ ์ด๋ฆ„์€ "x๊ฐ€ ์•„๋‹ˆ๋ผ private"์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํ•ด๋‹น ์–ดํœ˜ ๋ฒ”์œ„์—์„œ ๊ณ ์œ ํ•œ ๊ฐ’์ธ #x .)

์˜ˆ, ์ต์ˆ™ํ•ด์ง€๋ฉด ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์ ์‘์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” JS ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋ฐฐ์šธ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค!

๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€ํ˜œ์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ, ์ด๊ฒƒ์€ ์•”๊ธฐํ•ด์•ผ ํ•˜๋Š” JS์˜ ๋˜ ๋‹ค๋ฅธ ํŠน์ง•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.:D

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰