๐ŸŒ US-Proxy
class="h-entry status-LS">

์›น IDL

ํ˜„ํ–‰ ํ‘œ์ค€ โ€” ์ตœ์ข… ์—…๋ฐ์ดํŠธ

์ฐธ์—ฌํ•˜๊ธฐ:
GitHub whatwg/webidl (์ƒˆ ์ด์Šˆ ๋“ฑ๋ก, ์˜คํ”ˆ๋œ ์ด์Šˆ)
Matrix์—์„œ ์ฑ„ํŒ…ํ•˜๊ธฐ
์ปค๋ฐ‹:
GitHub whatwg/webidl/์ปค๋ฐ‹ ๋‚ด์—ญ
์ด ์ปค๋ฐ‹ ๊ธฐ์ค€์˜ ์Šค๋ƒ…์ƒท
ํ…Œ์ŠคํŠธ:
web-platform-tests webidl/ (์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…)
๋ฒˆ์—ญ (๋น„๊ทœ๋ฒ”):
ๆ—ฅๆœฌ่ชž
็ฎ€ไฝ“ไธญๆ–‡
ํ•œ๊ตญ์–ด

์š”์•ฝ

์ด ํ‘œ์ค€์€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ตฌํ˜„๋  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ์ˆ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ ์–ธ์–ด์ธ ์›น IDL์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

1. ์†Œ๊ฐœ

์ด ์„น์…˜์€ ์ฐธ๊ณ ์šฉ์ž…๋‹ˆ๋‹ค.

์ด ํ‘œ์ค€์€ ์›น ๋ธŒ๋ผ์šฐ์ €์— ๊ตฌํ˜„๋  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ ์–ธ์–ด, ์›น IDL์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์›น IDL์€ ์›น ํ”Œ๋žซํผ์˜ ์ผ๋ฐ˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์˜ ๋™์ž‘์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๋ช…์„ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ IDL ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค. ์›น IDL๋กœ ๊ธฐ์ˆ ๋œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ํ™˜๊ฒฝ ๋‚ด์˜ ๊ตฌ์กฐ์™€ ์–ด๋–ป๊ฒŒ ๋Œ€์‘๋˜๋Š”์ง€๋„ ์ด๊ณณ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

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

"์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ"๋ผ๋Š” ์šฉ์–ด๋Š” ๊ณต์‹ ์šฉ์–ด ECMAScript๊ฐ€ ์•„๋‹Œ ECMA-262๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ผ๋Š” ๋ช…์นญ์ด ๋” ๋„๋ฆฌ ์•Œ๋ ค์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

2. ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ ์–ธ์–ด

์ด ์„น์…˜์—์„œ๋Š” ์›น IDL์ด๋ผ๋Š” ์–ธ์–ด๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์›น ํ”Œ๋žซํผ์˜ API๋ฅผ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ช…์„ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น API๋ฅผ ์ •์˜ํ•˜๋Š” ๋ช…์„ธ์„œ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ, ํ•ด๋‹น ๋ช…์„ธ์„œ์—์„œ ์ •์˜๋œ API์˜ ์ธํ„ฐํŽ˜์ด์Šค(๊ฐ์ฒด๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์™€ ๋™์ž‘)๋ฅผ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค. IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” Definitions ๋ฌธ๋ฒ• ๊ธฐํ˜ธ์— ์ผ์น˜ํ•˜๋Š” ์ผ๋ จ์˜ ์ •์˜์ž…๋‹ˆ๋‹ค. ๊ตฌํ˜„์ฒด๊ฐ€ ์ง€์›ํ•˜๋Š” IDL ํ”„๋ž˜๊ทธ๋จผํŠธ ์ง‘ํ•ฉ์€ ์ˆœ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋ฌธ๋ฒ•๊ณผ ํ‘œ๊ธฐ๋ฒ• ์„ค๋ช…์€ IDL ๋ฌธ๋ฒ•์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

IDL ํ”„๋ž˜๊ทธ๋จผํŠธ์— ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์ •์˜์˜ ์ข…๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: ์ธํ„ฐํŽ˜์ด์Šค, ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜, ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ, ๋ถ€๋ถ„ ๋ฏน์Šค์ธ ์ •์˜, ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค, ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋ถ€๋ถ„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •์˜, ๋”•์…”๋„ˆ๋ฆฌ, ๋ถ€๋ถ„ ๋”•์…”๋„ˆ๋ฆฌ ์ •์˜, ํƒ€์ž… ์ •์˜(typedef) ๋ฐ includes ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…๋ฅ˜๋Š” ์•„๋ž˜ ์„น์…˜์—์„œ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

๊ฐ ์ •์˜ (Definition์— ์ผ์น˜) ์•ž์—๋Š” ํ™•์žฅ ์†์„ฑ ๋ชฉ๋ก(ExtendedAttributeList์— ์ผ์น˜)์ด ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ•ด๋‹น ์ •์˜๊ฐ€ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ ์ง€ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…์„ธ์„œ์—์„œ ์ •์˜๋œ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ๋…๋ฆฝ์ ์ธ ํ™•์žฅ ์†์„ฑ์€ ยงโ€ฏ2.14 ํ™•์žฅ ์†์„ฑ์—์„œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ํŠนํ™”๋œ ๊ฒƒ์€ ยงโ€ฏ3.3 ํ™•์žฅ ์†์„ฑ์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

[extended_attributes]
interface identifier {
  /* interface_members... */
};
Definitions ::
    ExtendedAttributeList Definition Definitions
    ฮต
Definition ::
    CallbackOrInterfaceOrMixin
    Namespace
    Partial
    Dictionary
    Enum
    Typedef
    IncludesStatement

์•„๋ž˜๋Š” IDL ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

[Exposed=Window]
interface Paint { };

[Exposed=Window]
interface SolidColor : Paint {
  attribute double red;
  attribute double green;
  attribute double blue;
};

[Exposed=Window]
interface Pattern : Paint {
  attribute DOMString imageURL;
};

[Exposed=Window]
interface GraphicalWindow {
  constructor();
  readonly attribute unsigned long width;
  readonly attribute unsigned long height;

  attribute Paint currentPaint;

  undefined drawRectangle(double x, double y, double width, double height);

  undefined drawText(double x, double y, DOMString text);
};

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š”, IDL ์ธํ„ฐํŽ˜์ด์Šค์˜ ์†์„ฑ๋“ค์ด ์ ‘๊ทผ์ž ์†์„ฑ์œผ๋กœ, ์—ฐ์‚ฐ๋“ค์€ ๋ชจ๋“  GraphicalWindow ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์— ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ฐ์ฒด(built-in function object)๋กœ์„œ ๋ฐ์ดํ„ฐ ์†์„ฑ์œผ๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋Š” GraphicalWindow๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ํ•ด๋‹น ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

GraphicalWindow์— ๋“ฑ์žฅํ•˜๋Š” ์ƒ์„ฑ์ž ์—ฐ์‚ฐ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌํ˜„์ฒด์—์„œ ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•˜๋„๋ก ํ•˜์—ฌ, new GraphicalWindow()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” [Exposed] ํ™•์žฅ ์†์„ฑ์ด ๋ถ™์–ด ์žˆ์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ realm์˜ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๊ฐ€ Window ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

2.1. ์ด๋ฆ„

๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค, ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜, ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋ถ€๋ถ„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •์˜, ๋”•์…”๋„ˆ๋ฆฌ, ๋ถ€๋ถ„ ๋”•์…”๋„ˆ๋ฆฌ ์ •์˜, ์—ด๊ฑฐํ˜•, ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํƒ€์ž… ์ •์˜(typedef) (์ด๋“ค์„ ํ†ตํ‹€์–ด ์ด๋ฆ„์ด ์žˆ๋Š” ์ •์˜์ด๋ผ ํ•จ) ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์ƒ์ˆ˜, ์†์„ฑ, ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„๋Š” ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ผ๋ถ€ ์—ฐ์‚ฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์‹๋ณ„์ž๋Š” ์„ ์–ธ ๋‚ด ์–ด๋”˜๊ฐ€์— ๋“ฑ์žฅํ•˜๋Š” identifier ํ† ํฐ์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค:

์ฐธ๊ณ : ์—ฐ์‚ฐ์€ getter, setter์™€ ๊ฐ™์€ ํŠน์ˆ˜ ์—ฐ์‚ฐ์„ ์„ ์–ธํ•  ๋•Œ ์‹๋ณ„์ž๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ตฌ์กฐ์—์„œ, ์‹๋ณ„์ž๋Š” identifier ํ† ํฐ ๊ฐ’์—์„œ ์•ž์— ์˜ค๋Š” U+005F (_)๋ฅผ ์ œ๊ฑฐํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์•ž์— ์˜ค๋Š” U+005F (_)๋Š” ์‹๋ณ„์ž๊ฐ€ ์˜ˆ์•ฝ์–ด์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด "interface"๋ผ๋Š” ์ด๋ฆ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹๋ณ„์ž๋ฅผ ํ•ด์ œํ•  ๋•Œ๋Š” ์•ž์˜ U+005F (_)๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

์—ฐ์‚ฐ์˜ ์ธ์ž(argument)๋Š” ๋” ๋„“์€ ๋ฒ”์œ„์˜ ์‹๋ณ„์ž ์ง‘ํ•ฉ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ์‚ฐ ์„ ์–ธ์—์„œ ์ธ์ž์˜ ์‹๋ณ„์ž๋Š” ํƒ€์ž… ๋’ค์— ๋ฐ”๋กœ ๋ช…์‹œ๋˜๋ฉฐ, identifier ํ† ํฐ ๋˜๋Š” ArgumentNameKeyword ์‹ฌ๋ณผ์— ๋งค์นญ๋˜๋Š” ํ‚ค์›Œ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํ‚ค์›Œ๋“œ๊ฐ€ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ, ์•ž์— ๋ฐ‘์ค„๋กœ ์ด์Šค์ผ€์ดํ”„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

interface interface_identifier {
  return_type operation_identifier(argument_type argument_identifier /* , ... */);
};
ArgumentNameKeyword ::
    attribute
    callback
    const
    constructor
    deleter
    dictionary
    enum
    getter
    includes
    inherit
    interface
    iterable
    maplike
    mixin
    namespace
    partial
    readonly
    required
    setlike
    setter
    static
    stringifier
    typedef
    unrestricted

identifier ํ† ํฐ์ด ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ, ์—ฐ์‚ฐ ์ธ์ž์˜ ์‹๋ณ„์ž๋Š” ํ•ด๋‹น ํ† ํฐ ๊ฐ’์—์„œ ์•ž์˜ U+005F (_)๋ฅผ ์ œ๊ฑฐํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ArgumentNameKeyword ํ‚ค์›Œ๋“œ ํ† ํฐ์ด ์‚ฌ์šฉ๋œ๋‹ค๋ฉด, ์—ฐ์‚ฐ ์ธ์ž์˜ ์‹๋ณ„์ž๋Š” ๊ทธ ํ† ํฐ ์ž์ฒด์ž…๋‹ˆ๋‹ค.

์œ„์— ์–ธ๊ธ‰๋œ IDL ๊ตฌ์กฐ(์—ฐ์‚ฐ ์ธ์ž ์ œ์™ธ)์˜ ์‹๋ณ„์ž๋Š” "constructor", "toString"์ด๊ฑฐ๋‚˜ U+005F (_)๋กœ ์‹œ์ž‘ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒƒ๋“ค์€ ์˜ˆ์•ฝ ์‹๋ณ„์ž๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

"toJSON" ์‹๋ณ„์ž๋Š” ์˜ˆ์•ฝ ์‹๋ณ„์ž๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์ •์ƒ ์—ฐ์‚ฐ์—์„œ๋งŒ ๊ฐ์ฒด๋ฅผ JSON ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ยงโ€ฏ2.5.3.1 toJSON์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ํŠน์ • ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์‹๋ณ„์ž ๋ช…๋ช… ์ œํ•œ์€ ์ดํ›„ ์„น์…˜์—์„œ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ๊ตฌํ˜„์ฒด๊ฐ€ ์ง€์›ํ•˜๋Š” IDL ํ”„๋ž˜๊ทธ๋จผํŠธ ์ง‘ํ•ฉ ๋‚ด์—์„œ, ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค, ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋”•์…”๋„ˆ๋ฆฌ, ์—ด๊ฑฐํ˜•, ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค์ธํ„ฐํŽ˜์ด์Šค, ํƒ€์ž… ์ •์˜์˜ ์‹๋ณ„์ž๋Š” ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค, ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋”•์…”๋„ˆ๋ฆฌ, ์—ด๊ฑฐํ˜•, ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค, ํƒ€์ž… ์ •์˜์˜ ์‹๋ณ„์ž์™€ ๊ฐ™์•„์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ, ์•„๋ž˜์˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์œ ํšจํ•ฉ๋‹ˆ๋‹ค:

[Exposed=Window]
interface B : A {
  undefined f(SequenceOfLongs x);
};

[Exposed=Window]
interface A {
};

typedef sequence<long> SequenceOfLongs;

์•„๋ž˜์˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์ •์˜์™€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„์— ์–ด๋–ป๊ฒŒ ์‹๋ณ„์ž๊ฐ€ ๋ถ€์—ฌ๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

// ํƒ€์ž… ์ •์˜ ์‹๋ณ„์ž: "number"
typedef double number;

// ์ธํ„ฐํŽ˜์ด์Šค ์‹๋ณ„์ž: "System"
[Exposed=Window]
interface System {

  // ์—ฐ์‚ฐ ์‹๋ณ„์ž:          "createObject"
  // ์—ฐ์‚ฐ ์ธ์ž ์‹๋ณ„์ž: "interface"
  object createObject(DOMString _interface);

  // ์—ฐ์‚ฐ ์ธ์ž ์‹๋ณ„์ž: "interface"
  sequence<object> getObjects(DOMString interface);

  // ์—ฐ์‚ฐ์—๋Š” ์‹๋ณ„์ž๊ฐ€ ์—†์Œ; getter ์„ ์–ธ์ž„.
  getter DOMString (DOMString keyName);
};

// ์ธํ„ฐํŽ˜์ด์Šค ์‹๋ณ„์ž: "TextField"
[Exposed=Window]
interface TextField {

  // ์†์„ฑ ์‹๋ณ„์ž: "const"
  attribute boolean _const;

  // ์†์„ฑ ์‹๋ณ„์ž: "value"
  attribute DOMString? _value;
};

TextField ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‘ ๋ฒˆ์งธ ์†์„ฑ์€ (IDL ๋ฌธ๋ฒ•์—์„œ "value"๊ฐ€ ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ) ๋ฐ˜๋“œ์‹œ ๋ฐ‘์ค„๋กœ ์ด์Šค์ผ€์ดํ”„ํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ, ๊ทธ๋ž˜๋„ ์†์„ฑ์˜ ์‹๋ณ„์ž๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์–ธ์ด์Šค์ผ€์ดํ”„๋ฉ๋‹ˆ๋‹ค.

2.2. ์ธํ„ฐํŽ˜์ด์Šค

IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์‹œ์Šคํ…œ์„ ๊ธฐ์ˆ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ์—์„œ ๊ฐ์ฒด๋ž€ ์ •์ฒด์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ƒํƒœ์™€ ํ–‰๋™์„ ์บก์Аํ™”ํ•œ ์—”ํ‹ฐํ‹ฐ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” (interface InterfaceRest์— ์ผ์น˜) ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ์ƒํƒœ์™€ ํ–‰๋™์„ ์„ ์–ธํ•˜๋Š” ์ •์˜์ž…๋‹ˆ๋‹ค.

[extended_attributes]
interface identifier {
  /* interface_members... */
};

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„ (InterfaceMembers์— ์ผ์น˜)์˜ ์ง‘ํ•ฉ์„ ๋ช…์„ธํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ ์ค‘๊ด„ํ˜ธ ์‚ฌ์ด์— ๋“ฑ์žฅํ•˜๋Š” ๋ฉค๋ฒ„๋“ค์ด ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์›น IDL์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์—์„œ๋Š”, ํŠน์ • IDL ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ธฐ์ˆ ํ•˜๋Š” ๋™์ž‘์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋„๋ก ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ธํ„ฐํŽ˜์ด์Šค ์‹๋ณ„์ž ๋’ค์— U+003A (:)์™€ ์‹๋ณ„์ž๊ฐ€ ์˜ค๋ฉด, ํ•ด๋‹น ์‹๋ณ„์ž๊ฐ€ ์ƒ์†๋ฐ›๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ๊ทธ ๊ฐ์ฒด๋Š” ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค๋„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ์ฒด๋Š” ์ƒ์†๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„๋„ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

interface identifier : identifier_of_inherited_interface {
  /* interface_members... */
};

๋ฉค๋ฒ„์˜ ๋“ฑ์žฅ ์ˆœ์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ ํ”„๋กœํผํ‹ฐ ์—ด๊ฑฐ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„์™€ ๊ฐ™์€ ์ด๋ฆ„์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„๋ฅผ ๋ช…์‹œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋Š” ํŒŒ์ƒ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„๋ผ์ด๋“œ๋œ ๋ฉค๋ฒ„๋ฅผ ๊ฐ์ฒด์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‘ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

[Exposed=Window]
interface A {
  undefined f();
  undefined g();
};

[Exposed=Window]
interface B : A {
  undefined f();
  undefined g(DOMString x);
};

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ B์˜ ์ธ์Šคํ„ด์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

[Object.prototype: Object ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด]
     โ†‘
[A.prototype: A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด]
     โ†‘
[B.prototype: B์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด]
     โ†‘
[instanceOfB]

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ instanceOfB.f()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด B์— ์ •์˜๋œ f๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ A์˜ f๋„ A.prototype.f.call(instanceOfB)๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ์ธํ„ฐํŽ˜์ด์Šค A์˜ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค๋“ค์€ A๊ฐ€ ์ง์ ‘ ๋˜๋Š” ๊ฐ„์ ‘์ ์œผ๋กœ ์ƒ์†ํ•˜๋Š” ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. A๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š์œผ๋ฉด ์ง‘ํ•ฉ์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์ง‘ํ•ฉ์—๋Š” A๊ฐ€ ์ƒ์†ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค B์™€ B์˜ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค๋“ค์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒ์† ๊ณ„์ธต์— ์ˆœํ™˜(cycle)์ด ์žˆ์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ธํ„ฐํŽ˜์ด์Šค A๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ์ƒ์†ํ•˜๊ฑฐ๋‚˜, B์—์„œ A๋ฅผ ์ƒ์†ํ•˜๋Š” ๋“ฑ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ƒ์†ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฆฌ์ŠคํŠธ๋กœ์„œ ํฌํ•จ๋œ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค๋“ค์€ ์ธํ„ฐํŽ˜์ด์Šค I์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค:
  1. result๋ฅผ ยซ ยป๋กœ ๋‘”๋‹ค.

  2. interface๋ฅผ I๋กœ ๋‘”๋‹ค.

  3. interface๊ฐ€ null์ด ์•„๋‹ ๋™์•ˆ:

    1. result์— interface๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

    2. interface๋ฅผ I๊ฐ€ ์ƒ์†ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค์ •ํ•˜๊ณ , ์—†์œผ๋ฉด null๋กœ ํ•œ๋‹ค.

  4. result๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค์ค‘ ์ƒ์†์€ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ์ฒด๋„ ์ž„์˜์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ง‘ํ•ฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์˜ ์ฃผ์–ด์ง„ ์ธํ„ฐํŽ˜์ด์Šค A๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ์ •์˜๋˜๋ฉฐ, ์ด๋Š” A์˜ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค๋“ค๋„ ๊ตฌํ˜„ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ, includes ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค A๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ ๋ฉค๋ฒ„๋„ ํ•ญ์ƒ ํฌํ•จํ•˜๋„๋ก ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. A๊ฐ€ includeํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์˜ ๋ฉค๋ฒ„๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„๋Š” ํ™•์žฅ ์†์„ฑ ๋ฆฌ์ŠคํŠธ(ExtendedAttributeList์— ์ผ์น˜)๊ฐ€ ์•ž์— ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ•ด๋‹น ๋ฉค๋ฒ„๊ฐ€ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ ์ง€ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

[extended_attributes]
interface identifier {

  [extended_attributes]
  const type constant_identifier = 42;

  [extended_attributes]
  attribute type identifier;

  [extended_attributes]
  return_type identifier(/* arguments... */);
};

์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ IDL์€ ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜(partial interface PartialInterfaceRest์— ์ผ์น˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์˜ ์‹๋ณ„์ž๋Š” ๋ฐ˜๋“œ์‹œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์˜ ์‹๋ณ„์ž์™€ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค์— ๋“ฑ์žฅํ•˜๋Š” ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” ์‹ค์ œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

interface SomeInterface {
  /* interface_members... */
};

partial interface SomeInterface {
  /* interface_members... */
};

์ฐธ๊ณ : ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋Š” ๋ช…์„ธ ํŽธ์ง‘ ์‹œ, ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฌธ์„œ ๋˜๋Š” ์—ฌ๋Ÿฌ ์„น์…˜์— ๋‚˜๋ˆ ์„œ ๊ธฐ์ˆ ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์™€ ๊ทธ ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์˜ ๋“ฑ์žฅ ์ˆœ์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋„๋ก ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒ์†์€ ์›๋ž˜์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์—์„œ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ์šฉ๋˜๋Š” ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•ด๋‹น ์–ธ์–ด์˜ ๊ตฌ์กฐ์™€ ์–ด๋–ป๊ฒŒ ๋Œ€์‘๋˜๋Š”์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ™•์žฅ ์†์„ฑ๋“ค์ด ์ธํ„ฐํŽ˜์ด์Šค์— ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [CrossOriginIsolated], [Exposed], [Global], [LegacyFactoryFunction], [LegacyNoInterfaceObject], [LegacyOverrideBuiltIns], [LegacyWindowAlias], [SecureContext].

๋‹ค์Œ ํ™•์žฅ ์†์„ฑ๋“ค์€ ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค์— ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: [CrossOriginIsolated], [Exposed], [LegacyOverrideBuiltIns], [SecureContext].

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฐ˜๋“œ์‹œ [Exposed] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์ฃผ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค interface์˜ ์ •๊ทœํ™”๋œ ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค:

  1. identifier๋ฅผ interface์˜ ์‹๋ณ„์ž๋กœ ๋‘”๋‹ค.

  2. interface์— [LegacyNamespace] ํ™•์žฅ ์†์„ฑ์ด ์žˆ์œผ๋ฉด:

    1. namespace๋ฅผ [LegacyNamespace] ํ™•์žฅ ์†์„ฑ์˜ ์‹๋ณ„์ž ์ธ์ž๋กœ ๋‘”๋‹ค.

    2. ยซ namespace, identifier ยป๋ฅผ U+002E (.)๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. identifier๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

CallbackOrInterfaceOrMixin ::
    callback CallbackRestOrInterface
    interface InterfaceOrMixin
InterfaceOrMixin ::
    InterfaceRest
    MixinRest
InterfaceRest ::
    identifier Inheritance { InterfaceMembers } ;
Partial ::
    partial PartialDefinition
PartialDefinition ::
    interface PartialInterfaceOrPartialMixin
    PartialDictionary
    Namespace
PartialInterfaceOrPartialMixin ::
    PartialInterfaceRest
    MixinRest
PartialInterfaceRest ::
    identifier { PartialInterfaceMembers } ;
InterfaceMembers ::
    ExtendedAttributeList InterfaceMember InterfaceMembers
    ฮต
InterfaceMember ::
    PartialInterfaceMember
    Constructor
PartialInterfaceMembers ::
    ExtendedAttributeList PartialInterfaceMember PartialInterfaceMembers
    ฮต
PartialInterfaceMember ::
    Const
    Operation
    Stringifier
    StaticMember
    Iterable
    AsyncIterable
    ReadOnlyMember
    ReadWriteAttribute
    ReadWriteMaplike
    ReadWriteSetlike
    InheritAttribute
Inheritance ::
    : identifier
    ฮต

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์ƒํ˜ธ ์ฐธ์กฐํ•˜๋Š” ๋‘ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ •์˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Human๊ณผ Dog๋Š” ๋ชจ๋‘ Animal์„ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋Š” name ์†์„ฑ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

[Exposed=Window]
interface Animal {
  attribute DOMString name;
};

[Exposed=Window]
interface Human : Animal {
  attribute Dog? pet;
};

[Exposed=Window]
interface Dog : Animal {
  attribute Human? owner;
};

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” DOM ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹จ์ˆœํ™”๋œ ์ •์˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

[Exposed=Window]
interface Node {
  readonly attribute DOMString nodeName;
  readonly attribute Node? parentNode;
  Node appendChild(Node newChild);
  undefined addEventListener(DOMString type, EventListener listener);
};

callback interface EventListener {
  undefined handleEvent(Event event);
};

์ผ๋ฐ˜ ๊ฐ์ฒด๋Š” EventListener์™€ ๊ฐ™์€ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

var node = getNode();                                // Node ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ

var listener = {
  handleEvent: function(event) {
    // ...
  }
};
node.addEventListener("click", listener);            // ๋™์ž‘ํ•จ

node.addEventListener("click", function() { ... });  // ์ด๊ฒƒ๋„ ๋™์ž‘ํ•จ

์ด๋Ÿฐ ๊ฐ์ฒด๋Š” Node์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค:

var node = getNode();  // Node ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ

var newNode = {
  nodeName: "span",
  parentNode: null,
  appendChild: function(newchild) {
    // ...
  },
  addEventListener: function(type, listener) {
    // ...
  }
};
node.appendChild(newNode);  // TypeError ์˜ˆ์™ธ ๋ฐœ์ƒ

2.3. ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ

์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์€ (interface MixinRest์— ์ผ์น˜) ํ•˜๋‚˜ ์ด์ƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ includeํ•˜์—ฌ ๊ฐ์ฒด๊ฐ€ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์™€ ํ–‰๋™์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์—์„œ includeํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์— ์˜ํ•ด ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

interface mixin identifier {
  /* mixin_members... */
};

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

์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ ๋ฉค๋ฒ„ (MixinMembers์— ์ผ์น˜) ์ง‘ํ•ฉ์„ ๋ช…์„ธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ƒ์ˆ˜, ์ผ๋ฐ˜ ์—ฐ์‚ฐ, ์ผ๋ฐ˜ ์†์„ฑ, ๋ฌธ์ž์—ด ๋ณ€ํ™˜์ž๋“ค์ด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ ์„ ์–ธ์˜ ์ค‘๊ด„ํ˜ธ ์‚ฌ์ด์— ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒ์ˆ˜ , ์ผ๋ฐ˜ ์—ฐ์‚ฐ , ์ผ๋ฐ˜ ์†์„ฑ , ๋ฌธ์ž์—ด ๋ณ€ํ™˜์ž ๋Š” ๊ฐ์ฒด๊ฐ€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์„ ๊ธฐ์ˆ ํ•˜๋ฉฐ, ๋งˆ์น˜ ์ด๋ฅผ ํฌํ•จํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์— ์ง์ ‘ ๋ช…์„ธํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ •์  ์†์„ฑ, ์ •์  ์—ฐ์‚ฐ, ํŠน์ˆ˜ ์—ฐ์‚ฐ, ์ดํ„ฐ๋Ÿฌ๋ธ”, ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ”, maplike, setlike ์„ ์–ธ์€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ ์„ ์–ธ์— ํฌํ•จ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์˜ IDL๋„ ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ ์ •์˜(partial interface MixinRest์— ์ผ์น˜)๋ฅผ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ ์ •์˜์˜ ์‹๋ณ„์ž๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ ์ •์˜์˜ ์‹๋ณ„์ž์™€ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์— ๋“ฑ์žฅํ•˜๋Š” ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” ์‹ค์ œ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์˜ ๋ฉค๋ฒ„๋กœ ๊ฐ„์ฃผ๋˜๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ includeํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์„ ํ†ตํ•ด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„๋กœ๋„ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

interface mixin SomeMixin {
  /* mixin_members... */
};

partial interface mixin SomeMixin {
  /* mixin_members... */
};

๋ฉค๋ฒ„์˜ ๋“ฑ์žฅ ์ˆœ์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ ํ”„๋กœํผํ‹ฐ ์—ด๊ฑฐ์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ๋”•์…”๋„ˆ๋ฆฌ์™€ ๋‹ฌ๋ฆฌ, ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์€ ํƒ€์ž…์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ช…์„ธ์—์„œ ์ •์˜๋œ ํ™•์žฅ ์†์„ฑ ์ค‘, [CrossOriginIsolated], [Exposed], [SecureContext] ๋งŒ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

includes ๋ฌธ์€ (IncludesStatement์— ์ผ์น˜) ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค I (์ฒซ ๋ฒˆ์งธ ์‹๋ณ„์ž๋กœ ์‹๋ณ„๋จ)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋ฉค๋ฒ„๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ M (๋‘ ๋ฒˆ์งธ ์‹๋ณ„์ž๋กœ ์‹๋ณ„๋จ)์˜ ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€๋กœ ํฌํ•จํ•ด์•ผ ํ•จ์„ ์„ ์–ธํ•˜๋Š” ์ •์˜์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค I๋Š” include ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ M์„ ํฌํ•จํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

interface_identifier includes mixin_identifier;

์ฒซ ๋ฒˆ์งธ ์‹๋ณ„์ž๋Š” ์ธํ„ฐํŽ˜์ด์Šค I๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋ฉฐ, ๋‘ ๋ฒˆ์งธ ์‹๋ณ„์ž๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ M์„ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

M์˜ ๊ฐ ๋ฉค๋ฒ„๋Š” ์ธํ„ฐํŽ˜์ด์Šค I, J, K ๋“ฑ includeํ•˜๋Š” ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, M์˜ ๋ฉค๋ฒ„ m์— ๋Œ€ํ•ด I๋Š” ๋ฉค๋ฒ„ mI, J๋Š” ๋ฉค๋ฒ„ mJ, K๋Š” ๋ฉค๋ฒ„ mK๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ์ธํ„ฐํŽ˜์ด์Šค๋ž€ mI, mJ, mK์˜ ๊ฐ๊ฐ์˜ I, J, K๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š”, ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ ๋ฉค๋ฒ„๋กœ ์„ ์–ธ๋œ ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ด ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ฐ์ฒด ๊ฐ’์˜ ๋ฐ์ดํ„ฐ ์†์„ฑ์œผ๋กœ ๋…ธ์ถœ๋  ๋•Œ, ์—ฐ๊ฒฐ๋œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ M์„ ํฌํ•จํ•˜๋Š” ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋งˆ๋‹ค ๋ณ„๋„ ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์†์„ฑ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ ‘๊ทผ์ž ์†์„ฑ์˜ getter์™€ setter๊ฐ€ ๊ฐ๊ฐ ๋ณ„๋„ ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

includes ๋ฌธ์˜ ๋“ฑ์žฅ ์ˆœ์„œ๋Š” ํ˜ธ์ŠคํŠธ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์ด ํฌํ•จ๋˜๋Š” ์ˆœ์„œ์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

๋ฉค๋ฒ„ ์ˆœ์„œ๋Š” ๋ช…ํ™•ํžˆ ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ, ํŠนํžˆ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์ด ๋ณ„๋„ ๋ฌธ์„œ์— ์ •์˜๋  ๋•Œ ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. issue #432์—์„œ ๋…ผ์˜๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ช…์„ธ์—์„œ ์ •์˜๋œ ํ™•์žฅ ์†์„ฑ ์ค‘ includes ๋ฌธ์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์ธํ„ฐํŽ˜์ด์Šค Entry์™€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ Observable์˜ ์ •์˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. includes ๋ฌธ์€ Observable์˜ ๋ฉค๋ฒ„๋“ค์ด Entry๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด์— ํ•ญ์ƒ ํฌํ•จ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

interface Entry {
  readonly attribute unsigned short entryType;
  // ...
};

interface mixin Observable {
  undefined addEventListener(DOMString type,
                        EventListener listener,
                        boolean useCapture);
  // ...
};

Entry includes Observable;

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌํ˜„์—์„œ๋Š” ๋ชจ๋“  Entry์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— addEventListener ์†์„ฑ์ด ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:

var e = getEntry();          // Entry ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ
typeof e.addEventListener;   // "function"์œผ๋กœ ํ‰๊ฐ€๋จ
CallbackOrInterfaceOrMixin ::
    callback CallbackRestOrInterface
    interface InterfaceOrMixin
InterfaceOrMixin ::
    InterfaceRest
    MixinRest
Partial ::
    partial PartialDefinition
PartialDefinition ::
    interface PartialInterfaceOrPartialMixin
    PartialDictionary
    Namespace
MixinRest ::
    mixin identifier { MixinMembers } ;
MixinMembers ::
    ExtendedAttributeList MixinMember MixinMembers
    ฮต
MixinMember ::
    Const
    RegularOperation
    Stringifier
    OptionalReadOnly AttributeRest
IncludesStatement ::
    identifier includes identifier ;

2.3.1. ๋ฏน์Šค์ธ ๋ฐ ๋ถ€๋ถ„ ์‚ฌ์šฉ

์ด ์„น์…˜์€ ์ฐธ๊ณ ์šฉ์ž…๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์ง€ ๋ง๊ณ :

interface mixin WindowSessionStorage {
  readonly attribute Storage sessionStorage;
};
Window includes WindowSessionStorage;

์ด๋ ‡๊ฒŒ ํ•˜์„ธ์š”:

partial interface Window {
  readonly attribute Storage sessionStorage;
};

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

์˜ˆ๋ฅผ ๋“ค์–ด, ํ”ํ•˜์ง€๋งŒ ์žฅํ™ฉํ•œ ๋ฐฉ์‹ ๋Œ€์‹ :

interface mixin GlobalCrypto {
  readonly attribute Crypto crypto;
};

Window includes GlobalCrypto;
WorkerGlobalScope includes GlobalCrypto;

WindowOrWorkerGlobalScope ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์„ ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

partial interface mixin WindowOrWorkerGlobalScope {
  readonly attribute Crypto crypto;
};

2.4. ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค

์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ •์˜๋กœ, callback interface identifier { CallbackInterfaceMembers } ;์— ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ยงโ€ฏ2.12 ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ, ์–ด๋–ค ๊ฐ์ฒด๋“  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…์นญ๊ณผ ๋ฌธ๋ฒ•์€ ํ‘œ์ค€์˜ ์ด์ „ ๋ฒ„์ „์—์„œ ์œ ๋ž˜๋œ ๊ฒƒ์œผ๋กœ, ๋‹น์‹œ์—๋Š” ๊ฐœ๋…์ ์œผ๋กœ ๋” ๋งŽ์€ ๊ณตํ†ต์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„ (CallbackInterfaceMembers์— ์ผ์น˜)์˜ ์ง‘ํ•ฉ์„ ๋ช…์„ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ์˜ ์ค‘๊ด„ํ˜ธ ์‚ฌ์ด์— ๋“ฑ์žฅํ•˜๋Š” ๋ฉค๋ฒ„์ž…๋‹ˆ๋‹ค.

callback interface identifier {
  /* interface_members... */
};

์ฐธ๊ณ : ์œ ์‚ฌํ•œ ๋ช…์นญ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ •์˜๋„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์ผ๋ฐ˜ ์—ฐ์‚ฐ์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ช…์„ธ ์ €์ž๋Š” ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ์กด API์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ธฐ์ˆ ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํ•œ ์ •์˜ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

EventListener ๋ฅผ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•œ ๊ฒƒ์€, ํŠน์ • ์†์„ฑ(์—ฌ๊ธฐ์„œ๋Š” handleEvent)์„ ๊ฐ€์ง„ ๊ฐ์ฒด๊ฐ€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ์กด API์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด API๋‚˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š”, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ ํ•จ์ˆ˜ ๊ฐ์ฒด๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ [Exposed] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์ฃผ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CallbackRestOrInterface ::
    CallbackRest
    interface identifier { CallbackInterfaceMembers } ;
CallbackInterfaceMembers ::
    ExtendedAttributeList CallbackInterfaceMember CallbackInterfaceMembers
    ฮต
CallbackInterfaceMember ::
    Const
    RegularOperation

2.5. ๋ฉค๋ฒ„

์ธํ„ฐํŽ˜์ด์Šค, ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์ค‘๊ด„ํ˜ธ ์•ˆ์— ๋“ฑ์žฅํ•˜๋Š” ๋ฉค๋ฒ„(๊ฐ๊ฐ InterfaceMembers, MixinMembers, NamespaceMembers์— ์ผ์น˜)์„ ๋ช…์„ธํ•ฉ๋‹ˆ๋‹ค. ๋ฉค๋ฒ„์—๋Š” ์ƒ์ˆ˜, ์†์„ฑ, ์—ฐ์‚ฐ, ๊ธฐํƒ€ ์„ ์–ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค, ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ์ƒํƒœ๋ฅผ ์„ค๋ช…ํ•˜๋ฉฐ, ์—ฐ์‚ฐ์€ ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์ˆ˜๋Š” ์‹œ์Šคํ…œ ๋‚ด ๊ฐ์ฒด ์‚ฌ์šฉ์ž์—๊ฒŒ ํŽธ์˜๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์ด๋ฆ„ ์žˆ๋Š” ์ƒ์ˆ˜ ๊ฐ’์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์„ includeํ•˜๋ฉด, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์˜ ๋ฉค๋ฒ„๋“ค๋„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋ฉค๋ฒ„์— ๋Œ€ํ•ด ์ •์˜๋˜๋Š” ์ƒ์„ฑ์ž ๋‹จ๊ณ„, getter ๋‹จ๊ณ„, setter ๋‹จ๊ณ„, ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ ์œ„์— ์ •์˜๋œ ๋ฉค๋ฒ„์—์„œ this ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉค๋ฒ„๊ฐ€ ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…, ํ˜น์€ ๋ฉค๋ฒ„๊ฐ€ ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์„ includeํ•œ ํƒ€์ž…์˜ IDL ๊ฐ’์ž…๋‹ˆ๋‹ค.

setter ๋‹จ๊ณ„์—์„œ๋Š” ์ง€์ •๋œ ๊ฐ’๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ํ•ด๋‹น ์†์„ฑ์ด ์„ ์–ธ๋œ ํƒ€์ž…์˜ IDL ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค, ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค, ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๊ฐ๊ฐ ์ง€์›ํ•˜๋Š” ๋ฉค๋ฒ„์˜ ์ข…๋ฅ˜๊ฐ€ ๋‹ค๋ฅด๋ฉฐ, ยงโ€ฏ2.2 ์ธํ„ฐํŽ˜์ด์Šค, ยงโ€ฏ2.3 ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ, ยงโ€ฏ2.4 ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค, ยงโ€ฏ2.6 ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋Š” ์ด๋ฅผ ์š”์•ฝํ•œ ์ฐธ๊ณ ์šฉ ํ‘œ์ž…๋‹ˆ๋‹ค:

์ธํ„ฐํŽ˜์ด์Šค ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค
์ƒ์ˆ˜ โ— โ— โ—
์ผ๋ฐ˜ ์†์„ฑ โ— โ— ์˜ค์ง ์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ๋งŒ
์ •์  ์†์„ฑ โ—
์ผ๋ฐ˜ ์—ฐ์‚ฐ โ— โ— โ— โ—
๋ฌธ์ž์—ด ๋ณ€ํ™˜์ž โ— โ—
ํŠน์ˆ˜ ์—ฐ์‚ฐ โ—
์ •์  ์—ฐ์‚ฐ โ—
์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ โ—
๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ โ—
maplike ์„ ์–ธ โ—
setlike ์„ ์–ธ โ—

2.5.1. ์ƒ์ˆ˜

์ƒ์ˆ˜๋Š” (Const์— ์ผ์น˜) ์ด๋ฆ„์— ์ƒ์ˆ˜๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์„ ์–ธ์ž…๋‹ˆ๋‹ค. ์ƒ์ˆ˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค์— ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

const type constant_identifier = 42;

์ƒ์ˆ˜์˜ ์‹๋ณ„์ž๋Š” ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„ ๋˜๋Š” ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„์˜ ์‹๋ณ„์ž์™€ ๊ฐ™์•„์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค(๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ). ๋˜ํ•œ "length", "name", "prototype"์ด์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ์„ธ ์ด๋ฆ„์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์— ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์ƒ์ˆ˜์˜ ํƒ€์ž…(ConstType์— ์ผ์น˜)์€ ์›์‹œ ํƒ€์ž…์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ์™ธ ํƒ€์ž…์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹๋ณ„์ž๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ์‹๋ณ„์ž๋Š” ์›์‹œ ํƒ€์ž…์ธ ํƒ€์ž… ์ •์˜๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์ˆ˜ ์„ ์–ธ์˜ ConstValue ๋ถ€๋ถ„์€ ์ƒ์ˆ˜์˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋‘ ๊ฐœ์˜ ๋ถˆ๋ฆฌ์–ธ ๋ฆฌํ„ฐ๋Ÿด ํ† ํฐ(true, false), integer ํ† ํฐ, decimal ํ† ํฐ, ๋˜๋Š” ์„ธ ๊ฐ€์ง€ ํŠน์ˆ˜ ๋ถ€๋™์†Œ์ˆ˜์  ์ƒ์ˆ˜๊ฐ’(-Infinity, Infinity, NaN) ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ๊ฐ’๋“ค์€(๋ฌธ์ž์—ด, ๋นˆ ์‹œํ€€์Šค ํฌํ•จ) ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„์˜ ๊ธฐ๋ณธ๊ฐ’์ด๋‚˜ ์˜ต์…˜ ์ธ์ž ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ๋ฌธ์ž์—ด, ๋นˆ ์‹œํ€€์Šค [], ๊ธฐ๋ณธ ๋”•์…”๋„ˆ๋ฆฌ {}๋Š” ์ƒ์ˆ˜์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ถˆ๋ฆฌ์–ธ ๋ฆฌํ„ฐ๋Ÿด ํ† ํฐ true์™€ false์˜ ๊ฐ’์€ IDL boolean ํƒ€์ž…์˜ true์™€ false์ž…๋‹ˆ๋‹ค.

integer ํ† ํฐ์˜ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ์ •๋œ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค:

  1. S๋ฅผ integer ํ† ํฐ์— ์ผ์น˜ํ•˜๋Š” ์Šค์นผ๋ผ ๊ฐ’์˜ ์‹œํ€€์Šค๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. S๊ฐ€ U+002D(-)๋กœ ์‹œ์ž‘ํ•˜๋ฉด sign๋Š” โˆ’1, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 1์ž…๋‹ˆ๋‹ค.

  3. ์„ ํƒ์  U+002D(-) ๋’ค์˜ ์Šค์นผ๋ผ ๊ฐ’์— ๋”ฐ๋ผ base๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:

    U+0030 (0), U+0058 (X)
    U+0030 (0), U+0078 (x)

    base๋Š” 16์ž…๋‹ˆ๋‹ค.

    U+0030 (0)

    base๋Š” 8์ž…๋‹ˆ๋‹ค.

    ๊ธฐํƒ€

    base๋Š” 10์ž…๋‹ˆ๋‹ค.

  4. ์„ ํƒ์ ์ธ ๋งจ ์•ž U+002D (-) ๋ฌธ์ž์™€ ์ง„๋ฒ•์„ ๋‚˜ํƒ€๋‚ด๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๋’ค์— ๋‚จ์€ ๋ชจ๋“  ์Šค์นผ๋ผ ๊ฐ’ ์„ base ์ง„๋ฒ• ์ •์ˆ˜๋กœ ํ•ด์„ํ•œ ๊ฒฐ๊ณผ๋ฅผ number ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. sign ร— number๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

integer ํ† ํฐ์˜ ํƒ€์ž…์€ ์‚ฌ์šฉ๋˜๋Š” ์ƒ์ˆ˜, ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„, ์˜ต์…˜ ์ธ์ž์˜ ํƒ€์ž…๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ† ํฐ์˜ ๊ฐ’์€ ยงโ€ฏ2.13 ํƒ€์ž…์—์„œ ์ฃผ์–ด์ง„ ํƒ€์ž…์˜ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

decimal ํ† ํฐ์˜ ๊ฐ’์€, ํ•ด๋‹น ์ƒ์ˆ˜, ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„, ์˜ต์…˜ ์ธ์ž๊ฐ€ float, unrestricted float, double, unrestricted double ํƒ€์ž… ์ค‘ ๋ฌด์—‡์ธ์ง€์— ๋”ฐ๋ผ IEEE 754 ๋‹จ์ •๋ฐ€๋„ ๋˜๋Š” ๋ฐฐ์ •๋ฐ€๋„ ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž๊ฐ€ ๋ฉ๋‹ˆ๋‹ค:
  1. S๋ฅผ decimal ํ† ํฐ์— ์ผ์น˜ํ•˜๋Š” ์Šค์นผ๋ผ ๊ฐ’์˜ ์‹œํ€€์Šค๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. S๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ NumericLiteral๋กœ ํŒŒ์‹ฑํ–ˆ์„ ๋•Œ์˜ ์ˆ˜ํ•™์  ๊ฐ’์„ result๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. ํ•ด๋‹น ํ† ํฐ์ด float ๋˜๋Š” unrestricted float์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉด, result์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด IEEE 754 ๋‹จ์ •๋ฐ€๋„ ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž๊ฐ€ ๊ฐ’์ž…๋‹ˆ๋‹ค.

  4. ๊ทธ ์™ธ์—๋Š” double ๋˜๋Š” unrestricted double์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, result์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด IEEE 754 ๋ฐฐ์ •๋ฐ€๋„ ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž๊ฐ€ ๊ฐ’์ž…๋‹ˆ๋‹ค. [IEEE-754]

์ƒ์ˆ˜๊ฐ’์ด Infinity, -Infinity, NaN๋กœ ์ง€์ •๋œ ๊ฒฝ์šฐ, ์ƒ์ˆ˜, ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„, ์˜ต์…˜ ์ธ์ž์˜ ํƒ€์ž…์— ๋”ฐ๋ผ IEEE 754 ๋‹จ์ •๋ฐ€๋„ ๋˜๋Š” ๋ฐฐ์ •๋ฐ€๋„ ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž๊ฐ€ ๋ฉ๋‹ˆ๋‹ค:

ํƒ€์ž… unrestricted float, ์ƒ์ˆ˜๊ฐ’ Infinity

๊ฐ’์€ IEEE 754 ๋‹จ์ •๋ฐ€๋„ ์–‘์˜ ๋ฌดํ•œ๋Œ€์ž…๋‹ˆ๋‹ค.

ํƒ€์ž… unrestricted double, ์ƒ์ˆ˜๊ฐ’ Infinity

๊ฐ’์€ IEEE 754 ๋ฐฐ์ •๋ฐ€๋„ ์–‘์˜ ๋ฌดํ•œ๋Œ€์ž…๋‹ˆ๋‹ค.

ํƒ€์ž… unrestricted float, ์ƒ์ˆ˜๊ฐ’ -Infinity

๊ฐ’์€ IEEE 754 ๋‹จ์ •๋ฐ€๋„ ์Œ์˜ ๋ฌดํ•œ๋Œ€์ž…๋‹ˆ๋‹ค.

ํƒ€์ž… unrestricted double, ์ƒ์ˆ˜๊ฐ’ -Infinity

๊ฐ’์€ IEEE 754 ๋ฐฐ์ •๋ฐ€๋„ ์Œ์˜ ๋ฌดํ•œ๋Œ€์ž…๋‹ˆ๋‹ค.

ํƒ€์ž… unrestricted float, ์ƒ์ˆ˜๊ฐ’ NaN

๊ฐ’์€ ๋น„ํŠธ ํŒจํ„ด 0x7fc00000์˜ IEEE 754 ๋‹จ์ •๋ฐ€๋„ NaN์ž…๋‹ˆ๋‹ค.

ํƒ€์ž… unrestricted double, ์ƒ์ˆ˜๊ฐ’ NaN

๊ฐ’์€ ๋น„ํŠธ ํŒจํ„ด 0x7ff8000000000000์˜ IEEE 754 ๋ฐฐ์ •๋ฐ€๋„ NaN์ž…๋‹ˆ๋‹ค.

decimal ํ† ํฐ์˜ ํƒ€์ž…์€ ์‚ฌ์šฉ๋˜๋Š” ์ƒ์ˆ˜, ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„, ์˜ต์…˜ ์ธ์ž์˜ ํƒ€์ž…๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ† ํฐ์˜ ๊ฐ’์€ ยงโ€ฏ2.13 ํƒ€์ž…์—์„œ ์ฃผ์–ด์ง„ ํƒ€์ž…์˜ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, Infinity, -Infinity, NaN์€ float๋‚˜ double ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

null ํ† ํฐ์˜ ๊ฐ’์€ null ๊ฐ’์ด๋ฉฐ, ๋„ ํ—ˆ์šฉ ํƒ€์ž…์˜ ๋ฉค๋ฒ„์ž…๋‹ˆ๋‹ค. null ํ† ํฐ์˜ ํƒ€์ž…์€ ํ•ด๋‹น ์ƒ์ˆ˜, ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„, ์˜ต์…˜ ์ธ์ž์˜ ํƒ€์ž…๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ƒ์ˆ˜์— ํ• ๋‹น๋œ ๊ฐ’์˜ ํƒ€์ž… VT์™€ ์ƒ์ˆ˜, ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„, ์˜ต์…˜ ์ธ์ž ์ž์ฒด์˜ ํƒ€์ž… DT๋Š” ํ˜ธํ™˜๋˜์–ด์•ผ ํ•˜๋ฉฐ, DT์™€ VT๊ฐ€ ๋™์ผํ•˜๊ฑฐ๋‚˜, DT๊ฐ€ ๋„ ํ—ˆ์šฉ ํƒ€์ž…์ด๊ณ  ๋‚ด๋ถ€ ํƒ€์ž…์ด VT์ธ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ƒ์ˆ˜๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ • ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค์—์„œ ์ƒ์ˆ˜๊ฐ€ ๋…ธ์ถœ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” ๊ทธ ์ƒ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ IDL ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ƒ์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ IDL์—์„œ:

[Exposed=Window]
interface A {
  const short rambaldi = 47;
};

์ƒ์ˆ˜๊ฐ’์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ A.rambaldi ๋˜๋Š” instanceOfA.rambaldi๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์ˆ˜์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ํ™•์žฅ ์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: [CrossOriginIsolated], [Exposed], [SecureContext].

Const ::
    const ConstType identifier = ConstValue ;
ConstValue ::
    BooleanLiteral
    FloatLiteral
    integer
BooleanLiteral ::
    true
    false
FloatLiteral ::
    decimal
    -Infinity
    Infinity
    NaN
ConstType ::
    PrimitiveType
    identifier

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์œ„์˜ ํƒ€์ž…์˜ ์ƒ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์ •์˜๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

[Exposed=Window]
interface Util {
  const boolean DEBUG = false;
  const octet LF = 10;
  const unsigned long BIT_MASK = 0x0000fc00;
  const double AVOGADRO = 6.022e23;
};

2.5.2. ์†์„ฑ

์†์„ฑ์€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„ ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฉค๋ฒ„๋กœ, (inherit AttributeRest, static OptionalReadOnly AttributeRest, stringifier OptionalReadOnly AttributeRest, OptionalReadOnly AttributeRest, ๋˜๋Š” AttributeRest์— ์ผ์น˜) ์ฃผ์–ด์ง„ ํƒ€์ž…๊ณผ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ํ•„๋“œ๋ฅผ ์„ ์–ธํ•˜๋ฉฐ, ํ•ด๋‹น ๊ฐ’์€ ์กฐํšŒ๋˜๊ฑฐ๋‚˜(์ผ๋ถ€ ๊ฒฝ์šฐ) ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ์ผ๋ฐ˜ ์†์„ฑ์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ง€์ •๋œ ์‹๋ณ„์ž์˜ ๋ฐ์ดํ„ฐ ํ•„๋“œ ๋ฉค๋ฒ„๋ฅผ ๊ฐ–๋„๋ก ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

    interface interface_identifier {
      attribute type identifier;
    };
    
  2. ์ •์  ์†์„ฑ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํŠน์ • ๊ฐ์ฒด์™€ ๊ด€๋ จ๋˜์ง€ ์•Š์€ ์†์„ฑ์„ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    interface interface_identifier {
      static attribute type identifier;
    };
    

์†์„ฑ์— static ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ผ๋ฐ˜ ์†์„ฑ์„ ์„ ์–ธํ•œ ๊ฒƒ์ด๊ณ , ์žˆ์œผ๋ฉด ์ •์  ์†์„ฑ์„ ์„ ์–ธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„ ์™ธ์—๋„, ์ฝ๊ธฐ ์ „์šฉ ์ผ๋ฐ˜ ์†์„ฑ์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฉค๋ฒ„๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ attr์˜ getter ๋‹จ๊ณ„๋Š” โ€œattr getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:โ€(๋ชฉ๋ก) ๋˜๋Š” โ€œattr getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹คโ€(์ธ๋ผ์ธ ์„ค๋ช…)์™€ ๊ฐ™์€ ํ…์ŠคํŠธ๋กœ ์†Œ๊ฐœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ attr์˜ setter ๋‹จ๊ณ„๋Š” โ€œattr setter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:โ€(๋ชฉ๋ก) ๋˜๋Š” โ€œattr setter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹คโ€(์ธ๋ผ์ธ ์„ค๋ช…)์™€ ๊ฐ™์€ ํ…์ŠคํŠธ๋กœ ์†Œ๊ฐœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : getter ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” this์— ์•”๋ฌต์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. setter ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” this์™€ ์ง€์ •๋œ ๊ฐ’์— ์•”๋ฌต์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ์˜ ์‹๋ณ„์ž๋Š” ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„์˜ ์‹๋ณ„์ž์™€ ๊ฐ™์•„์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ •์  ์†์„ฑ์˜ ์‹๋ณ„์ž๋Š” "prototype"์ด๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์†์„ฑ์˜ ํƒ€์ž…์€ attribute ํ‚ค์›Œ๋“œ ๋’ค์— ๋“ฑ์žฅํ•˜๋Š” ํƒ€์ž…(Type์— ์ผ์น˜)์œผ๋กœ ์ •ํ•ด์ง‘๋‹ˆ๋‹ค. ๋งŒ์•ฝ Type์ด ์‹๋ณ„์ž๊ฑฐ๋‚˜ ์‹๋ณ„์ž ๋‹ค์Œ์— ?๊ฐ€ ๋ถ™์€ ๊ฒฝ์šฐ, ํ•ด๋‹น ์‹๋ณ„์ž๋Š” ์ธํ„ฐํŽ˜์ด์Šค, ์—ด๊ฑฐํ˜•, ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค, ํƒ€์ž… ์ •์˜๋ฅผ ์‹๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž… ์ •์˜๋ฅผ ํ•ด์„ํ•œ ํ›„, ์†์„ฑ์˜ ํƒ€์ž…์€ ๋‹ค์Œ ํƒ€์ž…์˜ ๋„ ํ—ˆ์šฉ ๋˜๋Š” ๋น„ํ—ˆ์šฉ ๋ฒ„์ „์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค:

์†์„ฑ์€ ์ฝ๊ธฐ ์ „์šฉ์ด๋ฉฐ, readonly ํ‚ค์›Œ๋“œ๊ฐ€ attribute ํ‚ค์›Œ๋“œ ์•ž์— ์žˆ์œผ๋ฉด ๊ทธ๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ์ด ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋Š” ํ•ด๋‹น ์†์„ฑ์— ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ๋ฐ”์ธ๋”ฉ๋งˆ๋‹ค ํ• ๋‹น์ด ๋‹จ์ˆœํžˆ ๊ธˆ์ง€๋˜๋Š”์ง€, ๋ฌด์‹œ๋˜๋Š”์ง€, ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

interface interface_identifier {
  readonly attribute type identifier;
};

ํƒ€์ž…์ด ํ”„๋ผ๋ฏธ์Šค ํƒ€์ž…์ธ ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ์ฝ๊ธฐ ์ „์šฉ์ด์–ด์•ผ ํ•˜๋ฉฐ, ๋˜ํ•œ [LegacyLenientSetter], [PutForwards], [Replaceable], [SameObject] ํ™•์žฅ ์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

์ฐธ๊ณ : ๋ฌธ๋ฒ•์ƒ inherit๋Š” ์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ์ด๋‚˜ ์ •์  ์†์„ฑ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[Exposed=Window]
interface Ancestor {
  readonly attribute TheType theIdentifier;
};

[Exposed=Window]
interface Derived : Ancestor {
  inherit attribute TheType theIdentifier;
};

stringifier ํ‚ค์›Œ๋“œ๊ฐ€ ์ผ๋ฐ˜ ์†์„ฑ ์„ ์–ธ์— ์‚ฌ์šฉ๋˜๋ฉด, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ํ•ด๋‹น ์†์„ฑ ๊ฐ’์œผ๋กœ ๋ฌธ์ž์—ด ๋ณ€ํ™˜๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ยงโ€ฏ2.5.5 ๋ฌธ์ž์—ด ๋ณ€ํ™˜์ž๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

interface interface_identifier {
  stringifier attribute DOMString identifier;
};

๋‹ค์Œ ํ™•์žฅ ์†์„ฑ์€ ์ผ๋ฐ˜ ๋ฐ ์ •์  ์†์„ฑ์— ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค: [CrossOriginIsolated], [Exposed], [SameObject], [SecureContext].

๋‹ค์Œ ํ™•์žฅ ์†์„ฑ์€ ์ผ๋ฐ˜ ์†์„ฑ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค: [LegacyLenientSetter], [LegacyLenientThis], [PutForwards], [Replaceable], [LegacyUnforgeable].

ReadOnlyMember ::
    readonly ReadOnlyMemberRest
ReadOnlyMemberRest ::
    AttributeRest
    MaplikeRest
    SetlikeRest
ReadWriteAttribute ::
    AttributeRest
InheritAttribute ::
    inherit AttributeRest
AttributeRest ::
    attribute TypeWithExtendedAttributes AttributeName ;
AttributeName ::
    AttributeNameKeyword
    identifier
AttributeNameKeyword ::
    required
OptionalReadOnly ::
    readonly
    ฮต

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์†์„ฑ์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

[Exposed=Window]
interface Animal {

  // ์ž„์˜์˜ ๋ฌธ์ž์—ด ๊ฐ’์œผ๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•œ ๋‹จ์ˆœ ์†์„ฑ.
  readonly attribute DOMString name;

  // ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ.
  attribute unsigned short age;
};

[Exposed=Window]
interface Person : Animal {

  // Animal์—์„œ getter ๋™์ž‘์„ ์ƒ์†๋ฐ›์œผ๋ฉฐ, Person ์„ค๋ช…์—์„œ ๋ณ„๋„ ๋ช…์‹œ ํ•„์š” ์—†์Œ.
  inherit attribute DOMString name;
};

2.5.3. ์—ฐ์‚ฐ

์—ฐ์‚ฐ์€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฉค๋ฒ„ (static RegularOperation, stringifier, RegularOperation ๋˜๋Š” SpecialOperation์— ์ผ์น˜) ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์—๋Š” ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ์ผ๋ฐ˜ ์—ฐ์‚ฐ์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ง€์ •๋œ ์‹๋ณ„์ž์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๋„๋ก ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

    interface interface_identifier {
      return_type identifier(/* arguments... */);
    };
    
  2. ํŠน์ˆ˜ ์—ฐ์‚ฐ์€ ๊ฐ์ฒด ์ธ๋ฑ์‹ฑ, ๋ฌธ์ž์—ด ๋ณ€ํ™˜ ๋“ฑ ํŠน๋ณ„ํ•œ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์— ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    interface interface_identifier {
      /* special_keyword */ return_type identifier(/* arguments... */);
      /* special_keyword */ return_type (/* arguments... */);
    };
    
  3. ์ •์  ์—ฐ์‚ฐ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํŠน์ • ๊ฐ์ฒด์™€ ๊ด€๋ จ๋˜์ง€ ์•Š์€ ์—ฐ์‚ฐ์„ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    interface interface_identifier {
      static return_type identifier(/* arguments... */);
    };
    

์—ฐ์‚ฐ์— ์‹๋ณ„์ž๊ฐ€ ์žˆ๊ณ  static ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ผ๋ฐ˜ ์—ฐ์‚ฐ์„ ์„ ์–ธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์— ์„ ์–ธ์— ํŠน์ˆ˜ ํ‚ค์›Œ๋“œ(Special์— ์ผ์น˜ํ•˜๋Š” ํ‚ค์›Œ๋“œ ๋˜๋Š” stringifier ํ‚ค์›Œ๋“œ)๊ฐ€ ์žˆ์œผ๋ฉด ํŠน์ˆ˜ ์—ฐ์‚ฐ์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์ด ์ผ๋ฐ˜ ์—ฐ์‚ฐ๊ณผ ํŠน์ˆ˜ ์—ฐ์‚ฐ์„ ๋™์‹œ์— ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ยงโ€ฏ2.5.6 ํŠน์ˆ˜ ์—ฐ์‚ฐ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์ฐธ๊ณ ๋กœ, ์ผ๋ฐ˜ ์—ฐ์‚ฐ์€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„ ์™ธ์—๋„, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„ ๋ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฉค๋ฒ„๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ์‚ฐ์— ์‹๋ณ„์ž๊ฐ€ ์—†์œผ๋ฉด ๋ฐ˜๋“œ์‹œ ํŠน์ˆ˜ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ˆ˜ ์—ฐ์‚ฐ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์—ฐ์‚ฐ ๋˜๋Š” ์ •์  ์—ฐ์‚ฐ์˜ ์‹๋ณ„์ž๋Š” ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค, ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ •์˜๋œ ์ƒ์ˆ˜๋‚˜ ์†์„ฑ์˜ ์‹๋ณ„์ž์™€ ๊ฐ™์•„์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ •์  ์—ฐ์‚ฐ์˜ ์‹๋ณ„์ž๋Š” "prototype"์ด๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์—ฐ์‚ฐ์˜ ์‹๋ณ„์ž๋Š” ๋™์ผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค๋ฅธ ์—ฐ์‚ฐ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—ฐ์‚ฐ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ๋ช…์„ธํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ •์  ์—ฐ์‚ฐ์˜ ์‹๋ณ„์ž๋Š” ๋™์ผ ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ์ผ๋ฐ˜ ์—ฐ์‚ฐ์˜ ์‹๋ณ„์ž์™€ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ์‚ฐ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ์—ฐ์‚ฐ ์„ ์–ธ์—์„œ ์‹๋ณ„์ž ์•ž์— ๋“ฑ์žฅํ•˜๋Š” ํƒ€์ž…(Type์— ์ผ์น˜)์œผ๋กœ ์ •ํ•ด์ง‘๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ?๊ฐ€ ๋ถ™์€ ์‹๋ณ„์ž์ธ ๊ฒฝ์šฐ, ํ•ด๋‹น ์‹๋ณ„์ž๋Š” ์ธํ„ฐํŽ˜์ด์Šค, ๋”•์…”๋„ˆ๋ฆฌ, ์—ด๊ฑฐํ˜•, ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค, ํƒ€์ž… ์ •์˜๋ฅผ ์‹๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ์‚ฐ์˜ ์ธ์ž(ArgumentList์— ์ผ์น˜)๋Š” ์„ ์–ธ์˜ ๊ด„ํ˜ธ ์‚ฌ์ด์— ๋ช…์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์ธ์ž๋Š” ํƒ€์ž…(Type์— ์ผ์น˜) ๋’ค์— ์‹๋ณ„์ž(ArgumentName์— ์ผ์น˜)๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ํ‘œํ˜„๋ ฅ์„ ์œ„ํ•ด, ์—ฐ์‚ฐ ์ธ์ž์˜ ์‹๋ณ„์ž๋Š” ArgumentNameKeyword ์‹ฌ๋ณผ์— ์ผ์น˜ํ•˜๋Š” ํ‚ค์›Œ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ์ด์Šค์ผ€์ดํ”„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์—ฐ์‚ฐ ์ธ์ž์˜ Type์ด ?๊ฐ€ ๋ถ™์€ ์‹๋ณ„์ž์ธ ๊ฒฝ์šฐ, ํ•ด๋‹น ์‹๋ณ„์ž๋Š” ์ธํ„ฐํŽ˜์ด์Šค, ์—ด๊ฑฐํ˜•, ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค, ํƒ€์ž… ์ •์˜๋ฅผ ์‹๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ?๊ฐ€ ์—†๋Š” ์‹๋ณ„์ž ํƒ€์ž…์ธ ๊ฒฝ์šฐ, ํ•ด๋‹น ์‹๋ณ„์ž๋Š” ์œ„์˜ ์ •์˜๋“ค ์ค‘ ํ•˜๋‚˜ ๋˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ž ํƒ€์ž…์„ ํƒ€์ž… ์ •์˜ ํ•ด์„ ํ›„, ๋„ ํ—ˆ์šฉ ํƒ€์ž…(nullable type)์ด๋ฉด, ๊ทธ ๋‚ด๋ถ€ ํƒ€์ž…์€ ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

interface interface_identifier {
  return_type identifier(type identifier, type identifier /* , ... */);
};

๊ฐ ์ธ์ž์˜ ์‹๋ณ„์ž๋Š” ๋™์ผ ์—ฐ์‚ฐ ์„ ์–ธ ๋‚ด์˜ ๋‹ค๋ฅธ ์ธ์ž ์‹๋ณ„์ž์™€ ๊ฐ™์•„์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ ์ธ์ž๋Š” ํ™•์žฅ ์†์„ฑ ๋ฆฌ์ŠคํŠธ(ExtendedAttributeList์— ์ผ์น˜)๊ฐ€ ์•ž์— ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ•ด๋‹น ์ธ์ž ๊ฐ’์ด ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

interface interface_identifier {
  return_type identifier([extended_attributes] type identifier, [extended_attributes] type identifier /* , ... */);
};

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์ผ๋ฐ˜ ์—ฐ์‚ฐ์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

[Exposed=Window]
interface Dimensions {
  attribute unsigned long width;
  attribute unsigned long height;
};

[Exposed=Window]
interface Button {

  // ์ธ์ž๋ฅผ ๋ฐ›์ง€ ์•Š๊ณ  ๋ถˆ๋ฆฌ์–ธ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ.
  boolean isMouseOver();

  // ์˜ค๋ฒ„๋กœ๋”ฉ๋œ ์—ฐ์‚ฐ๋“ค.
  undefined setDimensions(Dimensions size);
  undefined setDimensions(unsigned long width, unsigned long height);
};

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

interface interface_identifier {
  return_type identifier(type... identifier);
  return_type identifier(type identifier, type... identifier);
};

ํ™•์žฅ ์†์„ฑ ์ค‘ ์ธ์ž ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›๋Š” ([LegacyFactoryFunction]) ๋ฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋„ ... ํ† ํฐ์ด ์ธ์ž ๋ฆฌ์ŠคํŠธ์— ์‚ฌ์šฉ๋˜๋ฉด ๊ฐ€๋ณ€ ์ธ์ž๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ€๋ณ€ ์ธ์ž ์—ฐ์‚ฐ์„ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

[Exposed=Window]
interface IntegerSet {
  readonly attribute unsigned long cardinality;

  undefined union(long... ints);
  undefined intersection(long... ints);
};

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ ๊ฐ€๋ณ€ ์ธ์ž ์—ฐ์‚ฐ์€ ์ถ”๊ฐ€ ์ธ์ž๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค:

var s = getIntegerSet();  // IntegerSet ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ

s.union();                // 'ints'์— ํ•ด๋‹นํ•˜๋Š” ์ธ์ž๋ฅผ ์•ˆ ๋„˜๊น€
s.union(1, 4, 7);         // 'ints'์— ํ•ด๋‹นํ•˜๋Š” ์ธ์ž๋ฅผ ์„ธ ๊ฐœ ๋„˜๊น€

๊ฐ€๋ณ€ ์ธ์ž ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋ฐฐ์—ด์ด๋‚˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธฐ๋„๋ก ๋ช…์„ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ž์— optional ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์˜ต์…˜ ์ธ์ž๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋ณ€ ์ธ์ž(variadic) ์—ฐ์‚ฐ์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž๋„ ์˜ต์…˜ ์ธ์ž๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ธ์ž๋ฅผ ์˜ต์…˜์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์—ฐ์‚ฐ ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น ์ธ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์ด ๊ฐ€๋ณ€ ์ธ์ž์ผ ๋•Œ ๋งˆ์ง€๋ง‰ ์ธ์ž๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์˜ต์…˜ ์ธ์ž๋กœ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

interface interface_identifier {
  return_type identifier(type identifier, optional type identifier);
};

์˜ต์…˜ ์ธ์ž๋Š” ๊ธฐ๋ณธ๊ฐ’๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ž ์‹๋ณ„์ž ๋’ค์— U+003D(=)์™€ ๊ฐ’(DefaultValue์— ์ผ์น˜)์ด ์˜ค๋ฉด, ๊ทธ ๊ฐ’์ด ์˜ต์…˜ ์ธ์ž์˜ ๊ธฐ๋ณธ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€๋ณ€ ์ธ์ž ์—ฐ์‚ฐ์˜ ๋งˆ์ง€๋ง‰(์•”์‹œ์  ์˜ต์…˜) ์ธ์ž์—๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ํ•ด๋‹น ์ธ์ž๊ฐ€ ์ƒ๋žต๋˜์–ด ํ˜ธ์ถœ๋  ๋•Œ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

interface interface_identifier {
  return_type identifier(type identifier, optional type identifier = "value");
};

boolean ํƒ€์ž…์˜ ์˜ต์…˜ ์ธ์ž์— true๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €์ž๋Š” ๊ธฐ๋ณธ ๋ณ€ํ™˜(์ฆ‰ undefined โ†’ false)์„ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ˜ผ๋™์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [API-DESIGN-PRINCIPLES]

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

์ด๋Š” API ์„ค๊ณ„์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ๋”•์…”๋„ˆ๋ฆฌ์˜ ๊ธฐ๋ณธ๊ฐ’๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๋นˆ ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ’์„ ๊ตณ์ด ๋„˜๊ธฐ์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

๋Œ€๊ฐœ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ {}๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์œ ๋‹ˆ์˜จ ํƒ€์ž…์—์„œ ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ํ‰ํƒ„ํ™”๋œ ๋ฉค๋ฒ„ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๋ผ๋ฉด ๋‹ค๋ฅธ ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™”์šฉ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆ๋ฆฌ์–ธ ๋ฆฌํ„ฐ๋Ÿด ํ† ํฐ(true, false), null ํ† ํฐ, integer ํ† ํฐ, decimal ํ† ํฐ, Infinity, -Infinity, NaN ์ค‘ ํ•˜๋‚˜๊ฐ€ ์˜ต์…˜ ์ธ์ž ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉด, ์ƒ์ˆ˜์— ๋Œ€ํ•ด์™€ ๋™์ผํ•˜๊ฒŒ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค.

undefined ํ† ํฐ์ด ์˜ต์…˜ ์ธ์ž ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ, ๊ฐ’์€ IDL undefined์ž…๋‹ˆ๋‹ค.

์˜ต์…˜ ์ธ์ž ๊ธฐ๋ณธ๊ฐ’์€ string ํ† ํฐ์œผ๋กœ๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด ํƒ€์ž…์œผ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค:
  1. S๋ฅผ string ํ† ํฐ์—์„œ ์–‘๋ U+0022(") ์Šค์นผ๋ผ ๊ฐ’์„ ์ œ๊ฑฐํ•œ ํ›„ ๋‚จ์€ ์Šค์นผ๋ผ ๊ฐ’ ์‹œํ€€์Šค๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. ์ธ์ž ํƒ€์ž…์— ๋”ฐ๋ผ:

    DOMString
    USVString
    ์—ด๊ฑฐํ˜• ํƒ€์ž…

    string ํ† ํฐ์˜ ๊ฐ’์€ S์ž…๋‹ˆ๋‹ค.

    ByteString

    ๋‹จ, S์—๋Š” U+00FF๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    string ํ† ํฐ์˜ ๊ฐ’์€ ๋™ํ˜• ์ธ์ฝ”๋”ฉ๋œ S์ž…๋‹ˆ๋‹ค.

์˜ต์…˜ ์ธ์ž์˜ ํƒ€์ž…์ด ์—ด๊ฑฐํ˜•์ด๋ฉด, ์ง€์ •๋œ ๊ธฐ๋ณธ๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ์—ด๊ฑฐํ˜• ๊ฐ’ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ ์ธ์ž ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋‘ ํ† ํฐ ๊ฐ’ []๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋นˆ ์‹œํ€€์Šค ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํƒ€์ž…์€ ํ•ด๋‹น ์˜ต์…˜ ์ธ์ž์˜ ํƒ€์ž…๊ณผ ๋™์ผํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฐ˜๋“œ์‹œ ์‹œํ€€์Šค ํƒ€์ž…, ๋„ ํ—ˆ์šฉ ํƒ€์ž… ์ค‘ ๋‚ด๋ถ€ ํƒ€์ž…์ด ์‹œํ€€์Šค ํƒ€์ž…์ธ ๊ฒƒ, ์œ ๋‹ˆ์˜จ ํƒ€์ž…, ๋„ ํ—ˆ์šฉ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์€ ์‹œํ€€์Šค ํƒ€์ž…์„ ํ‰ํƒ„ํ™”๋œ ๋ฉค๋ฒ„ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๋กœ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ ์ธ์ž ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋‘ ํ† ํฐ ๊ฐ’ {}๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ธฐ๋ณธ ์ดˆ๊ธฐํ™”๋œ(ES null ๋˜๋Š” ์†์„ฑ์ด ์—†๋Š” ๊ฐ์ฒด์™€ ๊ฐ™์ด) ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ’์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž…์€ ํ•ด๋‹น ์˜ต์…˜ ์ธ์ž์˜ ํƒ€์ž…๊ณผ ๋™์ผํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฐ˜๋“œ์‹œ ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์ด๊ฑฐ๋‚˜ ์œ ๋‹ˆ์˜จ ํƒ€์ž… ์ค‘ ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์„ ํ‰ํƒ„ํ™”๋œ ๋ฉค๋ฒ„ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๋กœ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๋‘ ๊ฐ€์ง€ ์ธ์ž ๋ฆฌ์ŠคํŠธ ๊ธธ์ด๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๋‹จ์ผ ์—ฐ์‚ฐ์„ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

[Exposed=Window]
interface ColorCreator {
  object createColor(double v1, double v2, double v3, optional double alpha);
};

์ด๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๋‘ ๊ฐœ์˜ ์˜ค๋ฒ„๋กœ๋”ฉ๋œ ์—ฐ์‚ฐ์„ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค:

[Exposed=Window]
interface ColorCreator {
  object createColor(double v1, double v2, double v3);
  object createColor(double v1, double v2, double v3, double alpha);
};

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๋”•์…”๋„ˆ๋ฆฌ ์ธ์ž๋ฅผ ๋ฐ›๋Š” ์—ฐ์‚ฐ์„ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

dictionary LookupOptions {
  boolean caseSensitive = false;
};

[Exposed=Window]
interface AddressBook {
  boolean hasAddressForName(USVString name, optional LookupOptions options = {});
};

hasAddressForName์„ ์ธ์ž ํ•˜๋‚˜๋งŒ ๋„˜๊ฒจ ํ˜ธ์ถœํ•˜๋ฉด, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๊ธฐ๋ณธ ์ดˆ๊ธฐํ™”๋œ LookupOptions ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ๋˜๋ฉฐ, caseSensitive๋Š” false๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์—ฐ์‚ฐ์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ํ™•์žฅ ์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: [CrossOriginIsolated], [Default], [Exposed], [LegacyUnforgeable], [NewObject], [SecureContext].

์—ฐ์‚ฐ operation์˜ ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” โ€œoperation(arg1, arg2, ...) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:โ€(๋ชฉ๋ก) ๋˜๋Š” โ€œoperation(arg1, arg2, ...) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹คโ€(์ธ๋ผ์ธ ์„ค๋ช…)์™€ ๊ฐ™์€ ํ…์ŠคํŠธ๋กœ ์†Œ๊ฐœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” this์— ์•”๋ฌต์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DefaultValue ::
    ConstValue
    string
    [ ]
    { }
    null
    undefined
Operation ::
    RegularOperation
    SpecialOperation
RegularOperation ::
    Type OperationRest
SpecialOperation ::
    Special RegularOperation
Special ::
    getter
    setter
    deleter
OperationRest ::
    OptionalOperationName ( ArgumentList ) ;
OptionalOperationName ::
    OperationName
    ฮต
OperationName ::
    OperationNameKeyword
    identifier
OperationNameKeyword ::
    includes
ArgumentList ::
    Argument Arguments
    ฮต
Arguments ::
    , Argument Arguments
    ฮต
Argument ::
    ExtendedAttributeList ArgumentRest
ArgumentRest ::
    optional TypeWithExtendedAttributes ArgumentName Default
    Type Ellipsis ArgumentName
ArgumentName ::
    ArgumentNameKeyword
    identifier
Ellipsis ::
    ...
    ฮต
ArgumentNameKeyword ::
    attribute
    callback
    const
    constructor
    deleter
    dictionary
    enum
    getter
    includes
    inherit
    interface
    iterable
    maplike
    mixin
    namespace
    partial
    readonly
    required
    setlike
    setter
    static
    stringifier
    typedef
    unrestricted
2.5.3.1. toJSON

toJSON ์ผ๋ฐ˜ ์—ฐ์‚ฐ์„ ์„ ์–ธํ•จ์œผ๋กœ์จ, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ JSON ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ช…์„ธํ•ฉ๋‹ˆ๋‹ค.

toJSON ์ผ๋ฐ˜ ์—ฐ์‚ฐ์€ ์ด๋Ÿฌํ•œ ์šฉ๋„๋ฅผ ์œ„ํ•ด ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์ธ์ž๋ฅผ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ, JSON ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

JSON ํƒ€์ž…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

toJSON ์ผ๋ฐ˜ ์—ฐ์‚ฐ ์ด ๊ฐ์ฒด์—์„œ ์–ด๋–ป๊ฒŒ ๋…ธ์ถœ๋˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  JSON ํƒ€์ž…์ด JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜๋Š” ๋ฐฉ์‹์€ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š”, toJSON ๋ฉ”์„œ๋“œ๋ฅผ ๋…ธ์ถœํ•˜์—ฌ JSON ํƒ€์ž…์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ , JSON.stringify() ํ•จ์ˆ˜๋กœ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ toJSON ์—ฐ์‚ฐ์— [Default] ํ™•์žฅ ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ๊ธฐ๋ณธ toJSON ๋‹จ๊ณ„๊ฐ€ ๋Œ€์‹  ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” Transaction ์ธํ„ฐํŽ˜์ด์Šค์— toJSON ๋ฉ”์„œ๋“œ๋ฅผ ํ”„๋กœ์ฆˆ๋กœ ์ •์˜ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:

[Exposed=Window]
interface Transaction {
  readonly attribute DOMString from;
  readonly attribute DOMString to;
  readonly attribute double amount;
  readonly attribute DOMString description;
  readonly attribute unsigned long number;
  TransactionJSON toJSON();
};

dictionary TransactionJSON {
  Account from;
  Account to;
  double amount;
  DOMString description;
};

Transaction ์ธํ„ฐํŽ˜์ด์Šค์˜ toJSON ์ผ๋ฐ˜ ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

toJSON() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. json์„ ์ƒˆ ๋งต์œผ๋กœ๋‘ก๋‹ˆ๋‹ค.

  2. ๊ฐ ์†์„ฑ identifier attr์— ๋Œ€ํ•ด ยซ"from", "to", "amount", "description"ยป:

    1. value๋ฅผ getter ๋‹จ๊ณ„๋ฅผ this์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. json[attr]์— value๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. json์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” Transaction ๊ฐ์ฒด์— toJSON() ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค:

// Transaction ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ
var txn = getTransaction();

// ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ์ฒด๋กœ ํ‰๊ฐ€๋จ:
// {
//   from: "Bob",
//   to: "Alice",
//   amount: 50,
//   description: "books"
// }
txn.toJSON();

// ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด๋กœ ํ‰๊ฐ€๋จ:
// '{"from":"Bob","to":"Alice","amount":50,"description":"books"}'
JSON.stringify(txn);

2.5.4. ์ƒ์„ฑ์ž ์—ฐ์‚ฐ

์ธํ„ฐํŽ˜์ด์Šค์— ์ƒ์„ฑ์ž ์—ฐ์‚ฐ ๋ฉค๋ฒ„(Constructor์— ์ผ์น˜)๊ฐ€ ์žˆ์œผ๋ฉด, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒ์„ฑ์ž ์—ฐ์‚ฐ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐ๊ฐ์˜ ์ƒ์„ฑ์ž ์—ฐ์‚ฐ์— ๋Œ€ํ•ด, ์ง€์ •๋œ ์ธ์ž๋ฅผ ๋„˜๊ฒจ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋ฐฉ๋ฒ•์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž ์—ฐ์‚ฐ์ด ์ธํ„ฐํŽ˜์ด์Šค interface์˜ ๋ฉค๋ฒ„์ผ ๋•Œ ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” โ€œThe new interface(arg1, arg2, ...) ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:โ€(๋ชฉ๋ก) ๋˜๋Š” โ€œThe new interface(arg1, arg2, ...) ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹คโ€(์ธ๋ผ์ธ ์„ค๋ช…)์™€ ๊ฐ™์€ ํ…์ŠคํŠธ๋กœ ์†Œ๊ฐœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, this์— ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜, ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ์ž๊ฐ€ this๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, โ€œThe new Example(init) ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.โ€๋ผ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ยงโ€ฏ3.7.1 ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์—์„œ ์ƒ์„ฑ์ž ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ IDL์€ ๋‘ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ƒ์„ฑ์ž ์—ฐ์‚ฐ์ด ์žˆ์ง€๋งŒ, ์ฒซ ๋ฒˆ์งธ์—๋Š” ์—†์Šต๋‹ˆ๋‹ค.

[Exposed=Window]
interface NodeList {
  Node item(unsigned long index);
  readonly attribute unsigned long length;
};

[Exposed=Window]
interface Circle {
  constructor();
  constructor(double radius);
  attribute double r;
  attribute double cx;
  attribute double cy;
  readonly attribute double circumference;
};

์ด ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ์ง€์›ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌํ˜„์—์„œ๋Š” Circle ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์— [[Construct]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๋Š” 0๊ฐœ ๋˜๋Š” 1๊ฐœ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

NodeList ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๊ฐ€ [[Construct]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”์ง€๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ด๋ฅผ ์ƒ์„ฑ์ž๋กœ ์‚ฌ์šฉํ•˜๋ ค ํ•˜๋ฉด TypeError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. [whatwg/webidl Issue #698]

var x = new Circle();      // 0๊ฐœ ์ธ์ž ์ƒ์„ฑ์ž๋กœ Circle ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๊ฐ์ฒด ์ƒ์„ฑ
                           // ํ”Œ๋žซํผ ๊ฐ์ฒด ์ฐธ์กฐ ๋ฐ˜ํ™˜

var y = new Circle(1.25);  // 1๊ฐœ ์ธ์ž ์ƒ์„ฑ์ž๋กœ Circle ๊ฐ์ฒด ์ƒ์„ฑ

var z = new NodeList();    // ์ƒ์„ฑ์ž ์„ ์–ธ์ด ์—†์œผ๋ฏ€๋กœ TypeError ๋ฐœ์ƒ
Constructor ::
    constructor ( ArgumentList ) ;
ArgumentList ::
    Argument Arguments
    ฮต
Arguments ::
    , Argument Arguments
    ฮต
Argument ::
    ExtendedAttributeList ArgumentRest
ArgumentRest ::
    optional TypeWithExtendedAttributes ArgumentName Default
    Type Ellipsis ArgumentName
ArgumentName ::
    ArgumentNameKeyword
    identifier
Ellipsis ::
    ...
    ฮต
ArgumentNameKeyword ::
    attribute
    callback
    const
    constructor
    deleter
    dictionary
    enum
    getter
    includes
    inherit
    interface
    iterable
    maplike
    mixin
    namespace
    partial
    readonly
    required
    setlike
    setter
    static
    stringifier
    typedef
    unrestricted

2.5.5. ๋ฌธ์ž์—ด ๋ณ€ํ™˜์ž

์ธํ„ฐํŽ˜์ด์Šค์— ๋ฌธ์ž์—ด ๋ณ€ํ™˜์ž๊ฐ€ ์žˆ์œผ๋ฉด, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹Œ ๋ฌธ์ž์—ด ๋ณ€ํ™˜(conversion)์„ ๊ฐ–๋Š”๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๋ณ€ํ™˜์ž๋Š” stringifier ํ‚ค์›Œ๋“œ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ๋ฌธ์ž์—ด ๋ณ€ํ™˜ ์—ฐ์‚ฐ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

interface interface_identifier {
  stringifier;
};

์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•จ๊ป˜ ์„ค๋ช…๋˜๋Š” ํ”„๋กœ์ฆˆ(prose)์—์„œ๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฌธ์ž์—ด ๋ณ€ํ™˜ ๋™์ž‘์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

interface interface_identifier {
  stringifier attribute DOMString identifier;
};

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

Stringifier ::
    stringifier StringifierRest
StringifierRest ::
    OptionalReadOnly AttributeRest
    ;

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” name ์†์„ฑ ๊ฐ’์œผ๋กœ ๋ฌธ์ž์—ด ๋ณ€ํ™˜๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

[Exposed=Window]
interface Student {
  constructor();
  attribute unsigned long id;
  stringifier attribute DOMString name;
};

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ Student ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด์ด ํ•„์š”ํ•œ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์˜ name ์†์„ฑ ๊ฐ’์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค:

var s = new Student();
s.id = 12345678;
s.name = 'ๅ‘จๆฐๅ€ซ';

var greeting = 'Hello, ' + s + '!';  // greeting == 'Hello, ๅ‘จๆฐๅ€ซ!'

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” IDL ์ž์ฒด์— ๋ช…์‹œ๋˜์ง€ ์•Š์€ ์ปค์Šคํ…€ ๋ฌธ์ž์—ด ๋ณ€ํ™˜ ๋™์ž‘์„ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

[Exposed=Window]
interface Student {
  constructor();
  attribute unsigned long id;
  attribute DOMString? familyName;
  attribute DOMString givenName;

  stringifier;
};

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

๋ฌธ์ž์—ด ๋ณ€ํ™˜ ๋™์ž‘ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. this์˜ family name์ด null์ด๋ฉด, this์˜ given name์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. this์˜ given name, U+0020 SPACE, this์˜ family name์„ ์ˆœ์„œ๋Œ€๋กœ ์ด์–ด๋ถ™์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด IDL์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌํ˜„ ๋™์ž‘ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

var s = new Student();
s.id = 12345679;
s.familyName = 'Smithee';
s.givenName = 'Alan';

var greeting = 'Hi ' + s;  // greeting == 'Hi Alan Smithee'

2.5.6. ํŠน์ˆ˜ ์—ฐ์‚ฐ

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

ํŠน์ˆ˜ ์—ฐ์‚ฐ์—๋Š” ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋Š” ๊ฐ ํŠน์ˆ˜ ์—ฐ์‚ฐ์˜ ์ข…๋ฅ˜๋ณ„๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜ ํ‚ค์›Œ๋“œ์™€ ๊ทธ ๋ชฉ์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค:

ํŠน์ˆ˜ ์—ฐ์‚ฐ ํ‚ค์›Œ๋“œ ๋ชฉ์ 
Getter getter ๊ฐ์ฒด๊ฐ€ ํ”„๋กœํผํ‹ฐ ์กฐํšŒ๋ฅผ ์œ„ํ•ด ์ธ๋ฑ์‹ฑ๋  ๋•Œ ๋™์ž‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
Setter setter ๊ฐ์ฒด๊ฐ€ ํ”„๋กœํผํ‹ฐ ํ• ๋‹น ๋˜๋Š” ์ƒ์„ฑ ์‹œ ์ธ๋ฑ์‹ฑ๋  ๋•Œ ๋™์ž‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
Deleter deleter ๊ฐ์ฒด๊ฐ€ ํ”„๋กœํผํ‹ฐ ์‚ญ์ œ๋ฅผ ์œ„ํ•ด ์ธ๋ฑ์‹ฑ๋  ๋•Œ ๋™์ž‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

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

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” getter์™€ setter๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

[Exposed=Window]
interface Dictionary {
  readonly attribute unsigned long propertyCount;

  getter double (DOMString propertyName);
  setter undefined (DOMString propertyName, double propertyValue);
};

ํ”„๋กœํผํ‹ฐ getter์™€ setter๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์—์„œ๋Š”, Dictionary๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ํ•ด๋‹น ํŠน๋ณ„ ๋™์ž‘์„ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋‹ค์Œ ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋™๋“ฑํ•ฉ๋‹ˆ๋‹ค:

[Exposed=Window]
interface Dictionary {
  readonly attribute unsigned long propertyCount;

  getter double getProperty(DOMString propertyName);
  setter undefined setProperty(DOMString propertyName, double propertyValue);
};
[Exposed=Window]
interface Dictionary {
  readonly attribute unsigned long propertyCount;

  double getProperty(DOMString propertyName);
  undefined setProperty(DOMString propertyName, double propertyValue);

  getter double (DOMString propertyName);
  setter undefined (DOMString propertyName, double propertyValue);
};

ํŠน์ • ํŠน์ˆ˜ ํ‚ค์›Œ๋“œ๋Š” ์—ฐ์‚ฐ์—์„œ ๋‘ ๋ฒˆ ์ด์ƒ ๋“ฑ์žฅํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

Getter์™€ setter์—๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: DOMString์„ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์œผ๋กœ ๋ฐ›๋Š” ์ด๋ฆ„ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ getter์™€ ์ด๋ฆ„ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ setter๊ฐ€ ์žˆ๊ณ , unsigned long์„ ํ”„๋กœํผํ‹ฐ ์ธ๋ฑ์Šค๋กœ ๋ฐ›๋Š” ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ getter ๋ฐ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ setter๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. deleter๋Š” ํ•œ ์ข…๋ฅ˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค: ์ด๋ฆ„ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ deleter. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ยงโ€ฏ2.5.6.1 ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ์™€ ยงโ€ฏ2.5.6.2 ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ด๋ฆ„ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ deleter๊ฐ€ ์ตœ๋Œ€ ํ•˜๋‚˜, getter์™€ setter์˜ ๊ฐ ์ข…๋ฅ˜๋„ ์ตœ๋Œ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์— ํŠน์ • ์ข…๋ฅ˜์˜ setter๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ˜๋“œ์‹œ ๊ฐ™์€ ์ข…๋ฅ˜์˜ getter๋„ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ deleter๊ฐ€ ์žˆ์œผ๋ฉด, ๋ฐ˜๋“œ์‹œ ์ด๋ฆ„ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ getter๋„ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ์‚ฐ์œผ๋กœ ์„ ์–ธ๋œ ํŠน์ˆ˜ ์—ฐ์‚ฐ์€ ๊ฐ€๋ณ€ ์ธ์ž(variadic)๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•˜๋ฉฐ, ์˜ต์…˜ ์ธ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ์ฒด๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๋™์ผํ•œ ํŠน์ˆ˜ ์—ฐ์‚ฐ์„ ์ •์˜ํ•œ๋‹ค๋ฉด, ์‹ค์ œ ์–ด๋–ค ํŠน์ˆ˜ ์—ฐ์‚ฐ์ด ํ˜ธ์ถœ๋˜๋Š”์ง€๋Š” ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2.5.6.1. ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ

์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ getter๋ฅผ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ํ™•์žฅํ•ด์„œ, ํ”Œ๋žซํผ ๊ฐ์ฒด๊ฐ€ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•œ๋‹ค๊ณ  ํ•˜๋ ค๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋ฉด, ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์—๋Š” ๊ฐ์ฒด๊ฐ€ ์–ธ์ œ๋“ ์ง€ ์–ด๋–ค ์ธ๋ฑ์Šค๋กœ ์ธ๋ฑ์‹ฑ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ธฐ์ˆ ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด ์ธ๋ฑ์Šค๋“ค์„ ์ง€์›๋˜๋Š” ํ”„๋กœํผํ‹ฐ ์ธ๋ฑ์Šค๋ผ๊ณ  ํ•œ๋‹ค.

์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” "length"๋ผ๋Š” ์ •์ˆ˜ํ˜• ์†์„ฑ์„ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ getter๋Š” ๋ฐ˜๋“œ์‹œ unsigned long ํ•˜๋‚˜์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„์•ผ ํ•œ๋‹ค. ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ setter๋Š” ๋ฐ˜๋“œ์‹œ ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋ฉฐ, ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” unsigned long์ด์–ด์•ผ ํ•œ๋‹ค.

interface interface_identifier {
  getter type identifier(unsigned long identifier);
  setter type identifier(unsigned long identifier, type identifier);

  getter type (unsigned long identifier);
  setter type (unsigned long identifier, type identifier);
};

์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ getter์™€ setter ์ •์˜์—๋Š” ๋‹ค์Œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ ์šฉ๋œ๋‹ค:

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” ์ผ๋ฐ˜ ํ”„๋กœํผํ‹ฐ ์กฐํšŒ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ IDL์„ ๋ณด์ž:

[Exposed=Window]
interface A {
  getter DOMString toWord(unsigned long index);
};

A๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ง€์›๋˜๋Š” ํ”„๋กœํผํ‹ฐ ์ธ๋ฑ์Šค๋ฅผ 0 โ‰ค index < 2๋กœ ๊ฐ€์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , toWord๋Š” ์ธ์ž๋ฅผ ์˜์–ด ๋‹จ์–ด๋กœ ๋ฐ”๊ฟ” ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ•˜์ž. ์ธ๋ฑ์Šค๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ์—ฐ์‚ฐ ํ˜ธ์ถœ๊ณผ ์ง์ ‘ ์ธ๋ฑ์‹ฑ์€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค:

var a = getA();

a.toWord(0);  // "zero" ๋ฐ˜ํ™˜
a[0];         // ์—ญ์‹œ "zero" ๋ฐ˜ํ™˜

a.toWord(5);  // "five" ๋ฐ˜ํ™˜
a[5];         // "5"๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ undefined ๋ฐ˜ํ™˜

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” OrderedMap ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋ฉฐ, ์ด๋ฆ„ ๋˜๋Š” ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋กœ ๊ฐ’์„ ์กฐํšŒ/์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

[Exposed=Window]
interface OrderedMap {
  readonly attribute unsigned long size;

  getter any getByIndex(unsigned long index);
  setter undefined setByIndex(unsigned long index, any value);

  getter any get(DOMString name);
  setter undefined set(DOMString name, any value);
};

๋ชจ๋“  ํŠน์ˆ˜ ์—ฐ์‚ฐ์ด ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•œ ์—ฐ์‚ฐ์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•œ ํ”„๋กœ์ฆˆ๋Š” ์–ด๋–ค ํ‚ค๋“ค์ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์„ค๋ช…๋ฟ์ž…๋‹ˆ๋‹ค. get() ์—ฐ์‚ฐ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์„ ์กฐํšŒํ•  ๋•Œ null์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ •์˜๋œ ๊ฒฝ์šฐ, ์•„๋ž˜ ๋‘ ๋ฌธ์žฅ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค:

OrderedMap์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด map์€ 0 โ‰ค index < map.size ๋ฒ”์œ„์˜ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•œ๋‹ค.

๋˜ํ•œ, get()์— ๋„˜๊ฒผ์„ ๋•Œ null์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  ์ด๋ฆ„์— ๋Œ€ํ•ด ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ๋„ ์ง€์›ํ•œ๋‹ค.

ยงโ€ฏ3.9 ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌํ˜„์—์„œ๋Š” ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด์— OrderedMap ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„/์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ์— ํ•ด๋‹นํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด ํ”„๋กœํผํ‹ฐ๋“ค์€ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

// map์€ OrderedMap ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๊ณ  ๊ฐ€์ •
var map = getOrderedMap();
var x, y;

x = map[0];       // map.length > 0์ด๋ฉด ์•„๋ž˜์™€ ๋™๋“ฑ:
                  // x = map.getByIndex(0)
                  // ์ฆ‰, map์— "0"์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ
                  // ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด x๋Š” undefined

map[1] = false;   // ์•„๋ž˜์™€ ๋™๋“ฑ:
                  // map.setByIndex(1, false)

y = map.apple;    // apple์ด๋ผ๋Š” ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์•„๋ž˜์™€ ๋™๋“ฑ:
                  // y = map.get('apple')
                  // ์—†์œผ๋ฉด y๋Š” undefined

map.berry = 123;  // ์•„๋ž˜์™€ ๋™๋“ฑ:
                  // map.set('berry', 123)

delete map.cake;  // cake๋ผ๋Š” ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ ์‚ญ์ œ ํ›„ ์•„๋ž˜ ๋™๋“ฑ:
                  // map.remove("cake")
2.5.6.2. ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ

์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ getter๋ฅผ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ํ™•์žฅํ•ด์„œ, ํ”Œ๋žซํผ ๊ฐ์ฒด๊ฐ€ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•œ๋‹ค๊ณ  ํ•˜๋ ค๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋ฉด, ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์—๋Š” ๊ฐ์ฒด๋ฅผ ์–ธ์ œ๋“ ์ง€ ์–ด๋–ค ์ด๋ฆ„์œผ๋กœ ์ธ๋ฑ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€(์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ด๋ฆ„ ์ง‘ํ•ฉ) ๊ธฐ์ˆ ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด ์ด๋ฆ„๋“ค์„ ์ง€์›๋˜๋Š” ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ getter์™€ deleter๋Š” ๋ฐ˜๋“œ์‹œ DOMString ํ•˜๋‚˜์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„์•ผ ํ•œ๋‹ค. ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ setter๋Š” ๋ฐ˜๋“œ์‹œ ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋ฉฐ, ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” DOMString์ด์–ด์•ผ ํ•œ๋‹ค.

interface interface_identifier {
  getter type identifier(DOMString identifier);
  setter type identifier(DOMString identifier, type identifier);
  deleter type identifier(DOMString identifier);

  getter type (DOMString identifier);
  setter type (DOMString identifier, type identifier);
  deleter type (DOMString identifier);
};

์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ getter, setter, deleter ์ •์˜์—๋Š” ๋‹ค์Œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ ์šฉ๋œ๋‹ค:

์ฐธ๊ณ : ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ getter, setter ๋˜๋Š” deleter ๊ฐ€ ์—ฐ์‚ฐ์— ์‹๋ณ„์ž๋ฅผ ์จ์„œ ์ง€์ •๋œ ๊ฒฝ์šฐ, ๊ฐ์ฒด๋ฅผ ์ง€์›๋˜๋Š” ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ด ์•„๋‹Œ ์ด๋ฆ„์œผ๋กœ ์ธ๋ฑ์‹ฑํ•  ๋•Œ ํ•ด๋‹น ์—ฐ์‚ฐ์„ ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋“œ์‹œ ๊ฐ™์€ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ์‹ค์ œ ๋™์ž‘์€ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

2.5.7. ์ •์  ์†์„ฑ ๋ฐ ์—ฐ์‚ฐ

์ •์  ์†์„ฑ ๋ฐ ์ •์  ์—ฐ์‚ฐ ์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ • ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด์— ์—ฐ๊ฒฐ๋˜๋Š” ์†์„ฑ/์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค. ์ •์  ์†์„ฑ๊ณผ ์—ฐ์‚ฐ์€ ์„ ์–ธ์— static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ •์  ์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ •์  ์†์„ฑ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ์ธํ„ฐํŽ˜์ด์Šค ์ธ์Šคํ„ด์Šค์—์„œ ๊ฐ€๋Šฅํ•œ์ง€๋Š” ์–ธ์–ด ๋ฐ”์ธ๋”ฉ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

StaticMember ::
    static StaticMemberRest
StaticMemberRest ::
    OptionalReadOnly AttributeRest
    RegularOperation

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” Circle ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์  ์—ฐ์‚ฐ์ด ์„ ์–ธ๋œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:

[Exposed=Window]
interface Point { /* ... */ };

[Exposed=Window]
interface Circle {
  attribute double cx;
  attribute double cy;
  attribute double radius;

  static readonly attribute long triangulationCount;
  static Point triangulate(Circle c1, Circle c2, Circle c3);
};

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” triangulate์˜ ํ•จ์ˆ˜ ๊ฐ์ฒด์™€ triangulationCount์˜ ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๊ฐ€ Circle์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค:

var circles = getCircles();           // Circle ๊ฐ์ฒด ๋ฐฐ์—ด

typeof Circle.triangulate;            // "function" ๋ฐ˜ํ™˜
typeof Circle.triangulationCount;     // "number" ๋ฐ˜ํ™˜
Circle.prototype.triangulate;         // undefined ๋ฐ˜ํ™˜
Circle.prototype.triangulationCount;  // ์—ญ์‹œ undefined ๋ฐ˜ํ™˜
circles[0].triangulate;               // ์ด ์—ญ์‹œ undefined
circles[0].triangulationCount;        // ์ด๊ฒƒ๋„ undefined

// ์ •์  ์—ฐ์‚ฐ ํ˜ธ์ถœ
var triangulationPoint = Circle.triangulate(circles[0], circles[1], circles[2]);

// ์ˆ˜ํ–‰ํ•œ ์‚ผ๊ฐ๋ถ„ํ•  ๊ฐœ์ˆ˜ ํ™•์ธ
window.alert(Circle.triangulationCount);

2.5.8. ์˜ค๋ฒ„๋กœ๋”ฉ

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

์˜ค๋ฒ„๋กœ๋”ฉ๋œ ์—ฐ์‚ฐ ์ง‘ํ•ฉ์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค:

์—ฐ์‚ฐ์€ ์ธํ„ฐํŽ˜์ด์Šค, ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค, ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ, ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ ์ •์˜๋ฅผ ๋„˜๋‚˜๋“ค์–ด ์˜ค๋ฒ„๋กœ๋”ฉ๋  ์ˆ˜ ์—†๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์˜ f์™€ g์— ๋Œ€ํ•œ ์˜ค๋ฒ„๋กœ๋”ฉ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค:

[Exposed=Window]
interface A {
  undefined f();
};

partial interface A {
  undefined f(double x);
  undefined g();
};

partial interface A {
  undefined g(DOMString x);
};

์ฐธ๊ณ ๋กœ ์ƒ์„ฑ์ž ์—ฐ์‚ฐ๊ณผ [LegacyFactoryFunction] ํ™•์žฅ ์†์„ฑ์€ ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์—๋Š” ๋“ฑ์žฅํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์ถ”๊ฐ€๋กœ ๊ธˆ์ง€ํ•  ํ•„์š”๋Š” ์—†๋‹ค.

์œ ํšจ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์€ ํŠน์ • ์—ฐ์‚ฐ, ์ƒ์„ฑ์ž(์ƒ์„ฑ์ž ์—ฐ์‚ฐ ๋˜๋Š” [LegacyFactoryFunction]), ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ํ—ˆ์šฉ๋˜๋Š” ํ˜ธ์ถœ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์œ ํšจ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ ๊ณ„์‚ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ ๋„ค ๊ฐ€์ง€ IDL ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋™์ž‘ํ•˜๋ฉฐ, ๊ฐ ๊ตฌ์กฐ๋งˆ๋‹ค ํ•„์š”ํ•œ ์ž…๋ ฅ์ด ์žˆ๋‹ค:

์ผ๋ฐ˜ ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ
์ •์  ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ
์ƒ์„ฑ์ž์˜ ๊ฒฝ์šฐ
๋ ˆ๊ฑฐ์‹œ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ

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

์•„์ดํ…œ๋“ค์€ ์œ ํšจ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์˜ ํŠœํ”Œ๋กœ, (ํ˜ธ์ถœ ๊ฐ์ฒด, ํƒ€์ž… ๋ฆฌ์ŠคํŠธ, ์˜ต์…”๋„๋ฆฌํ‹ฐ ๋ฆฌ์ŠคํŠธ) ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค. ์•„๋ž˜์— ๊ฐ ์•„์ดํ…œ ์„ค๋ช…:

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

์•„๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์œ ํšจ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค. ๋‹ค์Œ ์ž…๋ ฅ ๋ณ€์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•œ๋‹ค(ํ•„์š”ํ•œ ๊ฒฝ์šฐ):

ํ™•์žฅ ์†์„ฑ์˜ ์ธ์ž๋ž€, ํ™•์žฅ ์†์„ฑ์˜ ๋ช…๋ช…๋œ ์ธ์ž ๋ฆฌ์ŠคํŠธ์˜ ์ธ์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  1. S๋ฅผ ์ˆœ์„œ ์žˆ๋Š” ์ง‘ํ•ฉ์œผ๋กœ ๋‘”๋‹ค.

  2. F๋ฅผ ์ˆœ์„œ ์žˆ๋Š” ์ง‘ํ•ฉ์œผ๋กœ ๋‘”๋‹ค. ์•„์ดํ…œ์€ ์œ ํšจ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

    ์ผ๋ฐ˜ ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ

    F์˜ ์š”์†Œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค I์— ์ •์˜๋œ A ์‹๋ณ„์ž์˜ ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ด๋‹ค.

    ์ •์  ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ

    F์˜ ์š”์†Œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค I์— ์ •์˜๋œ A ์‹๋ณ„์ž์˜ ์ •์  ์—ฐ์‚ฐ์ด๋‹ค.

    ์ƒ์„ฑ์ž์˜ ๊ฒฝ์šฐ

    F์˜ ์š”์†Œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค I์˜ ์ƒ์„ฑ์ž ์—ฐ์‚ฐ์ด๋‹ค.

    ๋ ˆ๊ฑฐ์‹œ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ

    F์˜ ์š”์†Œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค I์— ์ •์˜๋œ [LegacyFactoryFunction] ํ™•์žฅ ์†์„ฑ ์ค‘ ๋ช…๋ช…๋œ ์ธ์ž ๋ฆฌ์ŠคํŠธ์˜ ์‹๋ณ„์ž๊ฐ€ A์ธ ๊ฒƒ๋“ค์ด๋‹ค.

  3. maxarg๋ฅผ F์˜ ์—ฐ์‚ฐ, ๋ ˆ๊ฑฐ์‹œ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ์„ ์–ธ๋œ ์ตœ๋Œ€ ์ธ์ž ๊ฐœ์ˆ˜๋กœ ๋‘”๋‹ค. ๊ฐ€๋ณ€ ์ธ์ž ์—ฐ์‚ฐ ๋ฐ ๋ ˆ๊ฑฐ์‹œ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜์—์„œ, ...์ด ๋ถ™์€ ์ธ์ž๋Š” 1๊ฐœ๋กœ ์„ผ๋‹ค.

    ์ฐธ๊ณ : undefined f(long x, long... y);๋Š” ์ธ์ž 2๊ฐœ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

  4. max๋ฅผ max(maxarg, N)๋กœ ๋‘”๋‹ค.

  5. ๊ฐ F์˜ ์—ฐ์‚ฐ ๋˜๋Š” ํ™•์žฅ ์†์„ฑ X์— ๋Œ€ํ•ด:

    1. arguments๋ฅผ X์— ์„ ์–ธ๋œ ์ธ์ž๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋‘”๋‹ค.

    2. n์„ arguments์˜ ํฌ๊ธฐ๋กœ ๋‘”๋‹ค.

    3. types๋ฅผ ํƒ€์ž… ๋ฆฌ์ŠคํŠธ๋กœ ๋‘”๋‹ค.

    4. optionalityValues๋ฅผ ์˜ต์…”๋„๋ฆฌํ‹ฐ ๋ฆฌ์ŠคํŠธ๋กœ ๋‘”๋‹ค.

    5. ๊ฐ arguments์˜ argument์— ๋Œ€ํ•ด:

      1. types์— argument์˜ ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

      2. optionalityValues์—, argument๊ฐ€ ๋งˆ์ง€๋ง‰ ๊ฐ€๋ณ€ ์ธ์ž๋ฉด "variadic", ์˜ต์…˜ ์ธ์ž๋ฉด "optional", ๊ทธ ์™ธ๋Š” "required"๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

    6. S์— (X, types, optionalityValues) ํŠœํ”Œ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

    7. X๊ฐ€ ๊ฐ€๋ณ€ ์ธ์ž๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด:

      1. ๊ฐ i์— ๋Œ€ํ•ด, ๋ฒ”์œ„ n๋ถ€ํ„ฐ max๊นŒ์ง€(๋๊ฐ’ ์ œ์™ธ):

        1. t๋ฅผ ํƒ€์ž… ๋ฆฌ์ŠคํŠธ๋กœ ๋‘”๋‹ค.

        2. o๋ฅผ ์˜ต์…”๋„๋ฆฌํ‹ฐ ๋ฆฌ์ŠคํŠธ๋กœ ๋‘”๋‹ค.

        3. ๊ฐ j์— ๋Œ€ํ•ด, ๋ฒ”์œ„ 0๋ถ€ํ„ฐ n๊นŒ์ง€, ๋๊ฐ’ ์ œ์™ธ:

          1. t์— types[j]๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

          2. o์— optionalityValues[j]๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

        4. ๊ฐ j์— ๋Œ€ํ•ด, ๋ฒ”์œ„ n๋ถ€ํ„ฐ i๊นŒ์ง€, ๋๊ฐ’ ํฌํ•จ:

          1. t์— types[nโˆ’1]๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

          2. o์— "variadic"์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

        5. S์— (X, t, o) ํŠœํ”Œ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

    8. i๋ฅผ nโˆ’1๋กœ ๋‘”๋‹ค.

    9. i โ‰ฅ 0์ธ ๋™์•ˆ:

      1. arguments[i]๊ฐ€ ์˜ต์…˜ ์ธ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด break.

      2. t๋ฅผ ํƒ€์ž… ๋ฆฌ์ŠคํŠธ๋กœ ๋‘”๋‹ค.

      3. o๋ฅผ ์˜ต์…”๋„๋ฆฌํ‹ฐ ๋ฆฌ์ŠคํŠธ๋กœ ๋‘”๋‹ค.

      4. ๊ฐ j์— ๋Œ€ํ•ด, ๋ฒ”์œ„ 0๋ถ€ํ„ฐ i๊นŒ์ง€, ๋๊ฐ’ ์ œ์™ธ:

        1. t์— types[j]๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

        2. o์— optionalityValues[j]๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

      5. S์— (X, t, o) ํŠœํ”Œ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

        ์ฐธ๊ณ : i๊ฐ€ 0์ด๋ฉด S์— (X, ยซ ยป, ยซ ยป) (์—ฌ๊ธฐ์„œ "ยซ ยป"๋Š” ๋นˆ ๋ฆฌ์ŠคํŠธ)๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

      6. i๋ฅผ iโˆ’1๋กœ ๋‘”๋‹ค.

  6. S๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด:

[Exposed=Window]
interface A {
  /* f1 */ undefined f(DOMString a);
  /* f2 */ undefined f(Node a, DOMString b, double... c);
  /* f3 */ undefined f();
  /* f4 */ undefined f(Event a, DOMString b, optional DOMString c, double... d);
};

Node์™€ Event๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ, ์–ด๋–ค ๊ฐ์ฒด๋„ ๋‘˜ ๋‹ค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ์ผ๋ฐ˜ ์—ฐ์‚ฐ์˜ ์‹๋ณ„์ž f์™€ ์ธ์ž ๊ฐœ์ˆ˜ 4์— ๋Œ€ํ•ด ์œ ํšจ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

ยซ
  (f1, ยซ DOMString ยป,                           ยซ required ยป),
  (f2, ยซ Node, DOMString ยป,                     ยซ required, required ยป),
  (f2, ยซ Node, DOMString, double ยป,             ยซ required, required, variadic ยป),
  (f2, ยซ Node, DOMString, double, double ยป,     ยซ required, required, variadic, variadic ยป),
  (f3, ยซ ยป,                                     ยซ ยป),
  (f4, ยซ Event, DOMString ยป,                    ยซ required, required ยป),
  (f4, ยซ Event, DOMString, DOMString ยป,         ยซ required, required, optional ยป),
  (f4, ยซ Event, DOMString, DOMString, double ยป, ยซ required, required, optional, variadic ยป)
ยป

๋‘ ํƒ€์ž…์ด ๊ตฌ๋ณ„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

  1. ํ•œ ํƒ€์ž…์ด ๋„ ํ—ˆ์šฉ ํƒ€์ž…์„ ํฌํ•จํ•˜๊ณ , ๋‹ค๋ฅธ ํƒ€์ž…์ด ๋„ ํ—ˆ์šฉ ํƒ€์ž…์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜, ์œ ๋‹ˆ์˜จ ํƒ€์ž…์ด๋ฉฐ ํ‰ํƒ„ํ™”๋œ ๋ฉค๋ฒ„ ํƒ€์ž…์— ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์ด ํฌํ•จ๋˜๊ฑฐ๋‚˜, ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์ด๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์•„๋ž˜ ์Œ๋“ค์€ ๊ตฌ๋ณ„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค:
  2. ๋‘ ํƒ€์ž… ๋ชจ๋‘ ์œ ๋‹ˆ์˜จ ํƒ€์ž… ๋˜๋Š” ๋„ ํ—ˆ์šฉ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์ด๋ฉด, ๊ฐ ๋ฉค๋ฒ„ ํƒ€์ž…์ด ์„œ๋กœ ๊ตฌ๋ณ„ ๊ฐ€๋Šฅํ•˜๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. ํ•œ ํƒ€์ž…์ด ์œ ๋‹ˆ์˜จ ํƒ€์ž… ๋˜๋Š” ๋„ ํ—ˆ์šฉ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์ด๋ฉด, ์œ ๋‹ˆ์˜จ ํƒ€์ž…์˜ ๊ฐ ๋ฉค๋ฒ„ ํƒ€์ž…์ด ๋น„์œ ๋‹ˆ์˜จ ํƒ€์ž…๊ณผ ๊ตฌ๋ณ„ ๊ฐ€๋Šฅํ•˜๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. ๊ฐ ํƒ€์ž…์˜ ๋‚ด๋ถ€ ํƒ€์ž…(์ฃผ์„ ํƒ€์ž…์ด๋ฉด)๊ณผ ๋‚ด๋ถ€ ํƒ€์ž…(๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋„ ํ—ˆ์šฉ ํƒ€์ž…์ด๋ฉด)์„ ์ทจํ•œ "๊ฐ€์žฅ ์•ˆ์ชฝ" ํƒ€์ž…์„ ๊ณ ๋ คํ•œ๋‹ค. ์ด ๋‘ ํƒ€์ž…์ด ์•„๋ž˜ ํ‘œ์˜ ์นดํ…Œ๊ณ ๋ฆฌ์— ์†ํ•˜๊ณ , ํ•ด๋‹น ๊ต์ฐจ์ ์— โ— ๋˜๋Š” ์ง€์ •๋œ ์กฐ๊ฑด(a, b, c, d)์ด ๋งŒ์กฑ๋˜๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์นดํ…Œ๊ณ ๋ฆฌ:

    interface-like
    dictionary-like
    sequence-like
    undefined
    boolean
    numeric types
    bigint
    string types
    object
    symbol
    interface-like
    callback function
    dictionary-like
    async sequence
    sequence-like
    undefined โ— โ— โ— โ— โ— โ— โ— โ— โ— โ—
    boolean โ— โ— โ— โ— โ— โ— โ— โ— โ— โ—
    numeric types (b) โ— โ— โ— โ— โ— โ— โ— โ—
    bigint โ— โ— โ— โ— โ— โ— โ— โ—
    string types โ— โ— โ— โ— โ— (d) โ—
    object โ—
    symbol โ— โ— โ— โ— โ—
    interface-like (a) โ— โ— โ— โ—
    callback function (c) โ— โ—
    dictionary-like โ— โ— โ—
    async sequence
    sequence-like
    1. ์‹๋ณ„๋œ ๋‘ interface-like ํƒ€์ž…์ด ์„œ๋กœ ๋‹ค๋ฅด๊ณ , ์–ด๋–ค ํ”Œ๋žซํผ ๊ฐ์ฒด๋„ ๋‘ ํƒ€์ž…์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

    3. [LegacyTreatNonObjectAsNull] ํ™•์žฅ ์†์„ฑ์ด ์—†๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” dictionary-like ์นดํ…Œ๊ณ ๋ฆฌ ํƒ€์ž…๊ณผ ๊ตฌ๋ณ„ ๊ฐ€๋Šฅํ•˜๋‹ค.

      ์˜ˆ๋ฅผ ๋“ค์–ด, ECMAScript ๊ฐ’์„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์™€ ๋”•์…”๋„ˆ๋ฆฌ-like ํƒ€์ž…์„ ํฌํ•จํ•˜๋Š” ์œ ๋‹ˆ์˜จ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, ๊ฐ’์ด ํ˜ธ์ถœ ๊ฐ€๋Šฅ์ด๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ, ์•„๋‹ˆ๋ฉด ๋”•์…”๋„ˆ๋ฆฌ-like ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
    4. ํƒ€์ž…์€ ๊ตฌ๋ณ„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ฌธ์ž์—ด ํƒ€์ž… ์ด ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์ด๋‚˜ ์œ ๋‹ˆ์˜จ์—๋„ ์žˆ์œผ๋ฉด ECMAScript ๊ฐ’์—์„œ ๋ณ€ํ™˜ํ•  ๋•Œ ๋ฌธ์ž์—ด ๊ฐ์ฒด ๋Š” ๋น„๋™๊ธฐ ์‹œํ€€์Šค ํƒ€์ž… ์œผ๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค( %Symbol.iterator% ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋”๋ผ๋„).

    double ๊ณผ DOMString ์€ ์ˆซ์ž ํƒ€์ž…๊ณผ ๋ฌธ์ž์—ด ํƒ€์ž… ๊ต์ฐจ์ ์— โ—์ด ์žˆ์œผ๋ฏ€๋กœ ๊ตฌ๋ณ„ ๊ฐ€๋Šฅํ•˜๋‹ค.
    double ๊ณผ long์€ ๋ชจ๋‘ ์ˆซ์ž ํƒ€์ž…์ด๋ฏ€๋กœ, ์ˆซ์ž ํƒ€์ž…๊ณผ ์ˆซ์ž ํƒ€์ž…์˜ ๊ต์ฐจ์ ์— โ—์ด๋‚˜ ๋ฌธ์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ตฌ๋ณ„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๋•Œ:
    callback interface CBIface {
        undefined handle();
    };
    
    [Exposed=Window]
    interface Iface {
        attribute DOMString attr2;
    };
    
    dictionary Dict {
        DOMString field1;
    };
    

    CBIface๋Š” Iface์™€๋Š” ๊ตฌ๋ณ„ ๊ฐ€๋Šฅํ•˜๋‹ค(๋”•์…”๋„ˆ๋ฆฌ-like์™€ ์ธํ„ฐํŽ˜์ด์Šค-like ๊ต์ฐจ์ ์— โ—์ด ์žˆ์Œ). ํ•˜์ง€๋งŒ Dict์™€๋Š” ๊ตฌ๋ณ„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค(๋”•์…”๋„ˆ๋ฆฌ-like ๊ต์ฐจ์ ์— โ— ์—†์Œ).

    ํ”„๋ผ๋ฏธ์Šค ํƒ€์ž…์€ ์œ„ ํ‘œ์— ์—†์œผ๋ฏ€๋กœ, ์–ด๋–ค ๋‹ค๋ฅธ ํƒ€์ž…๊ณผ๋„ ๊ตฌ๋ณ„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

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

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

์•ž ์˜ˆ์‹œ์˜ ์œ ํšจ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž. type list๊ฐ€ 2, 3, 4์ธ ์•„์ดํ…œ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋‹ค. ๊ฐ type list ํฌ๊ธฐ๋ณ„๋กœ ๊ตฌ๋ณ„ ์ธ์ž ์ธ๋ฑ์Šค๋Š” 0์ด๋‹ค. Node์™€ Event๊ฐ€ ๊ตฌ๋ณ„ ๊ฐ€๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฒ„๋กœ๋”ฉ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค:

[Exposed=Window]
interface B {
  undefined f(DOMString x);
  undefined f(USVString x);
};

DOMString ๊ณผ USVString ์€ ๊ตฌ๋ณ„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ, ์–ด๋–ค type list ํฌ๊ธฐ์˜ ๊ตฌ๋ณ„ ์ธ์ž ์ธ๋ฑ์Šค๋ณด๋‹ค ์ž‘์€ ์ธ๋ฑ์Šค j์— ๋Œ€ํ•ด, ๋ชจ๋“  ์•„์ดํ…œ์˜ type list์—์„œ j๋ฒˆ์งธ ํƒ€์ž…์ด ๊ฐ™์•„์•ผ ํ•˜๋ฉฐ, ๋ชจ๋“  ์•„์ดํ…œ์˜ optionality list์—์„œ j๋ฒˆ์งธ optionality ๊ฐ’๋„ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

๋‹ค์Œ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค:

[Exposed=Window]
interface B {
  /* f1 */ undefined f(DOMString w);
  /* f2 */ undefined f(long w, double x, Node y, Node z);
  /* f3 */ undefined f(double w, double x, DOMString y, Node z);
};

์ธ์ž ๊ฐœ์ˆ˜ 4์—์„œ์˜ ์œ ํšจ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค:

ยซ
  (f1, ยซ DOMString ยป,                       ยซ required ยป),
  (f2, ยซ long, double, Node, Node ยป,        ยซ required, required, required, required ยป),
  (f3, ยซ double, double, DOMString, Node ยป, ยซ required, required, required, required ยป)
ยป

type list ํฌ๊ธฐ๊ฐ€ 4์ธ ์•„์ดํ…œ๋“ค์—์„œ, ๊ตฌ๋ณ„ ์ธ์ž ์ธ๋ฑ์Šค ๋Š” 2์ด๋‹ค. Node์™€ DOMString ์ด ๊ตฌ๋ณ„ ๊ฐ€๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋‘ ์˜ค๋ฒ„๋กœ๋“œ์˜ 0๋ฒˆ์งธ ์ธ์ž ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฏ€๋กœ, ์˜ค๋ฒ„๋กœ๋”ฉ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

2.5.8.1. ์˜ค๋ฒ„๋กœ๋”ฉ vs. ์œ ๋‹ˆ์˜จ ํƒ€์ž…

์ด ์„น์…˜์€ ์ฐธ๊ณ ์šฉ์ž…๋‹ˆ๋‹ค.

IDL ์—ฐ์‚ฐ์„ ์ •์˜ํ•˜๋Š” ๋ช…์„ธ์—์„œ, ์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ์œ ๋‹ˆ์˜จ ํƒ€์ž…, ์˜ต์…˜ ์ธ์ž ์กฐํ•ฉ์ด ๊ธฐ๋Šฅ์ ์œผ๋กœ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์–ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์˜ค๋ฒ„๋กœ๋”ฉ์€ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์ด๋‚˜ ์˜ต์…˜ ์ธ์ž์™€๋Š” ๋™์ž‘์ด ๋‹ค๋ฅด๋ฉฐ, ํ•˜๋‚˜๋กœ ์™„์ „ํžˆ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๋‹ค(๋ฌผ๋ก  ์ถ”๊ฐ€์ ์ธ ํ”„๋กœ์ฆˆ๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ด๋Š” Web IDL ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ๋ชฉ์ ์— ์–ด๊ธ‹๋‚œ๋‹ค). ์˜ˆ๋ฅผ ๋“ค์–ด stroke() ์—ฐ์‚ฐ์ด CanvasDrawPath ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•˜์ž [HTML]:

interface CanvasDrawPathExcerpt {
  undefined stroke();
  undefined stroke(Path2D path);
};

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š”, stroke(undefined)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‘ ๋ฒˆ์งธ ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์„ ํƒ๋˜๋ฉฐ, TypeError ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. undefined๊ฐ€ Path2D๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ์‚ฐ์ด ์˜ต์…˜ ์ธ์ž๋กœ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง„๋‹ค๋ฉด,

interface CanvasDrawPathExcerptOptional {
  undefined stroke(optional Path2D path);
};

์˜ค๋ฒ„๋กœ๋“œ ๊ฒฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ path ์ธ์ž๋ฅผ ๋ˆ„๋ฝ๋œ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ์˜ˆ์‹œ์—์„œ ํ›„์ž์˜ ๋™์ž‘์ด ์‹ค์ œ๋กœ Web ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. CanvasDrawPath ๋ฅผ ์ƒˆ๋กœ ์„ค๊ณ„ํ•œ๋‹ค๋ฉด ์˜ต์…˜ ์ธ์ž๋กœ stroke()๋ฅผ ์ •์˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜๋„ ์–ด๋–ค IDL ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ• ์ง€ ์–ด๋ ค์šธ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ถŒ๊ณ ์™€ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”:

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

๋ช…์„ธ๋Š” ํ•„์š”ํ•˜๋‹ค๋ฉด ์œ ๋‹ˆ์˜จ ํƒ€์ž…๊ณผ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ˜ผํ•ฉํ•ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

2.5.9. ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”๋กœ ์„ ์–ธ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ณธ๋ฌธ์— ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ(Iterable์— ์ผ์น˜)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•œ๋‹ค.

interface interface_identifier {
  iterable<value_type>;
  iterable<key_type, value_type>;
};

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ดํ„ฐ๋Ÿฌ๋ธ”๋กœ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋Š” ๊ฐ’์„ ์‹œํ€€์Šค๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ๋ฐ˜๋ณต(iterate)ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์— entries, forEach, keys, values, %Symbol.iterator% ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค.

ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•˜๋‚˜๋ฉด ๊ฐ’ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์ด๋ฉฐ, ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ’์„ ์ œ๊ณตํ•œ๋‹ค. ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋‘˜์ด๋ฉด ์Œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์ด๋ฉฐ, ๊ฐ’ ์Œ์„ ์ œ๊ณตํ•œ๋‹ค.

๊ฐ’ ์Œ์€ ํ‚ค ํƒ€์ž…๊ณผ ๊ฐ’ ํƒ€์ž…์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‘ ๊ฐœ์˜ ๊ตฌ์กฐ์ฒด ์•„์ดํ…œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค:

  1. ์•„์ดํ…œ์˜ ์ด๋ฆ„์ด "key"์ด๊ณ , ๊ฐ’ ์Œ์˜ ํ‚ค๋ผ ํ•˜๋ฉฐ, ๊ฐ’์€ ํ‚ค ํƒ€์ž…์˜ IDL ๊ฐ’์ด๋‹ค;

  2. ์•„์ดํ…œ์˜ ์ด๋ฆ„์ด "value"์ด๊ณ , ๊ฐ’ ์Œ์˜ ๊ฐ’์ด๋ผ ํ•˜๋ฉฐ, ๊ฐ’์€ ๊ฐ’ ํƒ€์ž…์˜ IDL ๊ฐ’์ด๋‹ค.

๊ฐ’ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋ฐ˜๋“œ์‹œ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์„ ์–ธ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ’ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ value-type์€ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ getter๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํƒ€์ž…๊ณผ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ๊ฐ’ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐ˜๋ณต(iterate)ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•”๋ฌต์ ์œผ๋กœ ์ •์˜๋œ๋‹ค.

์Œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋  ์ˆ˜ ์—†๋‹ค.

ํŽ˜์–ด ๋ฐ˜๋ณต์ž๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ’ ์Œ์˜ ํ˜•ํƒœ๋กœ ์ •์˜ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด ๋ฆฌ์ŠคํŠธ๋Š” ๋ฐ˜๋ณตํ•  ๊ฐ’ ์Œ์ž…๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ’ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ forEach ๋ฉ”์„œ๋“œ๋Š” Array.prototype.forEach์ฒ˜๋Ÿผ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜๊ณ , ์Œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ forEach๋Š” Map.prototype.forEach์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•œ๋‹ค.

๊ฐ’ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ํ˜„์žฌ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ํ—ˆ์šฉ๋˜๋ฏ€๋กœ Array ์Šคํƒ€์ผ forEach๊ฐ€ ์ ํ•ฉํ•˜๋‹ค. ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋‚˜, Set.prototype.forEach์ฒ˜๋Ÿผ key์™€ value๊ฐ€ ๊ฐ™์€ forEach๊ฐ€ ํ•„์š”ํ•œ ๊ฐ’์„ ๋ฐ˜๋ณตํ•˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, ์ด์Šˆ๋ฅผ ๋“ฑ๋กํ•ด ์ฃผ์„ธ์š”.

์ฐธ๊ณ : ์ด๋Š” array ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด ๋™์ž‘ ๋ฐฉ์‹์ด๋‹ค. ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ, entries, keys, values, %Symbol.iterator% ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋Š” ์‹ค์ œ array ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์ด๋‹ค.

์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” "entries", "forEach", "keys", "values"๋ผ๋Š” ์ด๋ฆ„์˜ ์†์„ฑ, ์ƒ์ˆ˜, ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ด ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ์ด ์ด๋ฆ„์˜ ์†์„ฑ, ์ƒ์ˆ˜, ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ด ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

๋‹ค์Œ SessionManager ์ธํ„ฐํŽ˜์ด์Šค๋Š” username์„ ํ‚ค๋กœ Session ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค:

[Exposed=Window]
interface SessionManager {
  Session getSessionForUser(DOMString username);

  iterable<DOMString, Session>;
};

[Exposed=Window]
interface Session {
  readonly attribute DOMString username;
  // ...
};

์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ๋™์ž‘์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ •์˜๋  ์ˆ˜ ์žˆ๋‹ค:

๋ฐ˜๋ณตํ•  ๊ฐ’ ์Œ์€ username์„ key, ํ•ด๋‹น username์— ๋Œ€์‘ํ•˜๋Š” SessionManager ๊ฐ์ฒด์˜ ์—ด๋ฆฐ Session ๊ฐ์ฒด๋ฅผ value๋กœ ํ•˜์—ฌ, username ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ๊ฐ’ ์Œ ๋ฆฌ์ŠคํŠธ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ SessionManager ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” values ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๊ณ , ์ด ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ ์‹œ ๋‹ค์Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” next ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. keys์™€ entries ๋ฉ”์„œ๋“œ๋Š” ๊ฐ๊ฐ session ๊ฐ์ฒด์˜ username, username/Session ๊ฐ์ฒด ์Œ์„ ๋ฐ˜๋ณตํ•œ๋‹ค. %Symbol.iterator% ๋ฉ”์„œ๋“œ๋„ ์žˆ์–ด์„œ SessionManager๋ฅผ for..of ๋ฃจํ”„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, entries์™€ ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜๋ณตํ•œ๋‹ค:

// SessionManager ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๋Š”๋‹ค.
// ์˜ˆ๋ฅผ ๋“ค์–ด "anna", "brian" ์œ ์ € ์„ธ์…˜์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •.
var sm = getSessionManager();

typeof SessionManager.prototype.values;            // "function" ๋ฐ˜ํ™˜
var it = sm.values();                              // values()๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด ๋ฐ˜ํ™˜
String(it);                                        // "[object SessionManager Iterator]" ๋ฐ˜ํ™˜
typeof it.next;                                    // "function" ๋ฐ˜ํ™˜

// ์•„๋ž˜ ๋ฃจํ”„๋Š” "anna", "brian"์„ ๋กœ๊ทธํ•œ๋‹ค.
for (;;) {
  let result = it.next();
  if (result.done) {
    break;
  }
  let session = result.value;
  console.log(session.username);
}

// ์ด๊ฒƒ๋„ "anna", "brian"์„ ๋กœ๊ทธํ•œ๋‹ค.
for (let username of sm.keys()) {
  console.log(username);
}

// ์•„๋ž˜๋„ ๋™์ผํ•˜๋‹ค.
for (let [username, session] of sm) {
  console.log(username);
}

์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ํ•˜๋‚˜์˜ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค. ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ์œผ๋ฉด ์•ˆ ๋œ๋‹ค. ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ทธ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” maplike ์„ ์–ธ, setlike ์„ ์–ธ, ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ํ™•์žฅ ์†์„ฑ: [CrossOriginIsolated], [Exposed], [SecureContext].

Iterable ::
    iterable < TypeWithExtendedAttributes OptionalType > ;
OptionalType ::
    , TypeWithExtendedAttributes
    ฮต

2.5.10. ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋น„๋™๊ธฐ ๋ฐ˜๋ณต ์„ ์–ธ (AsyncIterable๊ณผ ์ผ์น˜) ์„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ณธ๋ฌธ์— ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

interface interface_identifier {
  async_iterable<value_type>;
  async_iterable<value_type>(/* arguments... */);
  async_iterable<key_type, value_type>;
  async_iterable<key_type, value_type>(/* arguments... */);
};

๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ”๋กœ ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋Š” ๊ฐ’์„ ๋น„๋™๊ธฐ๋กœ ๋ฐ˜๋ณต(iterate)ํ•ด์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•˜๋‚˜๋ฉด ๊ฐ’ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด๋ฉฐ, ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ’์„ ๋น„๋™๊ธฐ๋กœ ์ œ๊ณตํ•œ๋‹ค. ๋‘ ๊ฐœ๋ฉด ์Œ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด๋ฉฐ, ๊ฐ’ ์Œ์„ ๋น„๋™๊ธฐ๋กœ ์ œ๊ณตํ•œ๋‹ค.

์ธ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์˜ ์ธ์ž(ArgumentList์— ์ผ์น˜)๋Š” ๋ชจ๋‘ ์˜ต์…˜ ์ธ์ž์—ฌ์•ผ ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ, ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” %Symbol.asyncIterator% ์™€ values ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค. ์Œ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด๋ฉด entries, keys ํ”„๋กœํผํ‹ฐ๋„ ์žˆ๋‹ค. ์ด ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ์˜ต์…˜ ์ธ์ž๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ „๋‹ฌ๋œ ์ธ์ž๋Š” ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์˜ ์ธ์ž ๋ฆฌ์ŠคํŠธ์— ๋Œ€์‘ํ•˜๋ฉฐ, ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.

์ด ์š”๊ตฌ์กฐ๊ฑด ๋•๋ถ„์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ for-await-of๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ์ธ์Šคํ„ด์Šค์— ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค. for-await-of๋Š” %Symbol.asyncIterator%๋ฅผ ์ธ์ž ์—†์ด ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ”„๋กœ์ฆˆ์—๋Š” ๋‹ค์Œ ๋ฐ˜๋ณต ๊ฒฐ๊ณผ ์–ป๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋ณต ์ค‘์ธ ์ธํ„ฐํŽ˜์ด์Šค ์ธ์Šคํ„ด์Šค์™€ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ›์œผ๋ฉฐ(์ƒํƒœ ์ €์žฅ์— ์œ ์šฉ), Promise๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. ์ด Promise๋Š” reject๋˜๊ฑฐ๋‚˜, ๋ฐ˜๋ณต ์ข…๋ฃŒ ์‹ ํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ˜๋ณต ์ข…๋ฃŒ ๊ฐ’์„ resolveํ•˜๊ฑฐ๋‚˜, ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ฅผ resolveํ•œ๋‹ค:

๊ฐ’ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์˜ ๊ฒฝ์šฐ:

์„ ์–ธ๋œ ํƒ€์ž…์˜ ๊ฐ’

์Œ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์˜ ๊ฒฝ์šฐ:

์„ ์–ธ๋œ ๋‘ ํƒ€์ž…์˜ ๊ฐ’์„ ํฌํ•จํ•˜๋Š” ํŠœํ”Œ

๋˜ํ•œ ํ”„๋กœ์ฆˆ์—์„œ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฐ˜ํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋ณต ์ค‘์ธ ์ธํ„ฐํŽ˜์ด์Šค ์ธ์Šคํ„ด์Šค, ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด, any ํƒ€์ž…์˜ ์ธ์ž ํ•˜๋‚˜๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ด๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์ค‘๋‹จ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋ฉฐ, Promise๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ, fulfill๋˜๋ฉด ๊ฐ’์€ ๋ฌด์‹œ๋˜๊ณ , reject๋˜๋ฉด ์—๋Ÿฌ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด async iterator์˜ return()์ด ํ˜ธ์ถœ๋  ๋•Œ ๋™์ž‘์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” break๋‚˜ return์œผ๋กœ for-await-of ๋ฃจํ”„๋ฅผ ๋น ์ ธ๋‚˜๊ฐˆ ๋•Œ ๊ฐ€์žฅ ํ”ํžˆ ๋ฐœ์ƒํ•œ๋‹ค.

throw()์— ๋Œ€ํ•œ ์œ ์‚ฌํ•œ hook๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ๊นŒ์ง€ ํ•„์š”๊ฐ€ ์—†์—ˆ์ง€๋งŒ, ๊ทธ๋Ÿฐ API๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด์Šˆ๋ฅผ ๋“ฑ๋กํ•ด ์ฃผ์„ธ์š”.

๋˜ํ•œ ํ”„๋กœ์ฆˆ์—์„œ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋ฐ˜๋ณต ์ค‘์ธ ์ธํ„ฐํŽ˜์ด์Šค ์ธ์Šคํ„ด์Šค, ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด, ์ „๋‹ฌ๋œ ์ธ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” IDL ๊ฐ’ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›๋Š”๋‹ค.

๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” "entries", "keys", "values"๋ผ๋Š” ์ด๋ฆ„์˜ ์†์„ฑ, ์ƒ์ˆ˜, ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ด ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ์ด ์ด๋ฆ„์˜ ์†์„ฑ, ์ƒ์ˆ˜, ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ด ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

๋‹ค์Œ SessionManager ์ธํ„ฐํŽ˜์ด์Šค๋Š” username์„ ํ‚ค๋กœ Session ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค:

[Exposed=Window]
interface SessionManager {
  Session getSessionForUser(DOMString username);

  async_iterable<DOMString, Session>;
};

[Exposed=Window]
interface Session {
  readonly attribute DOMString username;
  // ...
};

์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ๋™์ž‘์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ •์˜๋  ์ˆ˜ ์žˆ๋‹ค:

SessionManager ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ iterator์˜ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„:

  1. iterator์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ "์•„์ง ์‹œ์ž‘ํ•˜์ง€ ์•Š์Œ"์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

SessionManager manager์™€ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ iterator์— ๋Œ€ํ•ด ๋‹ค์Œ ๋ฐ˜๋ณต ๊ฒฐ๊ณผ ์–ป๊ธฐ:

  1. promise๋ฅผ ์ƒˆ Promise๋กœ ๋‘”๋‹ค.

  2. key๋ฅผ ๋‹ค์Œ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค(์—†์œผ๋ฉด null):

    ๋งŒ์•ฝ iterator์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ "์•„์ง ์‹œ์ž‘ํ•˜์ง€ ์•Š์Œ"์ด๋ผ๋ฉด

    manager์˜ ์—ด๋ฆฐ ์„ธ์…˜ ์ค‘ username์ด ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’(์‚ฌ์ „์ˆœ)

    ๊ทธ ์™ธ

    manager์˜ ์—ด๋ฆฐ ์„ธ์…˜ ์ค‘ iterator์˜ ํ˜„์žฌ ์ƒํƒœ๋ณด๋‹ค ํฐ username ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’(์‚ฌ์ „์ˆœ)

    ์ฐธ๊ณ : iterator์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ์ด๋ฏธ ์—ด๋ฆฐ ์„ธ์…˜์— ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.

  3. key๊ฐ€ null์ด๋ฉด:

    1. promise๋ฅผ ๋ฐ˜๋ณต ์ข…๋ฃŒ๋กœ resolveํ•œ๋‹ค.

  4. ๊ทธ ์™ธ:

    1. session์„ key์— ๋Œ€์‘ํ•˜๋Š” Session ๊ฐ์ฒด๋กœ ๋‘”๋‹ค.

    2. promise๋ฅผ (username, session)๋กœ resolveํ•œ๋‹ค.

    3. iterator์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ username์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ SessionManager ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” values ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๊ณ , ์ด ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ ์‹œ ๋‹ค์Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” next ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. keys์™€ entries ๋ฉ”์„œ๋“œ๋Š” ๊ฐ๊ฐ session ๊ฐ์ฒด์˜ username, username/Session ๊ฐ์ฒด ์Œ์„ ๋ฐ˜๋ณตํ•œ๋‹ค. %Symbol.asyncIterator% ๋ฉ”์„œ๋“œ๋„ ์žˆ์–ด์„œ SessionManager๋ฅผ for await..of ๋ฃจํ”„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, entries์™€ ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜๋ณตํ•œ๋‹ค:

// SessionManager ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๋Š”๋‹ค.
// ์˜ˆ๋ฅผ ๋“ค์–ด "anna", "brian" ์œ ์ € ์„ธ์…˜์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •.
var sm = getSessionManager();

typeof SessionManager.prototype.values;            // "function" ๋ฐ˜ํ™˜
var it = sm.values();                              // values()๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด ๋ฐ˜ํ™˜
typeof it.next;                                    // "function" ๋ฐ˜ํ™˜

// ์•„๋ž˜ ๋ฃจํ”„๋Š” "anna", "brian"์„ ๋กœ๊ทธํ•œ๋‹ค.
for await (let username of sm.keys()) {
  console.log(username);
}

// ์ด๊ฒƒ๋„ ๋™์ผํ•˜๋‹ค.
for await (let [username, session] of sm) {
  console.log(username);
}

์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ํ•˜๋‚˜์˜ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค. ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ์œผ๋ฉด ์•ˆ ๋œ๋‹ค. ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ทธ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” maplike ์„ ์–ธ, setlike ์„ ์–ธ, ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ํ™•์žฅ ์†์„ฑ: [CrossOriginIsolated], [Exposed], [SecureContext].

์ด ํ™•์žฅ ์†์„ฑ๋“ค์€ ํ˜„์žฌ๋Š” ์ ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ถ”ํ›„ ์ ์šฉ๋˜๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•  ๊ฒƒ์ด๋‹ค.

AsyncIterable ::
    async_iterable < TypeWithExtendedAttributes OptionalType > OptionalArgumentList ;
OptionalArgumentList ::
    ( ArgumentList )
    ฮต

2.5.11. Maplike ์„ ์–ธ

์ธํ„ฐํŽ˜์ด์Šค๋Š” maplike๋กœ ์„ ์–ธ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ณธ๋ฌธ์— maplike ์„ ์–ธ (ReadWriteMaplike ๋˜๋Š” readonly MaplikeRest์— ์ผ์น˜)์„ ์‚ฌ์šฉํ•ด ์ง€์ •ํ•œ๋‹ค.

interface interface_identifier {
  readonly maplike<key_type, value_type>;
  maplike<key_type, value_type>;
};

maplike๋กœ ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋Š”, ์ฒ˜์Œ์—๋Š” ๋น„์–ด ์žˆ๊ณ , ํ‚คโ€“๊ฐ’ ์Œ์˜ ์ˆœ์„œ ์žˆ๋Š” map์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด๋ฅผ ํ•ด๋‹น ๊ฐ์ฒด์˜ map ์—”ํŠธ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค. ํ‚ค์™€ ๊ฐ’์˜ ํƒ€์ž…์€ maplike ์„ ์–ธ์˜ ๊บพ์‡  ๊ด„ํ˜ธ์— ์ง€์ •๋œ๋‹ค. ํ‚ค๋Š” ๋ฐ˜๋“œ์‹œ ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค.

๋ช…์„ธ ์ž‘์„ฑ์ž๋Š” map ์—”ํŠธ๋ฆฌ์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋œ๋‹ค.

maplike ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ์ ์ ˆํ•œ map ์—”ํŠธ๋ฆฌ ์งˆ์˜ API๋ฅผ ์ง€์›ํ•œ๋‹ค. readonly ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์œผ๋ฉด, map ์—”ํŠธ๋ฆฌ ์ˆ˜์ • API๋„ ์ง€์›ํ•œ๋‹ค.

์ฐธ๊ณ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” map ์—”ํŠธ๋ฆฌ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” API๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Map ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•˜๋‹ค. readonly ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ๋Š” entries, forEach, get, has, keys, values, %Symbol.iterator% ๋ฉ”์„œ๋“œ, ๊ทธ๋ฆฌ๊ณ  size getter๋ฅผ ํฌํ•จํ•œ๋‹ค. ์ฝ๊ธฐโ€“์“ฐ๊ธฐ maplike์ผ ๊ฒฝ์šฐ, clear, delete, set ๋ฉ”์„œ๋“œ๋„ ํฌํ•จํ•œ๋‹ค.

maplike ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” "entries", "forEach", "get", "has", "keys", "size", "values" ์ด๋ฆ„์˜ ์†์„ฑ, ์ƒ์ˆ˜, ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ด ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ์ด ์ด๋ฆ„์˜ ์†์„ฑ, ์ƒ์ˆ˜, ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ด ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

์ฝ๊ธฐโ€“์“ฐ๊ธฐ maplike ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” "clear", "delete", "set" ์ด๋ฆ„์˜ ์†์„ฑ ๋˜๋Š” ์ƒ์ˆ˜๊ฐ€ ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ํ•ด๋‹น ์ด๋ฆ„์˜ ์†์„ฑ์ด๋‚˜ ์ƒ์ˆ˜๊ฐ€ ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

์ฐธ๊ณ : ์ฝ๊ธฐโ€“์“ฐ๊ธฐ maplike ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ผ๋ฐ˜ ์—ฐ์‚ฐ์œผ๋กœ "clear", "delete", "set" ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ๋ฎ์–ด์“ด๋‹ค(ยงโ€ฏ3.7.11 Maplike ์„ ์–ธ ์ฐธ์กฐ). ์ด๋Ÿฐ ์—ฐ์‚ฐ์ด ์ •์˜๋˜๋ฉด, ๊ฐ ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์— ๋ช…์‹œ๋œ ์ž…๋ ฅ/์ถœ๋ ฅ ๊ธฐ๋Œ€์น˜์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ํ•˜๋‚˜์˜ maplike ์„ ์–ธ๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค. maplike ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค์—๋„ maplike ์„ ์–ธ์ด ์žˆ์œผ๋ฉด ์•ˆ ๋œ๋‹ค. maplike ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ, ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ, setlike ์„ ์–ธ, ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ getter๊ฐ€ ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

ReadOnlyMember ::
    readonly ReadOnlyMemberRest
ReadOnlyMemberRest ::
    AttributeRest
    MaplikeRest
    SetlikeRest
ReadWriteMaplike ::
    MaplikeRest
MaplikeRest ::
    maplike < TypeWithExtendedAttributes , TypeWithExtendedAttributes > ;

์ด ๋ช…์„ธ์—์„œ ์ •์˜๋œ ํ™•์žฅ ์†์„ฑ์€ maplike ์„ ์–ธ์— ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ์‹œ ์ถ”๊ฐ€ ํ•„์š”.

2.5.12. Setlike ์„ ์–ธ

์ธํ„ฐํŽ˜์ด์Šค๋Š” setlike๋กœ ์„ ์–ธ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ณธ๋ฌธ์— setlike ์„ ์–ธ (ReadWriteSetlike ๋˜๋Š” readonly SetlikeRest์— ์ผ์น˜)์„ ์‚ฌ์šฉํ•ด ์ง€์ •ํ•œ๋‹ค.

interface interface_identifier {
  readonly setlike<type>;
  setlike<type>;
};

setlike๋กœ ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋Š”, ์ฒ˜์Œ์—๋Š” ๋น„์–ด ์žˆ๊ณ , ๊ฐ’์˜ ์ˆœ์„œ ์žˆ๋Š” ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด๋ฅผ ํ•ด๋‹น ๊ฐ์ฒด์˜ set ์—”ํŠธ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ’์˜ ํƒ€์ž…์€ setlike ์„ ์–ธ์˜ ๊บพ์‡  ๊ด„ํ˜ธ์— ์ง€์ •๋œ๋‹ค. ๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค.

๋ช…์„ธ ์ž‘์„ฑ์ž๋Š” set ์—”ํŠธ๋ฆฌ์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋œ๋‹ค.

setlike ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ์ ์ ˆํ•œ set ์—”ํŠธ๋ฆฌ ์งˆ์˜ API๋ฅผ ์ง€์›ํ•œ๋‹ค. readonly ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์œผ๋ฉด, set ์—”ํŠธ๋ฆฌ ์ˆ˜์ • API๋„ ์ง€์›ํ•œ๋‹ค.

์ฐธ๊ณ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” set ์—”ํŠธ๋ฆฌ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” API๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Set ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•˜๋‹ค. readonly ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ๋Š” entries, forEach, has, keys, values, %Symbol.iterator% ๋ฉ”์„œ๋“œ, ๊ทธ๋ฆฌ๊ณ  size getter๋ฅผ ํฌํ•จํ•œ๋‹ค. ์ฝ๊ธฐโ€“์“ฐ๊ธฐ setlike์ผ ๊ฒฝ์šฐ, add, clear, delete ๋ฉ”์„œ๋“œ๋„ ํฌํ•จํ•œ๋‹ค.

setlike ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” "entries", "forEach", "has", "keys", "size", "values" ์ด๋ฆ„์˜ ์†์„ฑ, ์ƒ์ˆ˜, ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ด ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ์ด ์ด๋ฆ„์˜ ์†์„ฑ, ์ƒ์ˆ˜, ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ด ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

์ฝ๊ธฐโ€“์“ฐ๊ธฐ setlike ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” "add", "clear", "delete" ์ด๋ฆ„์˜ ์†์„ฑ ๋˜๋Š” ์ƒ์ˆ˜๊ฐ€ ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ํ•ด๋‹น ์ด๋ฆ„์˜ ์†์„ฑ์ด๋‚˜ ์ƒ์ˆ˜๊ฐ€ ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

์ฐธ๊ณ : ์ฝ๊ธฐโ€“์“ฐ๊ธฐ setlike ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ผ๋ฐ˜ ์—ฐ์‚ฐ์œผ๋กœ "add", "clear", "delete" ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ๋ฎ์–ด์“ด๋‹ค(ยงโ€ฏ3.7.12 Setlike ์„ ์–ธ ์ฐธ์กฐ). ์ด๋Ÿฐ ์—ฐ์‚ฐ์ด ์ •์˜๋˜๋ฉด, ๊ฐ ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์— ๋ช…์‹œ๋œ ์ž…๋ ฅ/์ถœ๋ ฅ ๊ธฐ๋Œ€์น˜์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ํ•˜๋‚˜์˜ setlike ์„ ์–ธ๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค. setlike ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค์—๋„ setlike ์„ ์–ธ์ด ์žˆ์œผ๋ฉด ์•ˆ ๋œ๋‹ค. setlike ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ, ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ, maplike ์„ ์–ธ, ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ getter๊ฐ€ ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

ReadOnlyMember ::
    readonly ReadOnlyMemberRest
ReadOnlyMemberRest ::
    AttributeRest
    MaplikeRest
    SetlikeRest
ReadWriteSetlike ::
    SetlikeRest
SetlikeRest ::
    setlike < TypeWithExtendedAttributes > ;

์ด ๋ช…์„ธ์—์„œ ์ •์˜๋œ ํ™•์žฅ ์†์„ฑ์€ setlike ์„ ์–ธ์— ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ์‹œ ์ถ”๊ฐ€ ํ•„์š”.

2.6. ๋„ค์ž„์ŠคํŽ˜์ด์Šค

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ž€, ์ „์—ญ ์‹ฑ๊ธ€ํ„ด๊ณผ ๊ด€๋ จ ๋™์ž‘์„ ์„ ์–ธํ•˜๋Š” ์ •์˜(Namespace์— ์ผ์น˜)์ž…๋‹ˆ๋‹ค.

namespace identifier {
  /* namespace_members... */
};

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฉค๋ฒ„๋“ค์˜ ๋ช…์„ธ(NamespaceMembers์— ์ผ์น˜)์ž…๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฉค๋ฒ„๋ž€, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์„ ์–ธ์˜ ์ค‘๊ด„ํ˜ธ ์‚ฌ์ด์— ๋“ฑ์žฅํ•˜๋Š” ์ผ๋ฐ˜ ์—ฐ์‚ฐ, ์ฝ๊ธฐ ์ „์šฉ ์ผ๋ฐ˜ ์†์„ฑ, ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ์—ฐ์‚ฐ๊ณผ ์†์„ฑ๋“ค์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ํŒจํ‚ค์ง•๋˜๋Š” ๋™์ž‘์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ IDL๋„ ๋ถ€๋ถ„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •์˜(partial Namespace์— ์ผ์น˜)๋ฅผ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •์˜์˜ ์‹๋ณ„์ž๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •์˜์˜ ์‹๋ณ„์ž์™€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ถ€๋ถ„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •์˜์— ๋“ฑ์žฅํ•˜๋Š” ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ž์ฒด์˜ ๋ฉค๋ฒ„๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

namespace SomeNamespace {
  /* namespace_members... */
};

partial namespace SomeNamespace {
  /* namespace_members... */
};

์ฐธ๊ณ : ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์ฒ˜๋Ÿผ, ๋ถ€๋ถ„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •์˜๋Š” ๋ช…์„ธ ํŽธ์ง‘์„ ๋•๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ •์˜๋ฅผ ๋ฌธ์„œ์˜ ์—ฌ๋Ÿฌ ์„น์…˜ ๋˜๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์„œ์— ๊ฑธ์ณ ๋ถ„๋ฆฌํ•ด ๊ธฐ์ˆ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๋ฉค๋ฒ„๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ์ˆœ์„œ๋Š” JavaScript ๋ฐ”์ธ๋”ฉ์—์„œ ํ”„๋กœํผํ‹ฐ ์—ด๊ฑฐ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ๋”•์…”๋„ˆ๋ฆฌ์™€ ๋‹ค๋ฅด๊ฒŒ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ํƒ€์ž…์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ช…์„ธ์—์„œ ์ •์˜๋œ ํ™•์žฅ ์†์„ฑ ์ค‘, [CrossOriginIsolated], [Exposed], [SecureContext]๋งŒ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋ฐ˜๋“œ์‹œ [Exposed] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์–ด๋…ธํ…Œ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Partial ::
    partial PartialDefinition
PartialDefinition ::
    interface PartialInterfaceOrPartialMixin
    PartialDictionary
    Namespace
Namespace ::
    namespace identifier { NamespaceMembers } ;
NamespaceMembers ::
    ExtendedAttributeList NamespaceMember NamespaceMembers
    ฮต
NamespaceMember ::
    RegularOperation
    readonly AttributeRest
    Const

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

namespace VectorUtils {
  readonly attribute Vector unit;
  double dotProduct(Vector x, Vector y);
  Vector crossProduct(Vector x, Vector y);
};

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌํ˜„์—์„œ๋Š” ์ „์—ญ VectorUtils ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋…ธ์ถœ๋˜๋ฉฐ, ์ด๋Š” ๋‹จ์ˆœ ๊ฐ์ฒด(ํ”„๋กœํ† ํƒ€์ž…์€ %Object.prototype%) ์ด๊ณ , ์„ ์–ธ๋œ ์—ฐ์‚ฐ๋งˆ๋‹ค ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ, ์„ ์–ธ๋œ ์†์„ฑ๋งˆ๋‹ค ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ์ฝ๊ธฐ ์ „์šฉ ์ ‘๊ทผ์ž๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

Object.getPrototypeOf(VectorUtils);                         // Object.prototype ๋ฐ˜ํ™˜
Object.keys(VectorUtils);                                   // ["dotProduct", "crossProduct"] ๋ฐ˜ํ™˜
Object.getOwnPropertyDescriptor(VectorUtils, "dotProduct"); // { value: <a function>, enumerable: true, configurable: true, writable: true } ๋ฐ˜ํ™˜
Object.getOwnPropertyDescriptor(VectorUtils, "unit");       // { get: <a function>, enumerable: true, configurable: true } ๋ฐ˜ํ™˜

2.7. ๋”•์…”๋„ˆ๋ฆฌ

๋”•์…”๋„ˆ๋ฆฌ๋ž€, Dictionary์— ์ผ์น˜ํ•˜๋Š” ์ •์˜๋กœ, ๊ณ ์ •๋œ ์ˆœ์„œ์˜ ์ˆœ์„œ ์žˆ๋Š” map ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด map์˜ ์—”ํŠธ๋ฆฌ๋“ค์€ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„๋ผ ํ•˜๋ฉฐ, ํ‚ค๋Š” ๋ฌธ์ž์—ด์ด๊ณ  ๊ฐ’์€ ์ •์˜์—์„œ ์ง€์ •ํ•œ ํŠน์ • ํƒ€์ž…์ด๋‹ค.

dictionary identifier {
  /* dictionary_members... */
};

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

๋”•์…”๋„ˆ๋ฆฌ๋Š” ์†์„ฑ์ด๋‚˜ ์ƒ์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†๋‹ค.

๋”•์…”๋„ˆ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ƒ์†ํ•˜๋„๋ก ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ์˜ ์‹๋ณ„์ž ๋’ค์— ์ฝœ๋ก ๊ณผ ์‹๋ณ„์ž๊ฐ€ ์˜ค๋ฉด, ํ•ด๋‹น ์‹๋ณ„์ž๋Š” ์ƒ์†๋ฐ›๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•œ๋‹ค. ๋ฐ˜๋“œ์‹œ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•ด์•ผ ํ•œ๋‹ค.

๋”•์…”๋„ˆ๋ฆฌ์˜ ์ƒ์† ๊ณ„์ธต์— ์ˆœํ™˜ ๊ตฌ์กฐ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ ๋œ๋‹ค. ์ฆ‰, ๋”•์…”๋„ˆ๋ฆฌ A๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ์ƒ์†ํ•˜๊ฑฐ๋‚˜, B๋ฅผ ์ƒ์†ํ•˜๋ฉด์„œ B๊ฐ€ ๋‹ค์‹œ A๋ฅผ ์ƒ์†ํ•˜๋Š” ๋ฐฉ์‹์€ ๊ธˆ์ง€๋œ๋‹ค.

dictionary Base {
  /* dictionary_members... */
};

dictionary Derived : Base {
  /* dictionary_members... */
};

๋”•์…”๋„ˆ๋ฆฌ D์˜ ์ƒ์†๋œ ๋”•์…”๋„ˆ๋ฆฌ๋“ค์€ D๊ฐ€ ์ง์ ‘ ๋˜๋Š” ๊ฐ„์ ‘์ ์œผ๋กœ ์ƒ์†๋ฐ›๋Š” ๋ชจ๋“  ๋”•์…”๋„ˆ๋ฆฌ ์ง‘ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค. D๊ฐ€ ๋‹ค๋ฅธ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š์œผ๋ฉด ์ง‘ํ•ฉ์€ ๋น„์–ด ์žˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, D๊ฐ€ ์ƒ์†ํ•œ ๋”•์…”๋„ˆ๋ฆฌ E์™€ E์˜ ์ƒ์†๋œ ๋”•์…”๋„ˆ๋ฆฌ๋“ค์ด ๋ชจ๋‘ ํฌํ•จ๋œ๋‹ค.

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

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

ํƒ€์ž… D์˜ ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ’์—๋Š”, D์™€ D์˜ ์ƒ์†๋œ ๋”•์…”๋„ˆ๋ฆฌ๋“ค์— ์ •์˜๋œ ๋ชจ๋“  ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„์— ๋Œ€ํ•œ ์—”ํŠธ๋ฆฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•„์ˆ˜ ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์ง€์ •๋œ ๋ฉค๋ฒ„๋Š” ๋ฐ˜๋“œ์‹œ ์—”ํŠธ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๊ทธ ์™ธ ๋ฉค๋ฒ„์˜ ์—”ํŠธ๋ฆฌ๋Š” ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค.

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

์—ฐ์‚ฐ ์ธ์ž ๊ธฐ๋ณธ๊ฐ’๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, boolean ํƒ€์ž… ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ true๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•œ๋‹ค. ์ด๋Š” undefined์˜ ๊ธฐ๋ณธ ๋ณ€ํ™˜์ด false๊ฐ€ ๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ์ €์ž์—๊ฒŒ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. [API-DESIGN-PRINCIPLES]

๋ฌธ์ž์—ด ํ‚ค๋ฅผ ๊ฐ€์ง„ ์ˆœ์„œ ์žˆ๋Š” map์€, ๋ชจ๋“  ์—”ํŠธ๋ฆฌ๊ฐ€ ๋”•์…”๋„ˆ๋ฆฌ D์˜ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„์— ๋Œ€์‘ํ•˜๊ณ , ํƒ€์ž…์ด ๋งž๊ณ , ํ•„์ˆ˜ ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’ ๋ฉค๋ฒ„์— ๋Œ€ํ•œ ์—”ํŠธ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ์กด์žฌํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ D ํƒ€์ž…์˜ ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๋‹ค.

dictionary Descriptor {
  DOMString name;
  sequence<unsigned long> serviceIdentifiers;
};

Descriptor ๋”•์…”๋„ˆ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค:

  1. identifiers๋ฅผ ยซ 1, 3, 7 ยป๋กœ ๋‘”๋‹ค.

  2. ยซ[ "name" โ†’ "test", "serviceIdentifiers" โ†’ identifiers ]ยป๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ฐ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„(DictionaryMember์— ์ผ์น˜)๋Š” Type์— ์ผ์น˜ํ•˜๋Š” ํƒ€์ž… ๋’ค์— ์‹๋ณ„์ž๊ฐ€ ๋”ฐ๋ผ์˜จ๋‹ค(ํƒ€์ž… ๋’ค์— identifier ํ† ํฐ). ์ด ์‹๋ณ„์ž๊ฐ€ ํ‚คโ€“๊ฐ’ ์Œ์˜ ํ‚ค ์ด๋ฆ„์ด๋‹ค. Type์ด ์‹๋ณ„์ž ๋’ค์— ?๊ฐ€ ๋ถ™์œผ๋ฉด, ํ•ด๋‹น ์‹๋ณ„์ž๋Š” ์ธํ„ฐํŽ˜์ด์Šค, ์—ด๊ฑฐํ˜•, ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค, ํƒ€์ž… ์ •์˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹๋ณ„ํ•ด์•ผ ํ•œ๋‹ค. ?๊ฐ€ ์—†์œผ๋ฉด, ์œ„ ํƒ€์ž…๋“ค ์ค‘ ํ•˜๋‚˜ ๋˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ์—ฌ์•ผ ํ•œ๋‹ค.

๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„์˜ ํƒ€์ž…์ด typedef ํ•ด์„ ํ›„ ๋„ ํ—ˆ์šฉ ํƒ€์ž…์ด๋ฉด, ๋‚ด๋ถ€ ํƒ€์ž…์ด ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์ด๋ฉด ์•ˆ ๋œ๋‹ค.

dictionary identifier {
  type identifier;
};

์˜ต์…˜ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„์˜ ์‹๋ณ„์ž ๋’ค์— U+003D(=)์™€ ๊ฐ’(DefaultValue์— ์ผ์น˜)์ด ์˜ค๋ฉด, ํ•ด๋‹น ๋ฉค๋ฒ„์˜ ๊ธฐ๋ณธ๊ฐ’์ด ๋œ๋‹ค. ์ด ๊ฐ’์€ ์ฝ”๋“œ๋‚˜ ๋ช…์„ธ์—์„œ ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

dictionary identifier {
  type identifier = "value";
};

๋ถˆ๋ฆฌ์–ธ ๋ฆฌํ„ฐ๋Ÿด ํ† ํฐ(true ๋˜๋Š” false), null ํ† ํฐ, integer ํ† ํฐ, decimal ํ† ํฐ, ์„ธ ๊ฐ€์ง€ ํŠน์ˆ˜ ๋ถ€๋™์†Œ์ˆ˜์  ๋ฆฌํ„ฐ๋Ÿด(Infinity, -Infinity, NaN), string ํ† ํฐ, [] ๋˜๋Š” {} ํ† ํฐ ์‹œํ€€์Šค๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉด, ์—ฐ์‚ฐ์˜ ์˜ต์…˜ ์ธ์ž ๊ธฐ๋ณธ๊ฐ’๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ•ด์„๋œ๋‹ค.

๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„ ํƒ€์ž…์ด ์—ด๊ฑฐํ˜•์ด๋ฉด, ๊ธฐ๋ณธ๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ์—ด๊ฑฐํ˜•์˜ ๊ฐ’ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.

๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„ ํƒ€์ž… ์•ž์— required ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด, ํ•ด๋‹น ๋ฉค๋ฒ„๋Š” ํ•„์ˆ˜ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

dictionary identifier {
  required type identifier;
};

๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„์˜ ํƒ€์ž…์—๋Š” ํ•ด๋‹น ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜๋ฉด ์•ˆ ๋œ๋‹ค. ํƒ€์ž…์ด ๋”•์…”๋„ˆ๋ฆฌ D๋ฅผ ํฌํ•จํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ด๋ฉด ์„ฑ๋ฆฝํ•œ๋‹ค:

์ธํ„ฐํŽ˜์ด์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋”•์…”๋„ˆ๋ฆฌ์˜ IDL๋„ ๋ถ€๋ถ„ ๋”•์…”๋„ˆ๋ฆฌ ์ •์˜(partial Dictionary์— ์ผ์น˜)๋ฅผ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ๋ถ€๋ถ„ ๋”•์…”๋„ˆ๋ฆฌ ์ •์˜์˜ ์‹๋ณ„์ž๋Š” ๋”•์…”๋„ˆ๋ฆฌ ์ •์˜์˜ ์‹๋ณ„์ž์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ๊ฐ ๋ถ€๋ถ„ ๋”•์…”๋„ˆ๋ฆฌ ์ •์˜์— ๋“ฑ์žฅํ•˜๋Š” ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” ๋”•์…”๋„ˆ๋ฆฌ ์ž์ฒด์˜ ๋ฉค๋ฒ„๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

dictionary SomeDictionary {
  /* dictionary_members... */
};

partial dictionary SomeDictionary {
  /* dictionary_members... */
};

์ฐธ๊ณ : ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์™€ ๊ฐ™์ด, ๋ถ€๋ถ„ ๋”•์…”๋„ˆ๋ฆฌ ์ •์˜๋Š” ๋ช…์„ธ ํŽธ์ง‘์„ ๋•๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ, ๋”•์…”๋„ˆ๋ฆฌ ์ •์˜๋ฅผ ๋ฌธ์„œ์˜ ์—ฌ๋Ÿฌ ์„น์…˜์ด๋‚˜ ์—ฌ๋Ÿฌ ๋ฌธ์„œ์— ๊ฑธ์ณ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

๋”•์…”๋„ˆ๋ฆฌ์˜ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„ ์ˆœ์„œ๋Š”, ์ƒ์†๋œ ๋ฉค๋ฒ„๊ฐ€ ๋น„์ƒ์† ๋ฉค๋ฒ„๋ณด๋‹ค ์•ž์— ์˜ค๊ณ , ํ•œ ๋”•์…”๋„ˆ๋ฆฌ ์ •์˜(๋ถ€๋ถ„ ๋”•์…”๋„ˆ๋ฆฌ ํฌํ•จ) ๋‚ด ๋ฉค๋ฒ„๋“ค์€ ์‹๋ณ„์ž์˜ ์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œํฌ์ธํŠธ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์ „์ˆœ ์ •๋ ฌ๋œ๋‹ค.

์‚ฌ์ „ ๊ฐ’์˜ ํ•ญ๋ชฉ์€ ํ•ญ์ƒ ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์ „ ๋ฉค๋ฒ„์˜ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜๋ฉฐ, ์ด๋“ค์ด ์„ค์ •๋œ ์ˆœ์„œ์™€๋Š” ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ์ •์˜๊ฐ€ ์žˆ์„ ๋•Œ:

dictionary B : A {
  long b;
  long a;
};

dictionary A {
  long c;
  long g;
};

dictionary C : B {
  long e;
  long f;
};

partial dictionary A {
  long h;
  long d;
};

C ํƒ€์ž… ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ’์˜ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„ ์ˆœ์„œ๋Š” c, d, g, h, a, b, e, f์ด๋‹ค.

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

[Exposed=Window]
interface Something {
  undefined f(A a);
};

๊ทธ๋ฆฌ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ:

var something = getSomething();  // Something ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ
var x = 0;

var dict = { };
Object.defineProperty(dict, "d", { get: function() { return ++x; } });
Object.defineProperty(dict, "c", { get: function() { return ++x; } });

something.f(dict);

๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„๋ฅผ ์กฐํšŒํ•˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฐ’์ด ๋‹ฌ๋ผ์ง„๋‹ค. A์˜ ์ˆœ์„œ๊ฐ€ c, d์ด๋ฏ€๋กœ, c ๊ฐ’์€ 1, d ๊ฐ’์€ 2๊ฐ€ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ญ๋ชฉ์ด ๋™์ผํ•œ ํ‚ค์™€ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ–๋Š” ๋‘ ์‚ฌ์ „ ๊ฐ’์€ ํ•ด๋‹น ํ•ญ๋ชฉ๋“ค์ด ์„ค์ •๋œ ์ˆœ์„œ์™€ ๊ด€๊ณ„์—†์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•ญ๋ชฉ๋“ค์ด ์„ค์ •๋œ ์ˆœ์„œ์™€๋Š” ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ๋ฉค๋ฒ„์˜ ์‹๋ณ„์ž๋Š” ํ•ด๋‹น ์‚ฌ์ „ ๋˜๋Š” ํ•ด๋‹น ์‚ฌ์ „์˜ ์ƒ์†๋œ ์‚ฌ์ „์— ์ •์˜๋œ ๋‹ค๋ฅธ ์‚ฌ์ „ ๋ฉค๋ฒ„์˜ ์‹๋ณ„์ž์™€ ๊ฐ™์•„์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „์—๋Š” ํ™•์žฅ ์†์„ฑ์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Partial ::
    partial PartialDefinition
PartialDefinition ::
    interface PartialInterfaceOrPartialMixin
    PartialDictionary
    Namespace
Dictionary ::
    dictionary identifier Inheritance { DictionaryMembers } ;
DictionaryMembers ::
    DictionaryMember DictionaryMembers
    ฮต
DictionaryMember ::
    ExtendedAttributeList DictionaryMemberRest
DictionaryMemberRest ::
    required TypeWithExtendedAttributes identifier ;
    Type identifier Default ;
PartialDictionary ::
    dictionary identifier { DictionaryMembers } ;
Default ::
    = DefaultValue
    ฮต
DefaultValue ::
    ConstValue
    string
    [ ]
    { }
    null
    undefined
Inheritance ::
    : identifier
    ฮต

๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์˜ ํ•œ ๊ฐ€์ง€ ์šฉ๋„๋Š”, ์˜ต์…˜ ์ธ์ž๋ฅผ ์—ฐ์‚ฐ์— ์—ฌ๋Ÿฌ ๊ฐœ ์ œ๊ณตํ•˜๋ฉด์„œ, ํ˜ธ์ถœ ์‹œ ์ธ์ž ์ˆœ์„œ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋ณด์ž:

[Exposed=Window]
interface Point {
  constructor();
  attribute double x;
  attribute double y;
};

dictionary PaintOptions {
  DOMString fillPattern = "black";
  DOMString strokePattern;
  Point position;
};

[Exposed=Window]
interface GraphicsContext {
  undefined drawRectangle(double width, double height, optional PaintOptions options);
};

IDL์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌํ˜„์—์„œ๋Š”, ์˜ต์…˜ PaintOptions ๋”•์…”๋„ˆ๋ฆฌ์— Object๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค:

// GraphicsContext ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ
var ctx = getGraphicsContext();

// ์‚ฌ๊ฐํ˜• ๊ทธ๋ฆฌ๊ธฐ
ctx.drawRectangle(300, 200, { fillPattern: "red", position: new Point(10, 10) });

PaintOptions์˜ ๋ฉค๋ฒ„๋Š” ์˜ต์…˜์ด๋‹ค. fillPattern์„ ์ƒ๋žตํ•˜๋ฉด, drawRectangle ์ •์˜์—์„œ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ๋‹ค๊ณ  ๊ฐ„์ฃผํ•˜๊ณ  ๋”ฐ๋กœ ์ƒ๋žต ์ฒ˜๋ฆฌ ๋ฌธ๊ตฌ๋ฅผ ๋„ฃ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. strokePattern๊ณผ position ์ƒ๋žต ์‹œ๋Š” drawRectangle์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

2.8. ์˜ˆ์™ธ

์˜ˆ์™ธ๋ž€ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด ํƒ€์ž…์œผ๋กœ, ๊ตฌํ˜„์ฒด์—์„œ throw ํ•˜๊ฑฐ๋‚˜ ๊ฐ’์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. Web IDL์—๋Š” ๋ช…์„ธ์—์„œ ์—ฐ์‚ฐ, ์†์„ฑ ๋“ฑ์— ์ฐธ์กฐ ๋˜๋Š” throwํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋ณธ ์˜ˆ์™ธ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์—์„œ DOMException์„ ์ƒ์†ํ•˜์—ฌ ์ปค์Šคํ…€ ์˜ˆ์™ธ ํƒ€์ž…๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ˆœ ์˜ˆ์™ธ๋Š” ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๋กœ ์‹๋ณ„๋œ๋‹ค:

์ด๋Š” JavaScript์˜ ๋ชจ๋“  ์˜ค๋ฅ˜ ๊ฐ์ฒด์— ํ•ด๋‹นํ•˜์ง€๋งŒ, ๋‹ค์Œ์€ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. AggregateError ๋ฐ SuppressedError๋Š” ๋‹ค๋ฅธ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์‹ธ๋Š” ์šฉ๋„๋กœ๋งŒ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, SyntaxError๋Š” JavaScript ํŒŒ์„œ์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ์˜ˆ์•ฝ๋˜์–ด ์žˆ๊ณ , Error๋Š” ์ž‘์„ฑ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋„๋ก ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋‹จ์ˆœ ์˜ˆ์™ธ์˜ ์˜๋ฏธ๋Š” ํ•ด๋‹น ์˜ค๋ฅ˜ ๊ฐ์ฒด์˜ ์˜๋ฏธ์™€ JavaScript ๋ช…์„ธ์—์„œ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜ˆ์™ธ ์ข…๋ฅ˜๋Š” DOMException์œผ๋กœ, ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด name์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. name ๊ฐ’์€ ์•„๋ž˜ DOMException ์ด๋ฆ„ ํ…Œ์ด๋ธ”์—์„œ ์„ ์ •๋œ๋‹ค.

DOMException์€ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์ด๋ฏ€๋กœ IDL์—์„œ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฐ์‚ฐ์˜ DOMException ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์˜ˆ์™ธ๋Š” ๋ฐ˜ํ™˜์ด ์•„๋‹ˆ๋ผ throwํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ด๋Ÿฐ ํŒจํ„ด์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.

์„ธ ๋ฒˆ์งธ ์˜ˆ์™ธ ์ข…๋ฅ˜๋Š” DOMException์„ ์ƒ์†ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์ด๋“ค์€ ๋” ๋ณต์žกํ•˜๋ฏ€๋กœ ยงโ€ฏ2.8.2 DOMException ํŒŒ์ƒ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋”ฐ๋กœ ์„ค๋ช…ํ•œ๋‹ค.

๋‹จ์ˆœ ์˜ˆ์™ธ๋Š” ํƒ€์ž… ์ด๋ฆ„์„ ์ œ๊ณตํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. DOMException์€ name ๋’ค์— DOMException์„ ์ œ๊ณตํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค. ์˜ˆ์™ธ๋Š” throwํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ด๋•Œ๋„ ์ƒ์„ฑํ•  ๋•Œ์™€ ๋™์ผํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์˜ˆ์™ธ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ์— ์œ ์šฉํ•˜๋‹ค.

์˜ˆ์™ธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  throwํ•˜๋Š” ๋ฌธ๊ตฌ ์˜ˆ์‹œ: ๋‹จ์ˆœ ์˜ˆ์™ธ TypeError๋ฅผ throwํ•˜๋ ค๋ฉด:

TypeError๋ฅผ throwํ•œ๋‹ค.

name์ด "NotAllowedError"์ธ DOMException์„ throwํ•˜๋ ค๋ฉด:

"NotAllowedError" DOMException์„ throwํ•œ๋‹ค.

name์ด "SyntaxError"์ธ DOMException์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด:

object๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ "SyntaxError" DOMException์œผ๋กœ ๋‘”๋‹ค.

name์ด "OperationError"์ธ DOMException์œผ๋กœ promise๋ฅผ rejectํ•˜๋ ค๋ฉด:

p๋ฅผ "OperationError" DOMException์œผ๋กœ rejectํ•œ๋‹ค.

์˜ˆ์™ธ ๋ฉ”์‹œ์ง€์— ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ์˜ˆ์‹œ:

"SyntaxError" DOMException์„ throwํ•œ๋‹ค. ์ด ๋•Œ ์ฃผ์–ด์ง„ ๊ฐ’์— ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ํ›„ํ–‰ ๊ณต๋ฐฑ์ด ์žˆ์—ˆ๋‹ค๊ณ  ๋ช…์‹œํ•œ๋‹ค.

์ด๋Ÿฐ ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ ์ด์œ ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ๋•Œ(์˜ˆ: ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์—์„œ "SyntaxError" DOMException์„ throwํ•  ๋•Œ) ๊ตฌํ˜„์ž์—๊ฒŒ ๋„์›€์ด ๋œ๋‹ค. ๋ฐ˜๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ถŒํ•œ์„ ์ œ๊ณตํ–ˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ๋ฐ”๋กœ "NotAllowedError" DOMException์„ throwํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฉ”์‹œ์ง€ ๊ตฌ์ฒดํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.

์˜ˆ์™ธ ์ƒ์„ฑ ๋ฐ throw์˜ ์‹ค์ œ ๋™์ž‘์€ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค.

ยงโ€ฏ3.14.3 ์˜ˆ์™ธ ์ƒ์„ฑ ๋ฐ throw์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ ์˜ˆ์™ธ ์ƒ์„ฑ ๋ฐ throw์˜ ์ƒ์„ธ ๋™์ž‘์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

2.8.1. ๊ธฐ๋ณธ DOMException ์˜ค๋ฅ˜ ์ด๋ฆ„

์•„๋ž˜ DOMException ์ด๋ฆ„ ํ…Œ์ด๋ธ”์€ ๊ธฐ๋ณธ DOMException ์ธํ„ฐํŽ˜์ด์Šค ์ธ์Šคํ„ด์Šค์— ํ—ˆ์šฉ๋˜๋Š” ๋ชจ๋“  ์ด๋ฆ„๊ณผ, ๊ฐ ์ด๋ฆ„์˜ ์˜๋ฏธ ๋ฐ ๋ ˆ๊ฑฐ์‹œ ์ˆซ์ž ์˜ค๋ฅ˜ ์ฝ”๋“œ ๊ฐ’์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

DOMException์„ ์ƒ์†ํ•œ ์ธํ„ฐํŽ˜์ด์Šค(์•„๋ž˜ ยงโ€ฏ2.8.2 DOMException ํŒŒ์ƒ ์ธํ„ฐํŽ˜์ด์Šค ์ฐธ๊ณ )๋Š” ์ž์ฒด ์ด๋ฆ„์„ ๊ฐ€์ง€๋ฉฐ, ์ด ํ…Œ์ด๋ธ”์—๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

DOMException์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ throwํ•  ๋•Œ, ๋ช…์„ธ์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์ด ์ด๋ฆ„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ช…์„ธ์ž๊ฐ€ ์–ด๋–ค ์ด๋ฆ„๋„ ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด, ์ด์Šˆ๋ฅผ ๋“ฑ๋กํ•ด ์ƒˆ๋กœ์šด ์ด๋ฆ„ ์ถ”๊ฐ€๋ฅผ ๋…ผ์˜ํ•ด์•ผ ํ•˜๋ฉฐ, ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ด๋Ÿฐ ์ž‘์—…์„ ์กฐ์œจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ผ€์ด์Šค๋ณ„ ์ด๋ฆ„์€, ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹จ์ผ API์—์„œ ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜ ์กฐ๊ฑด์„ ๊ตฌ๋ถ„ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

DOMException ์ด๋ฆ„ ์ค‘ "deprecated"๋กœ ํ‘œ์‹œ๋œ ๊ฒƒ์€ ๋ ˆ๊ฑฐ์‹œ๋ฅผ ์œ„ํ•ด ๋‚จ์•„ ์žˆ์ง€๋งŒ, ์‚ฌ์šฉ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์—ฌ๊ธฐ ์ •์˜๋œ "SyntaxError" DOMException๊ณผ JavaScript์˜ SyntaxError๋ฅผ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์„ธ์š”. "SyntaxError" DOMException์€ ์›น API์—์„œ ํŒŒ์‹ฑ ์˜ค๋ฅ˜(์˜ˆ: ์…€๋ ‰ํ„ฐ ํŒŒ์‹ฑ ๋“ฑ)๋ฅผ ๋ณด๊ณ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, JavaScript SyntaxError๋Š” JS ํŒŒ์„œ ์šฉ๋„๋กœ ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด, ํ•ญ์ƒ "SyntaxError" DOMException ํ‘œ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , DOMException์„ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ ๋‹จ์ˆœํžˆ SyntaxError๋ผ๊ณ ๋งŒ ์“ฐ์ง€ ๋งˆ์„ธ์š”. [DOM]

์ด๋ฆ„ ์„ค๋ช… ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ์ด๋ฆ„ ๋ฐ ๊ฐ’
"IndexSizeError" ์‚ฌ์šฉ ์ค‘๋‹จ๋จ. ๋Œ€์‹  RangeError ์‚ฌ์šฉ. INDEX_SIZE_ERR (1)
"HierarchyRequestError" ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜๋ชป๋œ ๋…ธ๋“œ ํŠธ๋ฆฌ๊ฐ€ ๋  ๋•Œ. [DOM] HIERARCHY_REQUEST_ERR (3)
"WrongDocumentError" ๊ฐ์ฒด๊ฐ€ ์ž˜๋ชป๋œ ๋ฌธ์„œ์— ์žˆ์„ ๋•Œ. [DOM] WRONG_DOCUMENT_ERR (4)
"InvalidCharacterError" ๋ฌธ์ž์—ด์— ์ž˜๋ชป๋œ ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋จ. INVALID_CHARACTER_ERR (5)
"NoModificationAllowedError" ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Œ. NO_MODIFICATION_ALLOWED_ERR (7)
"NotFoundError" ๊ฐ์ฒด๋ฅผ ์—ฌ๊ธฐ์„œ ์ฐพ์„ ์ˆ˜ ์—†์Œ. NOT_FOUND_ERR (8)
"NotSupportedError" ์—ฐ์‚ฐ์ด ์ง€์›๋˜์ง€ ์•Š์Œ. NOT_SUPPORTED_ERR (9)
"InUseAttributeError" ์†์„ฑ์ด ๋‹ค๋ฅธ ์š”์†Œ์—์„œ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ž„. [DOM] INUSE_ATTRIBUTE_ERR (10)
"InvalidStateError" ๊ฐ์ฒด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์ƒํƒœ์ž„. INVALID_STATE_ERR (11)
"SyntaxError" ๋ฌธ์ž์—ด์ด ์˜ˆ์ƒ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ. SYNTAX_ERR (12)
"InvalidModificationError" ์ด ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Œ. INVALID_MODIFICATION_ERR (13)
"NamespaceError" ์—ฐ์‚ฐ์ด Namespaces in XML์— ์˜ํ•ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ. [XML-NAMES] NAMESPACE_ERR (14)
"InvalidAccessError" ์‚ฌ์šฉ ์ค‘๋‹จ๋จ. ์ž˜๋ชป๋œ ์ธ์ž์—๋Š” TypeError, ์ง€์›๋˜์ง€ ์•Š๋Š” ์—ฐ์‚ฐ์—๋Š” "NotSupportedError" DOMException, ๊ฑฐ๋ถ€๋œ ์š”์ฒญ์—๋Š” "NotAllowedError" DOMException ์‚ฌ์šฉ. INVALID_ACCESS_ERR (15)
"TypeMismatchError" ์‚ฌ์šฉ ์ค‘๋‹จ๋จ. ๋Œ€์‹  TypeError ์‚ฌ์šฉ. TYPE_MISMATCH_ERR (17)
"SecurityError" ์—ฐ์‚ฐ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์Œ. SECURITY_ERR (18)
"NetworkError" ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ. NETWORK_ERR (19)
"AbortError" ์—ฐ์‚ฐ์ด ์ค‘๋‹จ๋จ. ABORT_ERR (20)
"URLMismatchError" ์‚ฌ์šฉ ์ค‘๋‹จ๋จ. URL_MISMATCH_ERR (21)
"QuotaExceededError" ์‚ฌ์šฉ ์ค‘๋‹จ๋จ. ๋Œ€์‹  QuotaExceededError DOMException ํŒŒ์ƒ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ. QUOTA_EXCEEDED_ERR (22)
"TimeoutError" ์—ฐ์‚ฐ์ด ์ œํ•œ ์‹œ๊ฐ„์„ ์ดˆ๊ณผํ•จ. TIMEOUT_ERR (23)
"InvalidNodeTypeError" ์ œ๊ณต๋œ ๋…ธ๋“œ๊ฐ€ ์ด ์—ฐ์‚ฐ์— ๋ถ€์ ํ•ฉํ•˜๊ฑฐ๋‚˜ ์ƒ์œ„ ๋…ธ๋“œ๊ฐ€ ๋ถ€์ ํ•ฉํ•จ. [DOM] INVALID_NODE_TYPE_ERR (24)
"DataCloneError" ๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•  ์ˆ˜ ์—†์Œ. DATA_CLONE_ERR (25)
"EncodingError" ์ธ์ฝ”๋”ฉ(๋˜๋Š” ๋””์ฝ”๋”ฉ) ์ž‘์—…์ด ์‹คํŒจํ•จ. โ€”
"NotReadableError" I/O ์ฝ๊ธฐ ์ž‘์—…์ด ์‹คํŒจํ•จ. โ€”
"UnknownError" ์•Œ ์ˆ˜ ์—†๋Š” ์ผ์‹œ์  ์ด์œ (์˜ˆ: ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ)๋กœ ์—ฐ์‚ฐ์ด ์‹คํŒจํ•จ. โ€”
"ConstraintError" ํŠธ๋žœ์žญ์…˜์˜ ๋ณ€์ด ์ž‘์—…์ด ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์•„ ์‹คํŒจํ•จ. [INDEXEDDB] โ€”
"DataError" ์ œ๊ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถˆ์ถฉ๋ถ„ํ•จ. โ€”
"TransactionInactiveError" ์š”์ฒญ์ด ํ˜„์žฌ ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ์ข…๋ฃŒ๋œ ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•ด ์‹คํ–‰๋จ. [INDEXEDDB] โ€”
"ReadOnlyError" "readonly" ํŠธ๋žœ์žญ์…˜์—์„œ ๋ณ€์ด ์ž‘์—… ์‹œ๋„ํ•จ. [INDEXEDDB] โ€”
"VersionError" ๊ธฐ์กด ๋ฒ„์ „๋ณด๋‹ค ๋‚ฎ์€ ๋ฒ„์ „์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ด๋ ค๊ณ  ์‹œ๋„ํ•จ. [INDEXEDDB] โ€”
"OperationError" ์—ฐ์‚ฐ๋ณ„ ์ด์œ ๋กœ ์—ฐ์‚ฐ์ด ์‹คํŒจํ•จ. โ€”
"NotAllowedError" ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ ๋˜๋Š” ํ”Œ๋žซํผ์—์„œ ์š”์ฒญ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ(์˜ˆ: ์‚ฌ์šฉ์ž๊ฐ€ ๊ถŒํ•œ ๊ฑฐ๋ถ€ํ•จ). โ€”
"OptOutError" ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑฐ๋ถ€ํ•จ. โ€”

2.8.2. DOMException ํŒŒ์ƒ ์ธํ„ฐํŽ˜์ด์Šค

์˜ˆ์™ธ๊ฐ€ DOMException์˜ name์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์ •๋ณด ์™ธ์—, ์ถ”๊ฐ€๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ์กฐํšŒ ๊ฐ€๋Šฅํ•œ ์ •๋ณด๋ฅผ ๋‹ด์•„์•ผ ํ•  ๋•Œ, ๋ช…์„ธ ์ž‘์„ฑ์ž๋Š” DOMException๋ฅผ ์ƒ์†ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์Œ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค:

์ด ์š”๊ตฌ๋กœ ์ธํ•ด, ์ด๋Ÿฐ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒ์†๋œ code ํ”„๋กœํผํ‹ฐ๋Š” ํ•ญ์ƒ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

DOMException ํŒŒ์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ throwํ•˜๋ ค๋ฉด, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ์‹๋ณ„์ž์™€ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

QuotaExceededError ์ธ์Šคํ„ด์Šค๋ฅผ throwํ•˜๋ ค๋ฉด:

QuotaExceededError๋ฅผ throwํ•œ๋‹ค. quota๋Š” 42, requested๋Š” 50์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

2.8.3. ๋ฏธ๋ฆฌ ์ •์˜๋œ DOMException ํŒŒ์ƒ ์ธํ„ฐํŽ˜์ด์Šค

์ด ํ‘œ์ค€์—์„œ๋Š” ํ˜„์žฌ ๋ฏธ๋ฆฌ ์ •์˜๋œ DOMException ํŒŒ์ƒ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค:

[Exposed=*, Serializable]
interface QuotaExceededError : DOMException {
  constructor(optional DOMString message = "", optional QuotaExceededErrorOptions options = {});

  readonly attribute double? quota;
  readonly attribute double? requested;
};

dictionary QuotaExceededErrorOptions {
  double quota;
  double requested;
};

QuotaExceededError ์˜ˆ์™ธ๋Š” ํ• ๋‹น๋Ÿ‰์„ ์ดˆ๊ณผํ–ˆ์„ ๋•Œ throwํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์†์„ฑ(quota, requested)์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์‹ ์˜ ์š”์ฒญ๊ณผ ํ• ๋‹น๋Ÿ‰ ๊ฐ’์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ด์ „ ๋ฒ„์ „์˜ ํ‘œ์ค€์—์„œ๋Š” "QuotaExceededError"๊ฐ€ ๊ธฐ๋ณธ DOMException ์˜ค๋ฅ˜ ์ด๋ฆ„ ์ค‘ ํ•˜๋‚˜์˜€์œผ๋‚˜, ์ด๋Ÿฐ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ’€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์Šน๊ฒฉ๋˜์—ˆ๋‹ค.

๋ชจ๋“  QuotaExceededError ์ธ์Šคํ„ด์Šค๋Š” requested์™€ quota๋ผ๋Š” ๋‘ ๊ฐœ์˜ ์ˆซ์ž ๋˜๋Š” null ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ, ์ตœ์ดˆ ๊ฐ’์€ ๋ชจ๋‘ null์ด๋‹ค.

new QuotaExceededError(message, options) ์ƒ์„ฑ์ž ๋‹จ๊ณ„:
  1. this์˜ name์„ "QuotaExceededError"๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. this์˜ message๋ฅผ message๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. options["quota"]๊ฐ€ ์žˆ์œผ๋ฉด:

    1. options["quota"]๊ฐ€ 0๋ณด๋‹ค ์ž‘์œผ๋ฉด RangeError๋ฅผ throwํ•œ๋‹ค.

    2. this์˜ quota๋ฅผ options["quota"]๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. options["requested"]๊ฐ€ ์žˆ์œผ๋ฉด:

    1. options["requested"]๊ฐ€ 0๋ณด๋‹ค ์ž‘์œผ๋ฉด RangeError๋ฅผ throwํ•œ๋‹ค.

    2. this์˜ requested๋ฅผ options["requested"]๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. this ์˜ quota ๊ฐ€ null์ด ์•„๋‹ˆ๊ณ , this ์˜ requested ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉฐ, this ์˜ requested ๊ฐ€ this ์˜ quota ๋ณด๋‹ค ์ž‘์œผ๋ฉด RangeError ๋ฅผ throwํ•œ๋‹ค.

quota getter๋Š” this์˜ quota๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

requested getter๋Š” this์˜ requested๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

QuotaExceededError ์ธํ„ฐํŽ˜์ด์Šค๋Š” DOMException์˜ code getter๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉฐ, ํ•ญ์ƒ 22๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฐ’์— ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค(QuotaExceededError์™€ DOMException ๋ชจ๋‘์—์„œ). ๋Œ€์‹  name getter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค.


QuotaExceededError ๊ฐ์ฒด๋Š” ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์ด๋‹ค.

์ง๋ ฌํ™” ๋‹จ๊ณ„(value, serialized):
  1. DOMException์˜ ์ง๋ ฌํ™” ๋‹จ๊ณ„๋ฅผ value, serialized์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ๋‹ค.

  2. serialized.[[Quota]]๋ฅผ value์˜ quota๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. serialized.[[Requested]]๋ฅผ value์˜ requested๋กœ ์„ค์ •ํ•œ๋‹ค.

์—ญ์ง๋ ฌํ™” ๋‹จ๊ณ„(serialized, value):
  1. DOMException์˜ ์—ญ์ง๋ ฌํ™” ๋‹จ๊ณ„๋ฅผ serialized, value์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ๋‹ค.

  2. value์˜ quota๋ฅผ serialized.[[Quota]]๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. value์˜ requested๋ฅผ serialized.[[Requested]]๋กœ ์„ค์ •ํ•œ๋‹ค.


QuotaExceededError๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ throwํ•  ๋•Œ, requested์™€ quota๊ฐ€ ๋ชจ๋‘ null์ด ์•„๋‹ˆ๋ฉด์„œ requested๊ฐ€ quota๋ณด๋‹ค ์ž‘์œผ๋ฉด ์•ˆ ๋œ๋‹ค.

2.9. ์—ด๊ฑฐํ˜•

์—ด๊ฑฐํ˜•์ด๋ž€, Enum์— ์ผ์น˜ํ•˜๋Š” ์ •์˜๋กœ, ํƒ€์ž…์˜ ์œ ํšจ ๊ฐ’์ด ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ ๋ฌธ์ž์—ด ์ง‘ํ•ฉ์ธ ๊ฒƒ์„ ์„ ์–ธํ•œ๋‹ค. ์—ด๊ฑฐํ˜•์€ DOMString ๊ฐ’์ด ์†์„ฑ์— ํ• ๋‹น๋˜๊ฑฐ๋‚˜ ์—ฐ์‚ฐ์— ์ธ์ž๋กœ ์ „๋‹ฌ๋  ๋•Œ, ๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ์ œํ•œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

enum identifier { "enum", "values" /* , ... */ };

์—ด๊ฑฐํ˜• ๊ฐ’์€ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ string ๋ฆฌํ„ฐ๋Ÿด ๋ชฉ๋ก์œผ๋กœ ์ง€์ •ํ•œ๋‹ค. ์—ด๊ฑฐํ˜• ๊ฐ’ ๋ชฉ๋ก์—๋Š” ์ค‘๋ณต์ด ์žˆ์œผ๋ฉด ์•ˆ ๋œ๋‹ค.

์—ด๊ฑฐํ˜• ๊ฐ’์€ ๋ชจ๋‘ ์†Œ๋ฌธ์ž๋กœ ํ•˜๊ณ , ์—ฌ๋Ÿฌ ๋‹จ์–ด๋Š” ๋Œ€์‹œ(-)๋กœ ๊ตฌ๋ถ„ํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋œ๋‹ค. ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†์œผ๋ฉด ๋‹ค๋ฅธ ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ์ฒด ์ƒ์„ฑ ์˜๋ฏธ์˜ ๊ฐ’์€ "createobject" ๋˜๋Š” "create-object"๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ด€๋ จ API์—์„œ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋‹จ์–ด ๊ตฌ๋ถ„ ๋ฐฉ์‹๋„ ์‹ ์ค‘ํžˆ ๊ฒฐ์ •ํ•  ๊ฒƒ.

์—ด๊ฑฐํ˜• ํƒ€์ž… ์†์„ฑ์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฌธ์ž์—ด ๊ฐ’์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜, ์—ฐ์‚ฐ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ์˜ ๋™์ž‘์€ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

์ฐธ๊ณ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” ์†์„ฑ์— ์ž˜๋ชป๋œ ๋ฌธ์ž์—ด ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ๋ฌด์‹œ๋˜์ง€๋งŒ, ๋‹ค๋ฅธ ๋งฅ๋ฝ(์˜ˆ: ์—ฐ์‚ฐ ์ธ์ž)์—์„œ๋Š” ์˜ˆ์™ธ๊ฐ€ throw๋œ๋‹ค.

์ด ๋ช…์„ธ์—์„œ ์ •์˜๋œ ํ™•์žฅ ์†์„ฑ์€ ์—ด๊ฑฐํ˜•์— ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

Enum ::
    enum identifier { EnumValueList } ;
EnumValueList ::
    string EnumValueListComma
EnumValueListComma ::
    , EnumValueListString
    ฮต
EnumValueListString ::
    string EnumValueListComma
    ฮต

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์—ด๊ฑฐํ˜•์„ ์†์„ฑ ํƒ€์ž…๊ณผ ์—ฐ์‚ฐ ์ธ์ž๋กœ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์ด๋‹ค:

enum MealType { "rice", "noodles", "other" };

[Exposed=Window]
interface Meal {
  attribute MealType type;
  attribute double size;     // g ๋‹จ์œ„

  undefined initialize(MealType type, double size);
};

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌํ˜„์—์„œ๋Š” type ์†์„ฑ์ด๋‚˜ initialize ํ•จ์ˆ˜ ์ธ์ž์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์—ด๊ฑฐํ˜•์— ๋ช…์‹œ๋œ ๋ฌธ์ž์—ด๋กœ ์ œํ•œ๋œ๋‹ค.

var meal = getMeal();                // Meal ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ

meal.initialize("rice", 200);        // ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœ๋จ

try {
  meal.initialize("sandwich", 100);  // TypeError ๋ฐœ์ƒ
} catch (e) {
}

meal.type = "noodles";               // ์ •์ƒ ํ• ๋‹น
meal.type = "dumplings";             // ๋ฌด์‹œ๋จ
meal.type == "noodles";              // true ๋ฐ˜ํ™˜

2.10. ์ฝœ๋ฐฑ ํ•จ์ˆ˜

"Custom DOM Elements" ๋ช…์„ธ์—์„œ๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด ์ œ๊ณต ํ•จ์ˆ˜์—๋„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋Œ€์‹  ๊ทธ๋ƒฅ "ํ•จ์ˆ˜"๋กœ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์„œ ๋‘ ๊ฐ€์ง€ ์šฉ๋„ ๋ชจ๋‘ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ž€, callback CallbackRest์— ์ผ์น˜ํ•˜๋Š” ์ •์˜๋กœ, ํ•จ์ˆ˜ ํƒ€์ž…์„ ์„ ์–ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

callback identifier = return_type (/* arguments... */);

์ฐธ๊ณ : ์œ ์‚ฌ ์ด๋ฆ„์˜ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋“ฑํ˜ธ ์™ผ์ชฝ์˜ ์‹๋ณ„์ž๊ฐ€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ด๋ฆ„์ด๋ฉฐ, ์˜ค๋ฅธ์ชฝ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…๊ณผ ์ธ์ž ๋ชฉ๋ก(Type ๋ฐ ArgumentList)์ด ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ƒ์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ํ™•์žฅ ์†์„ฑ: [LegacyTreatNonObjectAsNull].

CallbackOrInterfaceOrMixin ::
    callback CallbackRestOrInterface
    interface InterfaceOrMixin
CallbackRest ::
    identifier = Type ( ArgumentList ) ;

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์—ฐ์‚ฐ์ด ์™„๋ฃŒ๋  ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” API์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

callback AsyncOperationCallback = undefined (DOMString status);

[Exposed=Window]
interface AsyncOperations {
  undefined performOperation(AsyncOperationCallback whenFinished);
};

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด๊ฐ€ ์—ฐ์‚ฐ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ๋‹ค.

var ops = getAsyncOperations();  // AsyncOperations ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ

ops.performOperation(function(status) {
  window.alert("Operation finished, status is " + status + ".");
});

2.11. ํƒ€์ž… ์ •์˜

ํƒ€์ž… ์ •์˜(typedef)๋ž€, Typedef์— ์ผ์น˜ํ•˜๋Š” ์ •์˜๋กœ, ํƒ€์ž…์— ์ƒˆ ์ด๋ฆ„์„ ์„ ์–ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ์ƒˆ ์ด๋ฆ„์€ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉฐ, IDL ๋‚ด์—์„œ ํƒ€์ž…์„ ์ฐธ์กฐํ•  ๋•Œ๋งŒ ์•ฝ์นญ์œผ๋กœ ์“ฐ์ž…๋‹ˆ๋‹ค.

typedef type identifier;

์ƒˆ ์ด๋ฆ„์„ ๋ถ€์—ฌ๋ฐ›๋Š” ํƒ€์ž…์€ typedef ํ‚ค์›Œ๋“œ ๋’ค์— ์ง€์ •๋˜๋ฉฐ(TypeWithExtendedAttributes์— ์ผ์น˜), ๊ทธ ๋’ค์˜ identifier ํ† ํฐ์ด ์ด๋ฆ„์ด ๋ฉ๋‹ˆ๋‹ค.

Type์€ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ typedef์˜ ์‹๋ณ„์ž๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ช…์„ธ์—์„œ ์ •์˜๋œ ํ™•์žฅ ์†์„ฑ์€ ํƒ€์ž… ์ •์˜์— ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Typedef ::
    typedef TypeWithExtendedAttributes identifier ;

์•„๋ž˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ํƒ€์ž… ์ •์˜(typedef)๋ฅผ ์‚ฌ์šฉํ•ด ๊ธด ์‹œํ€€์Šค ํƒ€์ž… ๋Œ€์‹  ์งง์€ ์‹๋ณ„์ž๋ฅผ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

[Exposed=Window]
interface Point {
  attribute double x;
  attribute double y;
};

typedef sequence<Point> Points;

[Exposed=Window]
interface Widget {
  boolean pointWithinBounds(Point p);
  boolean allPointsWithinBounds(Points ps);
};

2.12. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด

ํ•˜๋‚˜์˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๊ตฌํ˜„์—์„œ๋Š”, ๊ฐ์ฒด๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ๊ฐ์ฒด๋ž€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ž€ [Global] ํ™•์žฅ ์†์„ฑ์ด ์—†๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ๋‘˜ ๋‹ค๋ฅผ ์ง€์›ํ•˜๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š”, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ตฌํ˜„ํ•œ DOM ๊ฐ์ฒด๋“ค(Node, Document ๋“ฑ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„)์€ ํŽ˜์ด์ง€ ๋‚ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์›น ํŽ˜์ด์ง€ ๋‚ด์šฉ์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฐ์ฒด๋“ค์€ C++ ๋“ฑ์œผ๋กœ ๊ตฌํ˜„๋œ ํŠน์ˆ˜ ๊ฐ์ฒด์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋„ค์ดํ‹ฐ๋ธŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“ , ํ•˜๋‚˜์˜ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๊ตฌํ˜„์—์„œ๋Š”, ๋ชจ๋“  ํ”Œ๋žซํผ ๊ฐ์ฒด๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด์ž„์„ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜, ๊ฐ์ฒด๊ฐ€ ํŠน์ • C++ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„๋œ ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ์‹ ๋“ฑ์œผ๋กœ ์ด๋ค„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ธ์‹ํ• ์ง€๋Š” ๊ตฌํ˜„์ฒด๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๋‚ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์›น ํŽ˜์ด์ง€๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์™€ DOM Core๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ•ด๋„, ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ Node ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ๋งŒ๋“  ๊ฐ์ฒด๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ตฌํ˜„์ฒด๊ฐ€ Node๋ฅผ ๊ตฌํ˜„ํ•œ ํ”Œ๋žซํผ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ด๋–ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์›น API๊ฐ€ ์ €์ž(์‚ฌ์šฉ์ž) ์ •์˜ ์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, DOM Events ๊ตฌํ˜„์—์„œ๋Š” EventListener ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ์ฝœ๋ฐฑ ๋“ฑ๋ก์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.13. ํƒ€์ž…

์ด ์ ˆ์—์„œ๋Š” Web IDL์ด ์ง€์›ํ•˜๋Š” ํƒ€์ž…, ๊ฐ ํƒ€์ž…์— ๋Œ€์‘ํ•˜๋Š” ๊ฐ’์˜ ์ง‘ํ•ฉ ๋˜๋Š” Infra ํƒ€์ž…, ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํƒ€์ž…์˜ ์ƒ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„๋˜๋Š”์ง€๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํƒ€์ž…์€ ์ •์ˆ˜ ํƒ€์ž…์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค: byte, octet, short, unsigned short, long, unsigned long, long long ๋ฐ unsigned long long์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ํƒ€์ž…์€ ์ˆซ์ž ํƒ€์ž…์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค: ์ •์ˆ˜ ํƒ€์ž…, float, unrestricted float, double ๋ฐ unrestricted double์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํƒ€์ž…์€ bigint, boolean ๋ฐ ์ˆซ์ž ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ํƒ€์ž…์€ DOMString, ๋ชจ๋“  ์—ด๊ฑฐํ˜• ํƒ€์ž…, ByteString ๋ฐ USVString์ž…๋‹ˆ๋‹ค.

๋ฒ„ํผ ํƒ€์ž…์€ ArrayBuffer ๋ฐ SharedArrayBuffer์ž…๋‹ˆ๋‹ค.

ํ˜•์‹ํ™” ๋ฐฐ์—ด ํƒ€์ž…์€ Int8Array, Int16Array, Int32Array, Uint8Array, Uint16Array, Uint32Array, Uint8ClampedArray, BigInt64Array, BigUint64Array, Float16Array, Float32Array, ๋ฐ Float64Array์ž…๋‹ˆ๋‹ค.

๋ฒ„ํผ ๋ทฐ ํƒ€์ž…์€ DataView ๋ฐ ํ˜•์‹ํ™” ๋ฐฐ์—ด ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž…์€ ๋ฒ„ํผ ํƒ€์ž… ๋ฐ ๋ฒ„ํผ ๋ทฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

object ํƒ€์ž…, ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๋ฐ ๋ชจ๋“  ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์€ ๊ฐ์ฒด ํƒ€์ž…์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Type ::
    SingleType
    UnionType Null
TypeWithExtendedAttributes ::
    ExtendedAttributeList Type
SingleType ::
    DistinguishableType
    any
    PromiseType
UnionType ::
    ( UnionMemberType or UnionMemberType UnionMemberTypes )
UnionMemberType ::
    ExtendedAttributeList DistinguishableType
    UnionType Null
UnionMemberTypes ::
    or UnionMemberType UnionMemberTypes
    ฮต
DistinguishableType ::
    PrimitiveType Null
    StringType Null
    identifier Null
    sequence < TypeWithExtendedAttributes > Null
    async_sequence < TypeWithExtendedAttributes > Null
    object Null
    symbol Null
    BufferRelatedType Null
    FrozenArray < TypeWithExtendedAttributes > Null
    ObservableArray < TypeWithExtendedAttributes > Null
    RecordType Null
    undefined Null
ConstType ::
    PrimitiveType
    identifier
PrimitiveType ::
    UnsignedIntegerType
    UnrestrictedFloatType
    boolean
    byte
    octet
    bigint
UnrestrictedFloatType ::
    unrestricted FloatType
    FloatType
FloatType ::
    float
    double
UnsignedIntegerType ::
    unsigned IntegerType
    IntegerType
IntegerType ::
    short
    long OptionalLong
OptionalLong ::
    long
    ฮต
StringType ::
    ByteString
    DOMString
    USVString
PromiseType ::
    Promise < Type >
RecordType ::
    record < StringType , TypeWithExtendedAttributes >
Null ::
    ?
    ฮต

2.13.1. any

any ํƒ€์ž…์€ ๋ชจ๋“  ๋‹ค๋ฅธ non-union ํƒ€์ž…์˜ ํ•ฉ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

any ํƒ€์ž…์€ ๊ฐ ๊ฐ’์ด ํŠน์ • non-any ํƒ€์ž…๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์—์„œ discriminated union ํƒ€์ž…๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, any ํƒ€์ž…์˜ ํ•œ ๊ฐ’์€ unsigned long 150์ด๊ณ , ๋˜ ๋‹ค๋ฅธ ๊ฐ’์€ long 150์ž…๋‹ˆ๋‹ค. ์ด ๋‘˜์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์ž…๋‹ˆ๋‹ค.

any ๊ฐ’์˜ ํŠน์ • ํƒ€์ž…์€ ํŠน์ • ํƒ€์ž…์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. (union ํƒ€์ž…์˜ ๊ฐ’๋„ ํŠน์ • ํƒ€์ž…์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.)

2.13.2. undefined

undefined ํƒ€์ž…์€ ๊ณ ์œ ํ•œ ๊ฐ’์„ ํ•˜๋‚˜๋งŒ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

undefined ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ undefined ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

undefined ํƒ€์ž…์€ ์–ด๋–ค ๊ฒฝ์šฐ์—๋„(์—ฐ์‚ฐ, ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ƒ์„ฑ์ž ์—ฐ์‚ฐ ๋“ฑ) ์ธ์ž ํƒ€์ž…์ด๋‚˜, ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„ ํƒ€์ž…(์ง์ ‘ ๋˜๋Š” union ๋‚ด)์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์˜ต์…˜ ์ธ์ž๋‚˜, non-ํ•„์ˆ˜ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ฐธ๊ณ : ์ด ๊ฐ’์€ ์ด์ „์—๋Š” void๋กœ ํ‘œ๊ธฐ๋˜์—ˆ์œผ๋ฉฐ, ์‚ฌ์šฉ ๋ฐฉ์‹์ด ๋” ์ œํ•œ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

2.13.3. boolean

boolean ํƒ€์ž…์€ ๋ถˆ๋ฆฌ์–ธ๊ณผ ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

boolean ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ true์™€ false ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.4. byte

byte ํƒ€์ž…์€ 8๋น„ํŠธ ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜์™€ ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

byte ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ integer ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.5. octet

octet ํƒ€์ž…์€ 8๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜์™€ ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

octet ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ integer ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.6. short

short ํƒ€์ž…์€ 16๋น„ํŠธ ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜์™€ ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

short ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ integer ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.7. unsigned short

unsigned short ํƒ€์ž…์€ 16๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜์™€ ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

unsigned short ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ integer ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.8. long

long ํƒ€์ž…์€ 32๋น„ํŠธ ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜์™€ ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

long ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ integer ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.9. unsigned long

unsigned long ํƒ€์ž…์€ 32๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜์™€ ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

unsigned long ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ integer ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.10. long long

long long ํƒ€์ž…์€ 64๋น„ํŠธ ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜์™€ ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

long long ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ integer ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.11. unsigned long long

unsigned long long ํƒ€์ž…์€ 64๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜์™€ ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

unsigned long long ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ integer ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.12. float

float ํƒ€์ž…์€ ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž ํƒ€์ž…์œผ๋กœ, ์œ ํ•œํ•œ ๋‹จ์ •๋ฐ€๋„ 32๋น„ํŠธ IEEE 754 ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž ์ง‘ํ•ฉ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. [IEEE-754]

float ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ decimal ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

32๋น„ํŠธ ๋ถ€๋™์†Œ์ˆ˜์  ํƒ€์ž…์„ ํŠน๋ณ„ํžˆ ์จ์•ผ ํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด, double์„ float ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. double์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ์ง‘ํ•ฉ์ด JavaScript Number์™€ ๋” ์œ ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2.13.13. unrestricted float

unrestricted float ํƒ€์ž…์€ ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž ํƒ€์ž…์œผ๋กœ, ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๋‹จ์ •๋ฐ€๋„ 32๋น„ํŠธ IEEE 754 ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’(์œ ํ•œ, ๋ฌดํ•œ ๋ฐ NaN)์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. [IEEE-754]

unrestricted float ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ decimal ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.14. double

double ํƒ€์ž…์€ ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž ํƒ€์ž…์œผ๋กœ, ์œ ํ•œํ•œ ๋ฐฐ์ •๋ฐ€๋„ 64๋น„ํŠธ IEEE 754 ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž ์ง‘ํ•ฉ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. [IEEE-754]

double ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ decimal ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.15. unrestricted double

unrestricted double ํƒ€์ž…์€ ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž ํƒ€์ž…์œผ๋กœ, ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๋ฐฐ์ •๋ฐ€๋„ 64๋น„ํŠธ IEEE 754 ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’(์œ ํ•œ, ๋ฌดํ•œ ๋ฐ NaN)์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. [IEEE-754]

unrestricted double ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ decimal ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.16. bigint

bigint ํƒ€์ž…์€ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋˜์ง€ ์•Š์€ ์ž„์˜์˜ ์ •์ˆ˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

bigint ์ƒ์ˆ˜ ๊ฐ’์€ IDL์—์„œ integer ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

2.13.17. DOMString

DOMString ํƒ€์ž…์€ ๋ฌธ์ž์—ด๊ณผ ๋Œ€์‘๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : null์€ DOMString ํƒ€์ž…์˜ ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค. null์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ๋„ ํ—ˆ์šฉ DOMString, ์ฆ‰ IDL์—์„œ DOMString?์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : DOMString ๊ฐ’์—๋Š” ๋งค์น˜๋˜์ง€ ์•Š๋Š” ์„œ๋กœ๊ฒŒ์ดํŠธ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ USVString์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

IDL์—์„œ๋Š” DOMString ์ƒ์ˆ˜ ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ DOMString ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„ ๊ธฐ๋ณธ๊ฐ’์ด๋‚˜ ์—ฐ์‚ฐ ์˜ต์…˜ ์ธ์ž ๊ธฐ๋ณธ๊ฐ’์—๋Š” ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด ํ† ํฐ์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.13.18. ByteString

ByteString ํƒ€์ž…์€ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.

IDL์—์„œ๋Š” ์ƒ์ˆ˜ ByteString ๊ฐ’์„ ๋‚˜ํƒ€๋‚ผ ๋ฐฉ๋ฒ•์ด ์—†์ง€๋งŒ, ByteString ์‚ฌ์ „ ๋ฉค๋ฒ„์˜ ๊ธฐ๋ณธ๊ฐ’ ๋ฐ ์—ฐ์‚ฐ์˜ ์„ ํƒ์  ์ธ์ˆ˜ ๊ธฐ๋ณธ๊ฐ’์€ string ๋ฆฌํ„ฐ๋Ÿด์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…์„ธ์—์„œ๋Š” ByteString์„ HTTP์™€ ๊ฐ™์ด ๋ฐ”์ดํŠธ์™€ ๋ฌธ์ž์—ด์„ ์„œ๋กœ ๋ฐ”๊พธ์–ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ž์—ด์€ DOMString ๊ฐ’์œผ๋กœ ๋‚˜ํƒ€๋‚ด์•ผ ํ•˜๋ฉฐ, ๋ฌธ์ž์—ด์˜ ๊ฐ’์ด ํ•ญ์ƒ ASCII ๋˜๋Š” ์–ด๋–ค 8๋น„ํŠธ ๋ฌธ์ž ์ธ์ฝ”๋”ฉ์— ์†ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. octet ๋˜๋Š” ์‹œํ€€์Šค๋‚˜ ๊ณ ์ • ๋ฐฐ์—ด์— byte ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Uint8Array, ๋˜๋Š” Int8Array๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 8๋น„ํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•ด์•ผ ํ•˜๋ฉฐ, ByteString์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

2.13.19. USVString

USVString ํƒ€์ž…์€ ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ๋งฅ์— ๋”ฐ๋ผ ์ด๋“ค์€ ์ฝ”๋“œ ๋‹จ์œ„์˜ ์‹œํ€€์Šค ๋˜๋Š” ์Šค์นผ๋ผ ๊ฐ’์˜ ์‹œํ€€์Šค๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IDL์—์„œ๋Š” ์ƒ์ˆ˜ USVString ๊ฐ’์„ ๋‚˜ํƒ€๋‚ผ ๋ฐฉ๋ฒ•์ด ์—†์ง€๋งŒ, USVString ์‚ฌ์ „ ๋ฉค๋ฒ„์˜ ๊ธฐ๋ณธ๊ฐ’ ๋ฐ ์—ฐ์‚ฐ์˜ ์„ ํƒ์  ์ธ์ˆ˜ ๊ธฐ๋ณธ๊ฐ’์€ string ๋ฆฌํ„ฐ๋Ÿด์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…์„ธ์„œ๋Š” USVString์„ ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ API์—์„œ ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ž์—ด ์‚ฌ์šฉ API์—์„œ๋Š” DOMString์„ ์จ์•ผ ํ•˜๋ฉฐ, ํ•ด๋‹น ๋ฌธ์ž์—ด์˜ ์ฝ”๋“œ ์œ ๋‹›์„ ํ•ด์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ—ท๊ฐˆ๋ฆด ๊ฒฝ์šฐ DOMString์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

2.13.20. object

object ํƒ€์ž…์€ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  non-null ๊ฐ์ฒด ์ฐธ์กฐ ์ง‘ํ•ฉ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.

IDL์—์„œ๋Š” object ์ƒ์ˆ˜ ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฐ์ฒด ์ฐธ์กฐ์™€ null ๊ฐ’์„ ํฌํ•จํ•˜๋Š” ํƒ€์ž…์„ ์ง€์ •ํ•˜๋ ค๋ฉด ๋„ ํ—ˆ์šฉ ํƒ€์ž… object?๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

2.13.21. symbol

symbol ํƒ€์ž…์€ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์‹ฌ๋ณผ ๊ฐ’ ์ง‘ํ•ฉ์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค. ์‹ฌ๋ณผ ๊ฐ’์€ ๋ถˆํˆฌ๋ช…ํ•˜๋ฉฐ, object ๊ฐ’์€ ์•„๋‹ˆ์ง€๋งŒ ๊ณ ์œ ์„ฑ(์ž๊ธฐ ์ž์‹ ๊ณผ๋งŒ ๊ฐ™์Œ)์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

IDL์—์„œ๋Š” symbol ์ƒ์ˆ˜ ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

2.13.22. ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…

์‹๋ณ„์ž๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•˜๋ฉด, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” non-null ๊ฐ์ฒด ์ฐธ์กฐ์˜ ์ง‘ํ•ฉ์„ ํƒ€์ž…์œผ๋กœ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ IDL ๊ฐ’์€ ๊ฐ์ฒด ์ฐธ์กฐ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์— ๋Œ€ํ•œ ์ƒ์ˆ˜ ๊ฐ์ฒด ์ฐธ์กฐ ๊ฐ’์„ IDL์—์„œ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด ์ฐธ์กฐ์™€ null์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ํƒ€์ž…์„ ์ง€์ •ํ•˜๋ ค๋ฉด ๋„ ํ—ˆ์šฉ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

2.13.23. ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…

์‹๋ณ„์ž๊ฐ€ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•˜๋ฉด, ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ non-null ๊ฐ์ฒด ์ฐธ์กฐ ์ง‘ํ•ฉ์„ ํƒ€์ž…์œผ๋กœ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ IDL ๊ฐ’์€ ๊ฐ์ฒด ์ฐธ์กฐ์™€ ์ฝœ๋ฐฑ ์ปจํ…์ŠคํŠธ์˜ ํŠœํ”Œ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ ์ปจํ…์ŠคํŠธ๋Š” ์–ธ์–ด ๋ฐ”์ธ๋”ฉ๋ณ„ ๊ฐ’์ด๋ฉฐ, ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์—์„œ๋Š” ์ฝœ๋ฐฑ ์ปจํ…์ŠคํŠธ์— Object ๊ฐ’์ด IDL ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋  ๋•Œ์˜ incumbent settings object ์ฐธ์กฐ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ยงโ€ฏ3.2.16 Callback interface types ์ฐธ๊ณ .

ํŠน์ • ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์— ๋Œ€ํ•œ ์ƒ์ˆ˜ ๊ฐ์ฒด ์ฐธ์กฐ ๊ฐ’์„ IDL์—์„œ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฐ์ฒด ์ฐธ์กฐ์™€ null์„ ํฌํ•จํ•˜๋Š” ํƒ€์ž…์„ ์ง€์ •ํ•˜๋ ค๋ฉด ๋„ ํ—ˆ์šฉ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

2.13.24. ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…

์‹๋ณ„์ž๊ฐ€ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๋ฉด, ํ•ด๋‹น ๋”•์…”๋„ˆ๋ฆฌ ์ •์˜๋ฅผ ๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ๋”•์…”๋„ˆ๋ฆฌ ์ง‘ํ•ฉ์„ ํƒ€์ž…์œผ๋กœ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

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

2.13.25. ์—ด๊ฑฐํ˜• ํƒ€์ž…

์‹๋ณ„์ž๊ฐ€ ์—ด๊ฑฐํ˜•์„ ์‹๋ณ„ํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ ์‹๋ณ„์ž๋Š” ๊ฐ’์ด ๋ฌธ์ž์—ด ์ง‘ํ•ฉ(์ฝ”๋“œ ๋‹จ์œ„์˜ ์‹œํ€€์Šค์ด๋ฉฐ, DOMString๊ณผ ๊ฐ™์Œ)์ธ ํƒ€์ž…์„ ์ฐธ์กฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด ๋ฌธ์ž์—ด๋“ค์€ ์—ด๊ฑฐํ˜•์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.

DOMString๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, IDL์—์„œ๋Š” ์ƒ์ˆ˜ ์—ด๊ฑฐํ˜• ๊ฐ’์„ ๋‚˜ํƒ€๋‚ผ ๋ฐฉ๋ฒ•์ด ์—†์ง€๋งŒ, ์—ด๊ฑฐํ˜• ํƒ€์ž…์˜ ์‚ฌ์ „ ๋ฉค๋ฒ„ ๊ธฐ๋ณธ ๊ฐ’ ๋ฐ ์—ฐ์‚ฐ์˜ ์„ ํƒ์  ์ธ์ˆ˜ ๊ธฐ๋ณธ๊ฐ’์€ string ๋ฆฌํ„ฐ๋Ÿด์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.13.26. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž…

์‹๋ณ„์ž๊ฐ€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉด, ํ•ด๋‹น ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ํ•จ์ˆ˜ ๊ฐ์ฒด ์ฐธ์กฐ ์ง‘ํ•ฉ์„ ํƒ€์ž…์œผ๋กœ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : [LegacyTreatNonObjectAsNull] ํ™•์žฅ ์†์„ฑ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ •์˜์— ์ง€์ •๋œ ๊ฒฝ์šฐ, ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด ์ฐธ์กฐ๋„ ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž…์˜ IDL ๊ฐ’์€ ๊ฐ์ฒด ์ฐธ์กฐ์™€ ์ฝœ๋ฐฑ ์ปจํ…์ŠคํŠธ์˜ ํŠœํ”Œ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ฝœ๋ฐฑ ์ปจํ…์ŠคํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Object ๊ฐ’์ด IDL ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž… ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋  ๋•Œ์˜ incumbent settings object ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์“ฐ์ž…๋‹ˆ๋‹ค. ยงโ€ฏ3.2.19 Callback function types ์ฐธ๊ณ .

IDL์—์„œ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ƒ์ˆ˜ ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

2.13.27. ๋„ ํ—ˆ์šฉ ํƒ€์ž… โ€” T?

๋„ ํ—ˆ์šฉ ํƒ€์ž…์€ ๊ธฐ์กด ํƒ€์ž…(์ด๋ฅผ ๋‚ด๋ถ€ ํƒ€์ž…์ด๋ผ ํ•จ)์—์„œ null ๊ฐ’์„ ์ถ”๊ฐ€๋กœ ํ—ˆ์šฉํ•˜๋Š” IDL ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ๋„ ํ—ˆ์šฉ ํƒ€์ž…์€ IDL์—์„œ ๊ธฐ์กด ํƒ€์ž… ๋’ค์— U+003F(?)๋ฅผ ๋ถ™์—ฌ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ํƒ€์ž…์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

์ฐธ๊ณ : ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋„ ํ—ˆ์šฉ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฐ์‚ฐ ์ธ์ˆ˜ ๋˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„์˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋„ ํ—ˆ์šฉ์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ž„์˜์˜ ํƒ€์ž… ๋˜๋Š” ํƒ€์ž… ๋ฒ”์ฃผ X์— ๋Œ€ํ•ด, ์ž ์žฌ์ ์œผ๋กœ ๋„ ํ—ˆ์šฉ X๋Š” X์ด๊ฑฐ๋‚˜ ๋„ ํ—ˆ์šฉ ํƒ€์ž…์ด๋ฉฐ, ๊ทธ ๋‚ด๋ถ€ ํƒ€์ž…์€ X์ž…๋‹ˆ๋‹ค.

IDL์—์„œ ๋„ ํ—ˆ์šฉ ํƒ€์ž… ์ƒ์ˆ˜ ๊ฐ’์€ ํ•ด๋‹น ๋‚ด๋ถ€ ํƒ€์ž…์˜ ์ƒ์ˆ˜ ๊ฐ’๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„๋˜๊ฑฐ๋‚˜ null ํ† ํฐ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, true, false, null ๊ฐ’์„ ํ—ˆ์šฉํ•˜๋Š” ํƒ€์ž…์€ boolean?์œผ๋กœ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค:

[Exposed=Window]
interface NetworkFetcher {
  undefined get(optional boolean? areWeThereYet = false);
};

๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๋‘ ๊ฐœ์˜ ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” DOMString ๋˜๋Š” null ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Node ๊ฐ์ฒด ์ฐธ์กฐ ๋˜๋Š” null ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

[Exposed=Window]
interface Node {
  readonly attribute DOMString? namespaceURI;
  readonly attribute Node? parentNode;
  // ...
};

2.13.28. ์‹œํ€€์Šค ํƒ€์ž… โ€” sequence<T>

sequence<T> ํƒ€์ž…์€ (๊ธธ์ด๊ฐ€ 0์ผ ์ˆ˜๋„ ์žˆ๋Š”) ๋ฆฌ์ŠคํŠธ๋กœ, ๊ฐ ๊ฐ’์ด T ํƒ€์ž…์ธ ๋ฆฌ์ŠคํŠธ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

์‹œํ€€์Šค๋Š” ํ•ญ์ƒ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์‹œํ€€์Šค๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋˜๋Š” ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์—์„œ๋Š”, ์‹œํ€€์Šค๋ฅผ ํ”Œ๋žซํผ ๊ฐ์ฒด์— ์ „๋‹ฌํ•ด๋„ ํ•ด๋‹น ๊ฐ์ฒด์— ์‹œํ€€์Šค ์ฐธ์กฐ๊ฐ€ ๋‚จ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”Œ๋žซํผ ๊ฐ์ฒด์—์„œ ๋ฐ˜ํ™˜๋œ ์‹œํ€€์Šค๋„ ๋ณต์‚ฌ๋ณธ์ด๋ฉฐ, ์ด๋ฅผ ์ˆ˜์ •ํ•ด๋„ ํ”Œ๋žซํผ ๊ฐ์ฒด์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์‹œํ€€์Šค๋Š” ์†์„ฑ์ด๋‚˜ ์ƒ์ˆ˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ์ œํ•œ์€ ๋ช…์„ธ ์ž‘์„ฑ์ž์™€ API ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹œํ€€์Šค๊ฐ€ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค๋Š” ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œํ€€์Šค ํƒ€์ž…์˜ ์†์„ฑ ๋Œ€์‹ , ์‹œํ€€์Šค๋ฅผ get/setํ•˜๋Š” ์—ฐ์‚ฐ์„ ์Œ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฆฌ์ŠคํŠธ๋„, ๊ทธ ํ•ญ๋ชฉ์ด ๋ชจ๋‘ T ํƒ€์ž…์ด๋ฉด ์•”๋ฌต์ ์œผ๋กœ sequence<T>๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.13.29. ๋น„๋™๊ธฐ ์‹œํ€€์Šค ํƒ€์ž… โ€” async_sequence<T>

async_sequence ํƒ€์ž…์€ T ํƒ€์ž… ๊ฐ’์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ดํ„ฐ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ๋Š”(๋ฌดํ•œ ๊ฐ€๋Šฅ์„ฑ ํฌํ•จ) ๊ฐ์ฒด ์ฐธ์กฐ ์ง‘ํ•ฉ์„ ํƒ€์ž…์œผ๋กœ ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐํ™” ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

์‹œํ€€์Šค์™€ ๋‹ฌ๋ฆฌ, ๋น„๋™๊ธฐ ์‹œํ€€์Šค๋Š” ๊ณ ์ • ๊ธธ์ด ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๊ฐ’์ด ๋ฏธ๋ฆฌ ์•Œ๋ ค์ง„ ์ƒํƒœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. async_sequence๋กœ ์ƒ์„ฑ๋œ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์‹œํ€€์Šค๋Š” lazyํ•˜๋ฉฐ, ๊ฐ’์€ ์ดํ„ฐ๋ ˆ์ด์…˜ ์ค‘์—๋งŒ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ’์ด๋‚˜ ๊ธธ์ด๋Š” ์‹œํ€€์Šค ์ƒ์„ฑ ์‹œ์ ์— ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์–ธ์–ด ๋ฐ”์ธ๋”ฉ์—์„œ async_sequence๊ฐ€ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋˜๋Š” ๊ฒฝ์šฐ ์ฐธ์กฐ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, async_sequence๋ฅผ ํ”Œ๋žซํผ ๊ฐ์ฒด์— ์ „๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด์— ์ฐธ์กฐ๊ฐ€ ๋‚จ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ ๊ฐ์ฒด์—์„œ ๋ฐ˜ํ™˜๋œ async_sequence๋„ ๋™์ผ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ด๋ฉฐ, ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ํ”Œ๋žซํผ ๊ฐ์ฒด์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•ญ์ƒ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ์‹œํ€€์Šค์™€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ฐธ๊ณ : async_sequence๋Š” IDL์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์—์„œ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„ ํƒ€์ž…์œผ๋กœ ์“ธ ๊ฒฝ์šฐ, async_sequence๋Š” ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์ƒ์„ฑ๋˜์–ด ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด IDL ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์—์„œ async_sequence๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹ , ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค์— ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์„ ๋‘ฌ์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async_sequence๋Š” ์†์„ฑ์ด๋‚˜ ์ƒ์ˆ˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

IDL์—์„œ๋Š” async_sequence ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

2.13.30. ๋ ˆ์ฝ”๋“œ ํƒ€์ž… โ€” record<K, V>

๋ ˆ์ฝ”๋“œ ํƒ€์ž…์€ ๊ฐ’์ด ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋งต์ธ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํƒ€์ž…์ด๋ฉฐ, ํ‚ค๋Š” K์˜ ์ธ์Šคํ„ด์Šค์ด๊ณ  ๊ฐ’์€ V์˜ ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค. K๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. DOMString, USVString, ๋˜๋Š” ByteString.

์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋งต์˜ ๋ฆฌํ„ฐ๋Ÿด ๊ตฌ๋ฌธ์€ ๋ฌธ๋งฅ์ƒ ํ•ด๋‹น ๋งต์ด ๋ ˆ์ฝ”๋“œ๋กœ ์ทจ๊ธ‰๋œ๋‹ค๋Š” ๊ฒƒ์ด ์•”๋ฌต์ ์œผ๋กœ ์ดํ•ด๋˜๋Š” ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ IDL ์กฐ๊ฐ ๋‚ด๋ถ€์—์„œ ์ƒ์ˆ˜ ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ผ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

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

๋ ˆ์ฝ”๋“œ๋Š” ์†์„ฑ ๋˜๋Š” ์ƒ์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋งต์€ ๋‹ค์Œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ํ•œ ์•”๋ฌต์ ์œผ๋กœ record<K, V>๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋งต์—๋Š” ํ•ญ๋ชฉ๋งŒ ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ํ‚ค๋Š” ๋ชจ๋‘ K ํƒ€์ž…์ด๊ณ  ๊ทธ ๊ฐ’์€ ๋ชจ๋‘ V ํƒ€์ž…์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.13.31. ํ”„๋ผ๋ฏธ์Šค ํƒ€์ž… โ€” Promise<T>

ํ”„๋ผ๋ฏธ์Šค ํƒ€์ž…์€ ํŒŒ๋ผ๋ฏธํ„ฐํ™”๋œ ํƒ€์ž…์œผ๋กœ, ๊ฐ’์ด ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜์ค‘์— ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” โ€œ์ž๋ฆฌ ํ‘œ์‹œ์žโ€ ๊ฐ์ฒด ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ํ”„๋ผ๋ฏธ์Šค ๊ฐ์ฒด ์˜๋ฏธ๋Š” JavaScript ๋ช…์„ธ section 25.4 ์ฐธ๊ณ .

ํ”„๋ผ๋ฏธ์Šค ํƒ€์ž…์€ ๋„ ํ—ˆ์šฉ์ด ์•„๋‹ˆ์ง€๋งŒ, T๋Š” ๋„ ํ—ˆ์šฉ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IDL์—์„œ๋Š” ํ”„๋ผ๋ฏธ์Šค ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

2.13.32. ์œ ๋‹ˆ์˜จ ํƒ€์ž…

์œ ๋‹ˆ์˜จ ํƒ€์ž…์€ ๊ฐ’ ์ง‘ํ•ฉ์ด ๋‘ ๊ฐœ ์ด์ƒ์˜ ํƒ€์ž… ๊ฐ’ ์ง‘ํ•ฉ์˜ ํ•ฉ์ง‘ํ•ฉ์ด ๋˜๋Š” ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์œ ๋‹ˆ์˜จ ํƒ€์ž…(UnionType์— ์ผ์น˜)์€ ํƒ€์ž…๋“ค์„ or๋กœ ๊ตฌ๋ถ„ํ•ด ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์œ ๋‹ˆ์˜จ ํƒ€์ž…์„ ๊ตฌ์„ฑํ•˜๋Š” ํƒ€์ž…๋“ค์„ ์œ ๋‹ˆ์˜จ์˜ ๋ฉค๋ฒ„ ํƒ€์ž…์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด (Node or DOMString) ๋˜๋Š” (double or sequence<double>)์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ๋‹ˆ์˜จ ํƒ€์ž… ์ „์ฒด์— ?๋ฅผ ๋ถ™์ผ ๋•Œ๋Š” ๋‹ซ๋Š” ๊ด„ํ˜ธ ๋’ค์— ๋ถ™์—ฌ (Node or DOMString)?์ฒ˜๋Ÿผ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์œ ๋‹ˆ์˜จ ํƒ€์ž…์˜ ๋ฉค๋ฒ„ ํƒ€์ž…์€ ์ค‘์ฒฉ๋œ ์œ ๋‹ˆ์˜จ ํƒ€์ž… ์•ˆ๊นŒ์ง€ ๋‚ด๋ ค๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด (double or (sequence<long> or Event) or (Node or DOMString)?)์˜ ๋ฉค๋ฒ„ ํƒ€์ž…์€ double, (sequence<long> or Event), (Node or DOMString)?์ž…๋‹ˆ๋‹ค.

any ํƒ€์ž…์ฒ˜๋Ÿผ, ์œ ๋‹ˆ์˜จ ํƒ€์ž… ๊ฐ’๋„ ํŠน์ • ํƒ€์ž…์„ ๊ฐ€์ง€๋ฉฐ, ์ด๋Š” ํ•ด๋‹น ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฉค๋ฒ„ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

์œ ๋‹ˆ์–ธ ํƒ€์ž…์˜ ํ‰ํƒ„ํ™”๋œ ๋ฉค๋ฒ„ ํƒ€์ž…์€, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ฃผ์„์ด ์ง€์ •๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ์ •๋˜๋Š” ํƒ€์ž…์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค:

  1. T๋ฅผ ์œ ๋‹ˆ์–ธ ํƒ€์ž…์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. S๋ฅผ โˆ…๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  3. T์˜ ๊ฐ ๋ฉค๋ฒ„ ํƒ€์ž… U์— ๋Œ€ํ•ด:

    1. U๊ฐ€ ์ฃผ์„์ด ์ง€์ •๋œ ํƒ€์ž…์ธ ๊ฒฝ์šฐ, U๋ฅผ U์˜ ๋‚ด๋ถ€ ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. U๊ฐ€ ๋„ ํ—ˆ์šฉ ํƒ€์ž…์ธ ๊ฒฝ์šฐ, U๋ฅผ U์˜ ๋‚ด๋ถ€ ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. U๊ฐ€ ์œ ๋‹ˆ์–ธ ํƒ€์ž…์ธ ๊ฒฝ์šฐ, S์— U์˜ ํ‰ํƒ„ํ™”๋œ ๋ฉค๋ฒ„ ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, U๋Š” ์œ ๋‹ˆ์–ธ ํƒ€์ž…์ด ์•„๋‹™๋‹ˆ๋‹ค. U๋ฅผ S์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. S๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ ๋‹ˆ์˜จ ํƒ€์ž… (Node or (sequence<long> or Event) or (XMLHttpRequest or DOMString)? or sequence<(sequence<double> or NodeList)>)์˜ ํ‰ํƒ„ํ™”๋œ ๋ฉค๋ฒ„ ํƒ€์ž…์€ Node, sequence<long>, Event, XMLHttpRequest, DOMString, sequence<(sequence<double> or NodeList)>์ž…๋‹ˆ๋‹ค.

๋„ ํ—ˆ์šฉ ๋ฉค๋ฒ„ ํƒ€์ž…์˜ ์ˆ˜๋Š” ์œ ๋‹ˆ์–ธ ํƒ€์ž…์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ์ •๋˜๋Š” ์ •์ˆ˜์ž…๋‹ˆ๋‹ค:

  1. T๋ฅผ ์œ ๋‹ˆ์–ธ ํƒ€์ž…์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. n์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  3. T์˜ ๊ฐ ๋ฉค๋ฒ„ ํƒ€์ž… U์— ๋Œ€ํ•ด:

    1. U๊ฐ€ ๋„ ํ—ˆ์šฉ ํƒ€์ž…์ธ ๊ฒฝ์šฐ:

      1. n์„ n + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. U๋ฅผ U์˜ ๋‚ด๋ถ€ ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. U๊ฐ€ ์œ ๋‹ˆ์–ธ ํƒ€์ž…์ธ ๊ฒฝ์šฐ:

      1. m์„ U์˜ ๋„ ํ—ˆ์šฉ ๋ฉค๋ฒ„ ํƒ€์ž…์˜ ์ˆ˜๋กœ ๋‘ก๋‹ˆ๋‹ค.

      2. n์„ n + m์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. n์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

any ํƒ€์ž…์€ ์œ ๋‹ˆ์–ธ ๋ฉค๋ฒ„ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋„ ํ—ˆ์šฉ ๋ฉค๋ฒ„ ํƒ€์ž…์˜ ์ˆ˜๋Š” ์œ ๋‹ˆ์–ธ ํƒ€์ž…์—์„œ ๋ฐ˜๋“œ์‹œ 0 ๋˜๋Š” 1์ด์–ด์•ผ ํ•˜๋ฉฐ, 1์ธ ๊ฒฝ์šฐ ์œ ๋‹ˆ์–ธ ํƒ€์ž…์˜ ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์ด ํ‰ํƒ„ํ™”๋œ ๋ฉค๋ฒ„ ํƒ€์ž…์—๋„ ์žˆ์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…์ด ๋‹ค์Œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋ฉด ๋„ ํ—ˆ์šฉ ํƒ€์ž…์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

์œ ๋‹ˆ์–ธ ํƒ€์ž…์— ์žˆ๋Š” ํ‰ํƒ„ํ™”๋œ ๋ฉค๋ฒ„ ํƒ€์ž…์˜ ๊ฐ ์Œ, T์™€ U๋Š” ๋ฐ˜๋“œ์‹œ ๊ตฌ๋ณ„ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

bigint์™€ ์ˆซ์ž ํƒ€์ž…์˜ ์œ ๋‹ˆ์–ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” NumberFormat๊ณผ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์˜๋„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ„์‚ฐ์— ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ๋‹ˆ์–ธ์„ ๋ฐ›์•„๋“ค์ธ ๋‹ค์Œ ์ˆซ์ž ํƒ€์ž…์˜ ๊ฐ’์„ bigint๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ถ”๊ฐ€๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ ์ ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ •๋ฐ€๋„ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ด์Šˆ๋ฅผ ์ œ์ถœํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํƒ€์ž…์ด ๋‹ค์Œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋ฉด undefined๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

IDL์—์„œ ์œ ๋‹ˆ์–ธ ํƒ€์ž… ์ƒ์ˆ˜ ๊ฐ’์€ ํ•ด๋‹น ๋ฉค๋ฒ„ ํƒ€์ž…์˜ ์ƒ์ˆ˜ ๊ฐ’๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

UnionType ::
    ( UnionMemberType or UnionMemberType UnionMemberTypes )
UnionMemberType ::
    ExtendedAttributeList DistinguishableType
    UnionType Null
UnionMemberTypes ::
    or UnionMemberType UnionMemberTypes
    ฮต
DistinguishableType ::
    PrimitiveType Null
    StringType Null
    identifier Null
    sequence < TypeWithExtendedAttributes > Null
    async_sequence < TypeWithExtendedAttributes > Null
    object Null
    symbol Null
    BufferRelatedType Null
    FrozenArray < TypeWithExtendedAttributes > Null
    ObservableArray < TypeWithExtendedAttributes > Null
    RecordType Null
    undefined Null

2.13.33. ์ฃผ์„ ํƒ€์ž…

ํŠน์ • ํ™•์žฅ ์†์„ฑ์„ ๊ธฐ์กด ํƒ€์ž…์— ์ง€์ •ํ•˜๋ฉด ์ถ”๊ฐ€ ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํƒ€์ž…์„ ์ฃผ์„ ํƒ€์ž…์ด๋ผ ํ•˜๋ฉฐ, ์ด๋“ค์ด ์ฃผ์„์„ ๋‹ค๋Š” ํƒ€์ž…์„ ๋‚ด๋ถ€ ํƒ€์ž…์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

[Clamp] long์€ ์ฃผ์„ ํƒ€์ž…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ํƒ€์ž…์€ ๋‚ด๋ถ€ ํƒ€์ž… long์˜ ๋™์ž‘์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ, [Clamp] ํ™•์žฅ ์†์„ฑ์— ์ง€์ •๋œ ๋Œ€๋กœ ๋™์ž‘์ด ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ํ™•์žฅ ์†์„ฑ๋“ค์ด ํƒ€์ž…์— ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค: [AllowResizable], [AllowShared], [Clamp], [EnforceRange], ๊ทธ๋ฆฌ๊ณ  [LegacyNullToEmptyString].

ํƒ€์ž…์— ์—ฐ๊ด€๋œ ํ™•์žฅ ์†์„ฑ์€ IDL ํƒ€์ž… type์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:
  1. extended attributes๋ฅผ ์ƒˆ๋กœ์šด ๋นˆ ์ง‘ํ•ฉ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. type์ด Type์ด๊ณ , ๋ฐ”๋กœ ๋‹ค์Œ ๋‚ด๋ถ€์— ์žˆ๋Š” TypeWithExtendedAttributes ์ƒ์„ฑ ๊ทœ์น™์— ํ•ด๋‹นํ•œ๋‹ค๋ฉด, ์ถ”๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํ™•์žฅ ์†์„ฑ ์ค‘ ์ƒ์„ฑ ๊ทœ์น™์˜ ExtendedAttributeList์— ์žˆ๋Š” ๊ฐ๊ฐ์„ extended attributes์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    [Exposed=Window]
    interface I {
        attribute [XAttr] long attrib;
        undefined f1(sequence<[XAttr] long> arg);
        undefined f2(optional [XAttr] long arg);
    
        maplike<[XAttr2] DOMString, [XAttr3] long>;
    };
    
    dictionary D {
        required [XAttr] long member;
    };
    
  3. type์ด ๋ฉค๋ฒ„ ํƒ€์ž…์ด๊ณ  ์œ ๋‹ˆ์–ธ ํƒ€์ž… U์˜ ๋ฉค๋ฒ„๋ผ๋ฉด, ์ถ”๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์—ฐ๊ฒฐ๋œ ํ™•์žฅ ์†์„ฑ U์˜ ๊ฒƒ์„ extended attributes์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    [Exposed=Window]
    interface I {
        attribute [XAttr] (long or Node) attrib;
    };
    
  4. type์ด ๋‚ด๋ถ€ ํƒ€์ž…์ด๊ณ  ๋„ ํ—ˆ์šฉ ํƒ€์ž… N์˜ ๊ฒƒ์ด๋ผ๋ฉด, ์ถ”๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์—ฐ๊ฒฐ๋œ ํ™•์žฅ ์†์„ฑ N์˜ ๊ฒƒ์„ extended attributes์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    [Exposed=Window]
    interface I {
        attribute [XAttr] long? attrib;
    };
    
  5. type์ด ์ธ์ˆ˜ A์˜ ํƒ€์ž…์ด๊ณ  ํ•ด๋‹น ์ธ์ˆ˜๊ฐ€ optional ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์ถ”๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ extended attributes์— ๋‹ค์Œ์˜ ๋ชจ๋“  ํ™•์žฅ ์†์„ฑ ์ค‘ ExtendedAttributeList์— ์žˆ์œผ๋ฉฐ A์˜ Argument ์ƒ์„ฑ ๊ทœ์น™์— ์†ํ•˜๊ณ  ํƒ€์ž…์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    [Exposed=Window]
    interface I {
        undefined f([XAttr] long attrib);
    };
    

    [XAttr]์ด ๋‹ค์Œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด๊ฒƒ์ด ์ด ๋‹จ๊ณ„์˜ ์˜ˆ์ž„์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์ฆ‰, ํƒ€์ž…์— ์ ์šฉ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด [XAttr]์€ ์ธ์ˆ˜์— ์ ์šฉ๋˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์ธ์ˆ˜์˜ ํƒ€์ž…์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  6. type์ด ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„ M์˜ ํƒ€์ž…์ด๊ณ  ํ•ด๋‹น ๋ฉค๋ฒ„๊ฐ€ ํ•„์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ์ถ”๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ extended attributes์— ๋‹ค์Œ์˜ ๋ชจ๋“  ํ™•์žฅ ์†์„ฑ ์ค‘ ExtendedAttributeList์— ์žˆ์œผ๋ฉฐ M์˜ DictionaryMember ์ƒ์„ฑ ๊ทœ์น™์— ์†ํ•˜๊ณ  ํƒ€์ž…์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    dictionary D {
        [XAttr] long member;
    };
    

    [XAttr]์ด ๋‹ค์Œ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด๊ฒƒ์ด ์ด ๋‹จ๊ณ„์˜ ์˜ˆ์ž„์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์ฆ‰, ํƒ€์ž…์— ์ ์šฉ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด [XAttr]์€ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„์— ์ ์šฉ๋˜๋Š” ๊ฒƒ์ด๋ฉฐ, ๋ฉค๋ฒ„์˜ ํƒ€์ž…์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  7. type์ด typedef์ธ ๊ฒฝ์šฐ, ์ถ”๊ฐ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ๋œ ํ™•์žฅ ์†์„ฑ ์ค‘ ์ƒˆ ์ด๋ฆ„์ด ๋ถ€์—ฌ๋˜๋Š” ํƒ€์ž…๊ณผ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์„ extended attributes์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    typedef [XAttr] long xlong;
    
  8. extended attributes๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋„, ๊ทธ ํƒ€์ž…๊ณผ ์—ฐ๊ฒฐ๋œ ํ™•์žฅ ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ํ™•์žฅ ์†์„ฑ ์ค‘ ํƒ€์ž…์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋งŒ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.13.34. ๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž…

๋ฐ์ดํ„ฐ ๋ฒ„ํผ๋‚˜ ๋ฒ„ํผ ๋ทฐ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ชจ๋“  non-null ์ฐธ์กฐ ์ง‘ํ•ฉ์— ๋Œ€์‘ํ•˜๋Š” ํƒ€์ž…๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋Š” ๊ฐ ํƒ€์ž…๊ณผ ํ•ด๋‹น ํƒ€์ž…์ด ํ‘œํ˜„ํ•˜๋Š” ๋ฒ„ํผ/๋ทฐ ์ข…๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํƒ€์ž… ๋ฒ„ํผ ์ข…๋ฅ˜
ArrayBuffer ๊ณ ์ •๋œ ๋ฐ”์ดํŠธ ์ˆ˜์˜ ๋ฒ„ํผ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ(๋„ ๊ฐ€๋Šฅ)๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด
SharedArrayBuffer ๊ณ ์ •๋œ ๋ฐ”์ดํŠธ ์ˆ˜์˜ ๊ณต์œ  ๋ฒ„ํผ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ(๋„ ๋ถˆ๊ฐ€)๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด
DataView ์ž„์˜ ์˜คํ”„์…‹์—์„œ ์ •์ˆ˜, ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’์„ ํƒ€์ž…๋ณ„๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํผ ํƒ€์ž… ์ธ์Šคํ„ด์Šค์˜ ๋ทฐ
Int8Array ๋ฒ„ํผ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ ์ฃผ์–ด์ง„ ๋น„ํŠธ ํฌ๊ธฐ์˜ 2์˜ ๋ณด์ˆ˜ ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด๋กœ ๋…ธ์ถœํ•˜๋Š” ๋ทฐ
Int16Array
Int32Array
BigInt64Array
Uint8Array ๋ฒ„ํผ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ ์ฃผ์–ด์ง„ ๋น„ํŠธ ํฌ๊ธฐ์˜ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด๋กœ ๋…ธ์ถœํ•˜๋Š” ๋ทฐ
Uint16Array
Uint32Array
BigUint64Array
Uint8ClampedArray ๋ฒ„ํผ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ 8๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด๋กœ ๋…ธ์ถœํ•˜๋ฉฐ, ๊ฐ’์€ ํด๋žจํ”„ ๋ณ€ํ™˜๋จ
Float16Array ๋ฒ„ํผ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ ์ง€์ •๋œ ๋น„ํŠธ ํฌ๊ธฐ์˜ IEEE 754 ๋ถ€๋™์†Œ์ˆ˜์  ์ˆซ์ž ๋ฐฐ์—ด๋กœ ๋…ธ์ถœํ•˜๋Š” ๋ทฐ; Float16Array๋Š” ECMAScript ์ œ์•ˆ [PROPOSAL-FLOAT16ARRAY]์— ํ•ด๋‹นํ•จ.
Float32Array
Float64Array

์ฐธ๊ณ : ์ด ํƒ€์ž…๋“ค์€ ๋ชจ๋‘ JavaScript์—์„œ ์ •์˜๋œ ํด๋ž˜์Šค์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

IDL์—์„œ๋Š” ์ด๋Ÿฌํ•œ ํƒ€์ž…์˜ ์ƒ์ˆ˜ ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ช…์„ธ ์‚ฐ๋ฌธ(prose) ์ˆ˜์ค€์—์„œ, IDL ๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž…์€ ๋‹จ์ˆœํžˆ ๊ฐ์ฒด ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค. ๋ฒ„ํผ ๋‚ด๋ถ€ ๋ฐ”์ดํŠธ๋ฅผ ์กฐํšŒ/์กฐ์ž‘ํ•˜๋ ค๋ฉด ๋ช…์„ธ ์‚ฐ๋ฌธ์—์„œ ยงโ€ฏ3.2.26 ๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

BufferRelatedType ::
    ArrayBuffer
    SharedArrayBuffer
    DataView
    Int8Array
    Int16Array
    Int32Array
    Uint8Array
    Uint16Array
    Uint32Array
    Uint8ClampedArray
    BigInt64Array
    BigUint64Array
    Float16Array
    Float32Array
    Float64Array

2.13.35. ๋ถˆ๋ณ€ ๋ฐฐ์—ด ํƒ€์ž… โ€” FrozenArray<T>

๋ถˆ๋ณ€ ๋ฐฐ์—ด ํƒ€์ž…์€ ํŒŒ๋ผ๋ฏธํ„ฐํ™”๋œ ํƒ€์ž…์œผ๋กœ, ๊ฐ’์ด ๊ณ ์ • ๊ธธ์ด์˜ ์ˆ˜์ • ๋ถˆ๊ฐ€ ๊ฐ’ ๋ฐฐ์—ด์„ ๊ฐ€์ง„ ๊ฐ์ฒด ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ ๊ฐ ๊ฐ’์€ T ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

๋ถˆ๋ณ€ ๋ฐฐ์—ด ํƒ€์ž…์€ ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ์ผ๋ฐ˜ ์†์„ฑ์ด๋‚˜ static ์†์„ฑ ํƒ€์ž…์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๋‘ ๊ฐœ์˜ ๋ถˆ๋ณ€ ๋ฐฐ์—ด ์†์„ฑ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๊ณ  ํ•˜๋‚˜๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด ์•„๋‹™๋‹ˆ๋‹ค.
[Exposed=Window]
interface PersonalPreferences {
    readonly attribute FrozenArray<DOMString> favoriteColors;
    attribute FrozenArray<DOMString> favoriteFoods;

    undefined randomizeFavoriteColors();
};

์ด ์†์„ฑ๋“ค์˜ ๋™์ž‘ ์ •์˜ ์˜ˆ์‹œ:

๊ฐ PersonalPreferences๋Š” favorite colors(FrozenArray<DOMString>)๋ฅผ ๊ฐ–๊ณ , ์ดˆ๊ธฐ๊ฐ’์€ ยซ "purple", "aquamarine" ยป๋กœ ๋ถˆ๋ณ€ ๋ฐฐ์—ด ์ƒ์„ฑ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

๊ฐ PersonalPreferences๋Š” favorite foods(FrozenArray<DOMString>)๋„ ๊ฐ–๊ณ , ์ดˆ๊ธฐ๊ฐ’์€ ๋นˆ ๋ฆฌ์ŠคํŠธ๋กœ ๋ถˆ๋ณ€ ๋ฐฐ์—ด ์ƒ์„ฑ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

favoriteColors getter ๋‹จ๊ณ„๋Š” this์˜ favorite colors๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

favoriteFoods getter ๋‹จ๊ณ„๋Š” this์˜ favorite foods๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

favoriteFoods setter ๋‹จ๊ณ„๋Š” this์˜ favorite foods๋ฅผ ์ง€์ • ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

randomizeFavoriteColors() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š”:

  1. newFavoriteColors๋ฅผ ์ž„์˜๋กœ ์„ ํƒํ•œ ์ƒ‰์ƒ 2๊ฐœ์˜ ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ๋กœ ๋‘”๋‹ค.

  2. this์˜ favorite colors๋ฅผ ๋ถˆ๋ณ€ ๋ฐฐ์—ด ์ƒ์„ฑ(newFavoriteColors) ๊ฒฐ๊ณผ๋กœ ์„ค์ •.

FrozenArray<T> ๊ฐ’์€ ์ฐธ์กฐ์ด๋ฏ€๋กœ, ์‹œํ€€์Šค ํƒ€์ž…์ฒ˜๋Ÿผ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฆฌ์ŠคํŠธ์™€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

IDL์—์„œ๋Š” ๋ถˆ๋ณ€ ๋ฐฐ์—ด ์ƒ์ˆ˜ ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

2.13.36. ๊ด€์ฐฐ ๋ฐฐ์—ด ํƒ€์ž… โ€” ObservableArray<T>

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

ํŒŒ๋ผ๋ฏธํ„ฐํ™” ํƒ€์ž… T๋Š” ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…, ์‹œํ€€์Šค ํƒ€์ž…, ๋ ˆ์ฝ”๋“œ ํƒ€์ž…, ๊ด€์ฐฐ ๋ฐฐ์—ด ํƒ€์ž…์ด ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ T๋Š” ๋„ ํ—ˆ์šฉ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ด€์ฐฐ ๋ฐฐ์—ด ํƒ€์ž…์€ ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ์ผ๋ฐ˜ ์†์„ฑ ํƒ€์ž…์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ด€์ฐฐ ๋ฐฐ์—ด ์†์„ฑ์—๋Š” ๋ช…์„ธ ์ €์ž๊ฐ€ ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

์ด ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋‘ ์„ ํƒ์ ์ด๋ฉฐ, ์ •์˜๋˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ๋™์ž‘์€ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ชจ๋‘ ์˜ˆ์™ธ๋ฅผ throwํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๊ฐ’์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ๊ฑฐ๋ถ€).

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ๊ธฐ์กด ์ธ๋ฑ์Šค์— ์ƒˆ ๊ฐ’์„ ์„ค์ •ํ•˜๋ฉด, ๋จผ์ € ์ธ๋ฑ์Šค ๊ฐ’ ์‚ญ์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‹คํ–‰๋˜์–ด ๊ธฐ์กด ๊ฐ’์„ ์‚ญ์ œํ•˜๊ณ , ๊ทธ ๋‹ค์Œ ์ธ๋ฑ์Šค ๊ฐ’ ์„ค์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ƒˆ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ด€์ฐฐ ๋ฐฐ์—ด ํƒ€์ž…์ธ ์ผ๋ฐ˜ ์†์„ฑ๋งˆ๋‹ค ๋ฐฑํ‚น ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋ฆฌ์ŠคํŠธ๋กœ, ์ดˆ๊นƒ๊ฐ’์€ ๋นˆ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ๋ช…์„ธ ์ €์ž๋Š” ๋ฐฑํ‚น ๋ฆฌ์ŠคํŠธ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ด€์ฐฐ ๋ฐฐ์—ด ๋‚ด์šฉ์—๋„ ์ฆ‰์‹œ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ๊ด€์ฐฐ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•˜๋ฉด ์ธ๋ฑ์Šค ๊ฐ’ ์„ค์ •, ์ธ๋ฑ์Šค ๊ฐ’ ์‚ญ์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฑฐ์ณ ๋ฐฑํ‚น ๋ฆฌ์ŠคํŠธ์—๋„ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

IDL์—์„œ๋Š” ๊ด€์ฐฐ ๋ฐฐ์—ด ์ƒ์ˆ˜ ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๊ด€์ฐฐ ๋ฐฐ์—ด ์†์„ฑ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:
[Exposed=Window]
interface Building {
  attribute ObservableArray<Employee> employees;
};

์ด ์†์„ฑ์˜ ๋™์ž‘ ์ •์˜ ์˜ˆ์‹œ:

Building์˜ employees ์†์„ฑ์— ๋Œ€ํ•ด ์ธ๋ฑ์Šค ๊ฐ’ ์„ค์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜(์ธ์ž: employee, index):
  1. employee๊ฐ€ ์˜ค๋Š˜ ๊ฑด๋ฌผ ์ถœ์ž… ๋ถˆ๊ฐ€์ด๋ฉด "NotAllowedError" DOMException์„ throw.

  2. index๊ฐ€ 200 ์ด์ƒ์ด๋ฉด QuotaExceededError๋ฅผ throwํ•˜๊ณ , quota๋Š” 200, requested๋Š” index๋กœ ์„ค์ •.

  3. employee๋ฅผ ์—…๋ฌด์— ํˆฌ์ž…!

Building์˜ employees ์†์„ฑ์— ๋Œ€ํ•ด ์ธ๋ฑ์Šค ๊ฐ’ ์‚ญ์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(์ธ์ž: employee, index):

  1. employee๊ฐ€ ๊ฑด๋ฌผ์„ ๋– ๋‚ฌ์Œ์„ ๊ฒฝ๋น„์— ์•Œ๋ฆผ.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ employees ํ”„๋กœํผํ‹ฐ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

// Building ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ
const building = getBuilding();

building.employees.push(new Employee("A"));
building.employees.push(new Employee("B"));
building.employees.push(new Employee("C"));

building.employees.splice(2, 1);
const employeeB = building.employees.pop();

building.employees = [new Employee("D"), employeeB, new Employee("C")];

building.employees.length = 0;

// ์˜ˆ์™ธ ๋ฐœ์ƒ:
building.employees.push("not an Employee; a string instead");

์œ„ ์กฐ์ž‘๋“ค์€ ๋ชจ๋‘ ์ธ๋ฑ์Šค ๊ฐ’ ์„ค์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฑฐ์น˜๋ฉฐ, ์กฐ๊ฑด์— ๋งž์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ throw๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ด๋‹น ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋Š” ์ธ๋ฑ์Šค ๊ฐ’ ์‚ญ์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ •์˜๋œ ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์œ„ JS ์˜ˆ์‹œ์—์„œ %Array.prototype%์˜ ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๊ฐ€ ๊ด€์ฐฐ ๋ฐฐ์—ด์— ๋ชจ๋‘ ๋™์ž‘ํ•˜๋Š” ์ ๋„ ์ฃผ๋ชฉํ•˜์„ธ์š”. ์‹ค์ œ๋กœ Array ์ธ์Šคํ„ด์Šค์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

const normalArray = [];

// ๋งŒ์•ฝ building.employees๊ฐ€ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ getter ์ธํ„ฐํŽ˜์ด์Šค์˜€๋‹ค๋ฉด: normalArray์— building.employees ํ•˜๋‚˜๋งŒ ๋“ค์–ด๊ฐ.
//
// ๊ด€์ฐฐ ๋ฐฐ์—ด(๋ฐ ๋ถˆ๋ณ€ ๋ฐฐ์—ด)์˜ ๊ฒฝ์šฐ: normalArray์—๋Š” building.employees์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์ด ๋“ค์–ด๊ฐ.
normalArray.concat(building.employees);

// names๋Š” JS Array์ž„.
const names = building.employees.map(employee => employee.name);

// ๋ธŒ๋žœ๋“œ ์ฒดํฌ ํ†ต๊ณผ:
console.assert(building.employees instanceof Array);
console.assert(Array.isArray(building.employees));
console.assert(building.employees.constructor === Array);

// JSON.stringify์—๋„ ๋ฐฐ์—ด๋กœ ์ทจ๊ธ‰๋จ! (๋ฐ”๊นฅ [] ์ฐธ์กฐ.)
console.assert(JSON.stringify(building.employees) === `[{}]`);

2.14. ํ™•์žฅ ์†์„ฑ

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

ExtendedAttribute ๋ฌธ๋ฒ• ๊ธฐํ˜ธ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ํ† ํฐ ์‹œํ€€์Šค์™€ ์ผ์น˜ํ•˜์ง€๋งŒ, ์ด ๋ฌธ์„œ์— ์ •์˜๋œ ํ™•์žฅ ์†์„ฑ์€ ๋” ์ œํ•œ๋œ ๊ตฌ๋ฌธ๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. IDL ์กฐ๊ฐ์—์„œ ๋ฐœ๊ฒฌ๋˜๋Š” ๋ชจ๋“  ํ™•์žฅ ์†์„ฑ์€ ๋‹ค์Œ ๋ฌธ๋ฒ• ๊ธฐํ˜ธ์™€ ๋Œ€์กฐํ•˜์—ฌ ์–ด๋–ค ํ˜•์‹(๋˜๋Š” ํ˜•์‹๋“ค)์— ํ•ด๋‹นํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:

๋ฌธ๋ฒ• ๊ธฐํ˜ธ ํ˜•์‹ ์˜ˆ
ExtendedAttributeNoArgs ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š์Œ [Replaceable]
ExtendedAttributeArgList ์ธ์ˆ˜ ๋ชฉ๋ก์„ ๋ฐ›์Œ ํ˜„์žฌ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ; ์ด์ „์—๋Š” [Constructor(double x, double y)]์—์„œ ์‚ฌ์šฉ๋จ
ExtendedAttributeNamedArgList ๋ช…๋ช…๋œ ์ธ์ˆ˜ ๋ชฉ๋ก์„ ๋ฐ›์Œ [LegacyFactoryFunction=Image(DOMString src)]
ExtendedAttributeIdent ์‹๋ณ„์ž๋ฅผ ๋ฐ›์Œ [PutForwards=name]
ExtendedAttributeString ๋ฌธ์ž์—ด์„ ๋ฐ›์Œ [Reflect="popover"]
ExtendedAttributeInteger ์ •์ˆ˜๋ฅผ ๋ฐ›์Œ [ReflectDefault=2]
ExtendedAttributeDecimal ์‹ญ์ง„์ˆ˜๋ฅผ ๋ฐ›์Œ [ReflectDefault=2.0]
ExtendedAttributeIntegerList ์ •์ˆ˜ ๋ชฉ๋ก์„ ๋ฐ›์Œ [ReflectRange=(2, 600)]
ExtendedAttributeIdentList ์‹๋ณ„์ž ๋ชฉ๋ก์„ ๋ฐ›์Œ [Exposed=(Window,Worker)]
ExtendedAttributeWildcard ์™€์ผ๋“œ์นด๋“œ๋ฅผ ๋ฐ›์Œ [Exposed=*]

์ด ๋ช…์„ธ๋Š” JavaScript ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ํ™•์žฅ ์†์„ฑ์„ ์ •์˜ํ•˜๋ฉฐ, ์ด์— ๋Œ€ํ•ด์„œ๋Š” ยง 3.3 ํ™•์žฅ ์†์„ฑ์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ™•์žฅ ์†์„ฑ ์ •์˜๋Š” ์œ„์˜ ๋‹ค์„ฏ ๊ฐ€์ง€ ํ˜•์‹ ์ค‘ ์–ด๋–ค ํ˜•์‹์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

ExtendedAttributeList ::
    [ ExtendedAttribute ExtendedAttributes ]
    ฮต
ExtendedAttributes ::
    , ExtendedAttribute ExtendedAttributes
    ฮต
ExtendedAttribute ::
    ( ExtendedAttributeInner ) ExtendedAttributeRest
    [ ExtendedAttributeInner ] ExtendedAttributeRest
    { ExtendedAttributeInner } ExtendedAttributeRest
    Other ExtendedAttributeRest
ExtendedAttributeRest ::
    ExtendedAttribute
    ฮต
ExtendedAttributeInner ::
    ( ExtendedAttributeInner ) ExtendedAttributeInner
    [ ExtendedAttributeInner ] ExtendedAttributeInner
    { ExtendedAttributeInner } ExtendedAttributeInner
    OtherOrComma ExtendedAttributeInner
    ฮต
Other ::
    integer
    decimal
    identifier
    string
    other
    -
    -Infinity
    .
    ...
    :
    ;
    <
    =
    >
    ?
    *
    ByteString
    DOMString
    FrozenArray
    Infinity
    NaN
    ObservableArray
    Promise
    USVString
    any
    bigint
    boolean
    byte
    double
    false
    float
    long
    null
    object
    octet
    or
    optional
    record
    sequence
    short
    symbol
    true
    unsigned
    undefined
    ArgumentNameKeyword
    BufferRelatedType
OtherOrComma ::
    Other
    ,
IdentifierList ::
    identifier Identifiers
Identifiers ::
    , identifier Identifiers
    ฮต
IntegerList ::
    integer Integers
Integers ::
    , integer Integers
    ฮต
ExtendedAttributeNoArgs ::
    identifier
ExtendedAttributeArgList ::
    identifier ( ArgumentList )
ExtendedAttributeIdent ::
    identifier = identifier
ExtendedAttributeString ::
    identifier = string
ExtendedAttributeInteger ::
    identifier = integer
ExtendedAttributeDecimal ::
    identifier = decimal
ExtendedAttributeWildcard ::
    identifier = *
ExtendedAttributeIdentList ::
    identifier = ( IdentifierList )
ExtendedAttributeIntegerList ::
    identifier = ( IntegerList )
ExtendedAttributeNamedArgList ::
    identifier = identifier ( ArgumentList )

3. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ”์ธ๋”ฉ

์ด ์ ˆ์—์„œ๋Š” ยงโ€ฏ2 ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ ์–ธ์–ด์— ์ •์˜๋œ IDL๋กœ ์ž‘์„ฑ๋œ ์ •์˜๋“ค์ด ECMAScript ์–ธ์–ด ๋ช…์„ธ [ECMA-262]์— ๊ทœ์ •๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์ • ๊ตฌ์กฐ์™€ ์–ด๋–ป๊ฒŒ ๋Œ€์‘๋˜๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค.

๋ณ„๋„ ๋ช…์‹œ ์—†์œผ๋ฉด, ์ด ์ ˆ์—์„œ ์ •์˜๋œ ๊ฐ์ฒด๋Š” ECMAScript ยงโ€ฏ10.1 ์ผ๋ฐ˜ ๊ฐ์ฒด ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์™€ ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ๊ธฐ์ˆ ๋œ ์ผ๋ฐ˜ ๊ฐ์ฒด์ด๋ฉฐ, ๊ฐ์ฒด๊ฐ€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ผ๋ฉด ECMAScript ยงโ€ฏ10.3 ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ฐ์ฒด์— ๋”ฐ๋ฅธ๋‹ค.

์ด ์ ˆ์—์„œ๋Š” ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์™€ ๋‚ด๋ถ€ ์Šฌ๋กฏ ์ผ๋ถ€๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ํ˜„ํ–‰ ํ‘œ์ค€ ๋˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค์ธ ํ”Œ๋žซํผ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋‚˜ ๋‚ด๋ถ€ ์Šฌ๋กฏ ์ •์˜๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์˜๋ฏธ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฐ์ฒด๋Š” ํŠน์ด ๊ฐ์ฒด ๊ทœ์น™์— ๋”ฐ๋ผ ๋‹ค๋ค„์ ธ์•ผ ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ์ €์ˆ˜์ค€ ์ž‘์—…์ด๋ฉฐ, ์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ณด์•ˆ์ด๋‚˜ ํ˜ธํ™˜์„ฑ ๋“ฑ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์จ์•ผ ํ•œ๋‹ค. ํ˜„์žฌ HTMLAllCollection ๋ฐ Location ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์— ์‚ฌ์šฉ๋จ. [HTML]

๋ณ„๋„ ๋ช…์‹œ ์—†์œผ๋ฉด, ์ด ์ ˆ ๋ฐ ๋‹ค๋ฅธ ํ˜„ํ–‰ ํ‘œ์ค€์—์„œ ์ •์˜๋œ ํŠน์ด ๊ฐ์ฒด(Exotic Object)๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๋™์ผํ•œ ๋‚ด๋ถ€ ์Šฌ๋กฏ์„ ๊ฐ€์ง€๋ฉฐ, ๋ณ„๋„ ์ •์˜๊ฐ€ ์—†๋Š” ๋ชจ๋“  ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•˜๋‹ค.

๋ณ„๋„ ๋ช…์‹œ ์—†์œผ๋ฉด, ์ด ์ ˆ์—์„œ ์ •์˜๋œ ๊ฐ์ฒด์˜ [[Extensible]] ๋‚ด๋ถ€ ์Šฌ๋กฏ ๊ฐ’์€ true์ด๋‹ค.

๋ณ„๋„ ๋ช…์‹œ ์—†์œผ๋ฉด, ์ด ์ ˆ์—์„œ ์ •์˜๋œ ๊ฐ์ฒด์˜ [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ ๊ฐ’์€ %Object.prototype%์ด๋‹ค.

์ด ์ ˆ์—์„œ ์„ค๋ช…ํ•˜๋Š” ์ผ๋ถ€ ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค ๋ฌธ์ž์—ด์„ ๊ฐ€์ง„๋‹ค. ํด๋ž˜์Šค ๋ฌธ์ž์—ด์€ Object.prototype.toString์˜ ๋ฐ˜ํ™˜ ๋ฌธ์ž์—ด์— ํฌํ•จ๋˜๋Š” ๊ฐ’์ด๋‹ค.

๊ฐ์ฒด๊ฐ€ ํด๋ž˜์Šค ๋ฌธ์ž์—ด classString์„ ๊ฐ€์ง€๋ฉด, ์ƒ์„ฑ ์‹œ์ ์— ํ•ด๋‹น ๊ฐ์ฒด๋Š” %Symbol.toStringTag% ์‹ฌ๋ณผ ์ด๋ฆ„์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, PropertyDescriptor{[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true, [[Value]]: classString}๋กœ ์„ค์ •ํ•œ๋‹ค.

์ด ์ ˆ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ECMAScript ยงโ€ฏ5.2 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ทœ์น™(๋‹จ๊ณ„์™€ ํ•˜์œ„ ๋‹จ๊ณ„, ์ˆ˜ํ•™ ์—ฐ์‚ฐ ๋“ฑ) ๋ฐ ECMA-262์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ์ •์˜๋œ ์ถ”์ƒ ์—ฐ์‚ฐยทํ‘œ๊ธฐ๋ฒ•์„ ๋”ฐ๋ฅธ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ throw SomethingError ๋ผ๊ณ  ํ•˜๋ฉด, ์ด๋Š” ํ˜„์žฌ realm์—์„œ ์ƒˆ๋กœ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ SomethingError ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด throwํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ECMA-262 ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋™์ผํ•˜๋‹ค.

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

๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณด์ž:

  1. x๋ฅผ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ „๋‹ฌ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

  2. y๋ฅผ ? ToString(x) ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  3. y๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ToString์€ ์˜ˆ์™ธ๋ฅผ throwํ•  ์ˆ˜ ์žˆ๋‹ค(์˜ˆ: ({ toString: function() { throw 1 } }) ์ „๋‹ฌ ์‹œ). ์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰์€ ์ค‘๋‹จ๋˜๊ณ  ์˜ˆ์™ธ๊ฐ€ ํ˜ธ์ถœ์ž์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค.

3.1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ

์ฃผ์–ด์ง„ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ ์ง‘ํ•ฉ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌํ˜„์—์„œ๋Š”, ํ•ด๋‹น IDL ํ”„๋ž˜๊ทธ๋จผํŠธ์— ์ •์˜๋œ ๊ฐ์ฒด์— ๋Œ€์‘๋˜๋Š” ์—ฌ๋Ÿฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ด ๊ฐ์ฒด๋“ค์„ ์ดˆ๊ธฐ ๊ฐ์ฒด๋ผ ํ•˜๋ฉฐ, ๋‹ค์Œ์„ ํฌํ•จํ•œ๋‹ค:

๊ฐ realm์—๋Š” ๊ณ ์œ ํ•œ ์ดˆ๊ธฐ ๊ฐ์ฒด ์ง‘ํ•ฉ์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ํ•ด๋‹น realm์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ง„์ž… ์ „, realm์˜ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ํ›„์— ๋งŒ๋“ค์–ด์ง„๋‹ค. ๋™์ผ realm์˜ ๋ชจ๋“  ์ดˆ๊ธฐ ๊ฐ์ฒด [[Prototype]]์€ ๊ทธ realm์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.

HTML ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์—์„œ๋Š” ์—ฌ๋Ÿฌ realm์ด ํ”„๋ ˆ์ž„ ๋˜๋Š” ์œˆ๋„์šฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ํ”„๋ ˆ์ž„ยท์œˆ๋„์šฐ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ์ดˆ๊ธฐ ๊ฐ์ฒด ์ง‘ํ•ฉ์„ ๊ฐ€์ง€๋ฉฐ, ์•„๋ž˜ HTML ๋ฌธ์„œ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค:

<!DOCTYPE html>
<title>Different Realms</title>
<iframe id=a></iframe>
<script>
var iframe = document.getElementById("a");
var w = iframe.contentWindow;              // ํ”„๋ ˆ์ž„์˜ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด

Object == w.Object;                        // false ๋ฐ˜ํ™˜ (ECMA-262 ์ค€์ˆ˜)
Node == w.Node;                            // false ๋ฐ˜ํ™˜
iframe instanceof w.Node;                  // false ๋ฐ˜ํ™˜
iframe instanceof w.Object;                // false ๋ฐ˜ํ™˜
iframe.appendChild instanceof Function;    // true ๋ฐ˜ํ™˜
iframe.appendChild instanceof w.Function;  // false ๋ฐ˜ํ™˜
</script>

์ฐธ๊ณ : ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ด๋–ค realm์— ๋…ธ์ถœ๋˜๋Š”์ง€ ์ •์˜ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Web Worker์šฉ realm์€ ์›น ํŽ˜์ด์ง€ realm๊ณผ ๋…ธ์ถœ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ง‘ํ•ฉ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

์ž‘์„ฑ ์‹œ์ ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ช…์„ธ์—๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜์œผ๋‚˜, ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋Š” ์—ฐ๊ฒฐ๋œ realm์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ๊ฐ์ฒด์™€ realm์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์•„์ง ๋ช…ํ™•ํžˆ ๊ทœ์ •๋˜์ง€ ์•Š์•˜์œผ๋‚˜, ํ”Œ๋žซํผ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ๋œ realm์€ ๊ฐ์ฒด์˜ ๊ด€๋ จ realm๊ณผ ๋™์ผํ•˜๋ฉฐ, ํŠน์ดํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜ ๊ฐ์ฒด(์ฆ‰, ํ˜ธ์ถœ ๊ฐ€๋Šฅ ํ”„๋ก์‹œ๋‚˜ bound ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ)๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ [[Realm]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์˜ ๊ฐ’์ด ์—ฐ๊ฒฐ๋œ realm์ด๋‹ค.

3.2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํƒ€์ž… ๋งคํ•‘

์ด ์ ˆ์—์„œ๋Š” IDL์˜ ํƒ€์ž…์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํƒ€์ž…์— ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค.

์•„๋ž˜ ๊ฐ ํ•˜์œ„ ์ ˆ์—์„œ๋Š” ํŠน์ • IDL ํƒ€์ž… ๊ฐ’์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„๋˜๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค. ๊ฐ IDL ํƒ€์ž…๋งˆ๋‹ค, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์ด ํ•ด๋‹น ํƒ€์ž…์„ ๊ธฐ๋Œ€ํ•˜๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด์— ์ „๋‹ฌ๋  ๋•Œ ์–ด๋–ป๊ฒŒ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š”์ง€์™€, ํ•ด๋‹น ํƒ€์ž…์˜ IDL ๊ฐ’์ด ํ”Œ๋žซํผ ๊ฐ์ฒด์—์„œ ๋ฐ˜ํ™˜๋  ๋•Œ ์–ด๋–ป๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

์•„๋ž˜ ํ•˜์œ„ ์ ˆ๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€, ํƒ€์ž… ํ—ค๋”์— ๋ช…์‹œ๋œ ํƒ€์ž…์— ํ™•์žฅ ์†์„ฑ์„ ์ ์šฉํ•ด ๋งŒ๋“  ์ฃผ์„ ํƒ€์ž…์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค.

3.2.1. any

IDL any ํƒ€์ž…์€ ๋ชจ๋“  ๋‹ค๋ฅธ IDL ํƒ€์ž…์˜ ํ•ฉ์ง‘ํ•ฉ์ด๋ฏ€๋กœ, ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ ํƒ€์ž…์— ๋Œ€์‘๋  ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด IDL any ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. V๊ฐ€ undefined์ด๋ฉด, ๊ณ ์œ ํ•œ undefined IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. V๊ฐ€ null์ด๋ฉด, null object? ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. V๊ฐ€ ๋ถˆ๋ฆฌ์–ธ์ด๋ฉด, ๋™์ผํ•œ ์ง„๋ฆฟ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” boolean ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. V๊ฐ€ ์ˆซ์ž์ด๋ฉด, V๋ฅผ unrestricted double๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. V๊ฐ€ BigInt์ด๋ฉด, V๋ฅผ bigint๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. V๊ฐ€ ๋ฌธ์ž์—ด์ด๋ฉด, V๋ฅผ DOMString์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  7. V๊ฐ€ ์‹ฌ๋ณผ์ด๋ฉด, V๋ฅผ symbol๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  8. V๊ฐ€ ๊ฐ์ฒด์ด๋ฉด, V๋ฅผ ์ฐธ์กฐํ•˜๋Š” IDL object ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IDL any ๊ฐ’์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋  ๋•Œ, ํ•ด๋‹น IDL any ๊ฐ’์˜ ํŠน์ • ํƒ€์ž…์— ๋Œ€ํ•ด ์•„๋ž˜ ์ ˆ์—์„œ ์„ค๋ช…ํ•œ ๋ณ€ํ™˜ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค.

3.2.2. undefined

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด undefined ๊ฐ’์œผ๋กœ ๋งŒ๋“ค ๋•Œ๋Š”, V๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๊ณ ์œ ํ•œ undefined ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ณ ์œ ํ•œ IDL undefined ๊ฐ’์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋  ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ undefined ๊ฐ’์ด ๋œ๋‹ค.

3.2.3. boolean

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด boolean ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ToBoolean(V) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’ x์™€ ๋™์ผํ•œ ์ง„๋ฆฟ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL boolean ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IDL boolean ๊ฐ’ true๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋  ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ true ๊ฐ’์ด ๋˜๊ณ , IDL boolean ๊ฐ’ false ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ false ๊ฐ’์ด ๋œ๋‹ค.

3.2.4. ์ •์ˆ˜ ํƒ€์ž…

์ด ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ˆ˜ํ•™ ์—ฐ์‚ฐ์€, ECMAScript ยงโ€ฏ5.2 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ทœ์น™์— ์ •์˜๋œ ๊ฒƒ ํฌํ•จ, ์ˆ˜ํ•™์  ์‹ค์ˆ˜์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ˆ˜ํ•™์  ๊ฒฐ๊ณผ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ฆ‰, x๊ฐ€ Number ๊ฐ’์ผ ๋•Œ, โ€œx์— ๋Œ€ํ•ด ์—ฐ์‚ฐํ•œ๋‹คโ€๋Š” ๊ฒƒ์€ โ€œx์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ ์ˆ˜ํ•™์  ์‹ค์ˆ˜์— ๋Œ€ํ•ด ์—ฐ์‚ฐํ•œ๋‹คโ€์˜ ์•ฝ์–ด์ด๋‹ค.

3.2.4.1. byte

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด byte ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ConvertToInt(V, 8, "signed") ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL byte ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IDL byte ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น IDL byte ๊ฐ’๊ณผ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ Number์ด๋‹ค. Number ๊ฐ’์€ [โˆ’128, 127] ๋ฒ”์œ„์˜ ์ •์ˆ˜๋‹ค.

3.2.4.2. octet

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด octet ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ConvertToInt(V, 8, "unsigned") ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL octet ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IDL octet ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น IDL octet ๊ฐ’๊ณผ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ Number์ด๋‹ค. Number ๊ฐ’์€ [0, 255] ๋ฒ”์œ„์˜ ์ •์ˆ˜๋‹ค.

3.2.4.3. short

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด short ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ConvertToInt(V, 16, "signed") ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL short ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IDL short ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น IDL short ๊ฐ’๊ณผ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ Number์ด๋‹ค. Number ๊ฐ’์€ [โˆ’32768, 32767] ๋ฒ”์œ„์˜ ์ •์ˆ˜๋‹ค.

3.2.4.4. unsigned short

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด unsigned short ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ConvertToInt(V, 16, "unsigned") ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL unsigned short ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IDL unsigned short ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น IDL unsigned short ๊ฐ’๊ณผ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ Number์ด๋‹ค. Number ๊ฐ’์€ [0, 65535] ๋ฒ”์œ„์˜ ์ •์ˆ˜๋‹ค.

3.2.4.5. long

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด long ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ConvertToInt(V, 32, "signed") ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL long ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IDL long ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น IDL long ๊ฐ’๊ณผ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ Number์ด๋‹ค. Number ๊ฐ’์€ [โˆ’2147483648, 2147483647] ๋ฒ”์œ„์˜ ์ •์ˆ˜๋‹ค.

3.2.4.6. unsigned long

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด unsigned long ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ConvertToInt(V, 32, "unsigned") ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL unsigned long ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IDL unsigned long ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น IDL unsigned long ๊ฐ’๊ณผ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ Number์ด๋‹ค. Number ๊ฐ’์€ [0, 4294967295] ๋ฒ”์œ„์˜ ์ •์ˆ˜๋‹ค.

3.2.4.7. long long

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด long long ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ConvertToInt(V, 64, "signed") ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL long long ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IDL long long ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น long long ๊ฐ’์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด Number ๊ฐ’์ด๋‹ค. ๋‘ ๊ฐ’์ด ๋™์ผํ•˜๊ฒŒ ๊ฐ€๊นŒ์šธ ๊ฒฝ์šฐ ์œ ํšจ์ˆซ์ž๊ฐ€ ์ง์ˆ˜์ธ ๊ฐ’์„ ์„ ํƒํ•œ๋‹ค. long long์ด [โˆ’253 + 1, 253 โˆ’ 1] ๋ฒ”์œ„์— ์žˆ์œผ๋ฉด Number๊ฐ€ long long๊ณผ ๋™์ผํ•œ ๊ฐ’์„ ์ •ํ™•ํžˆ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

3.2.4.8. unsigned long long

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด unsigned long long ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ConvertToInt(V, 64, "unsigned") ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL unsigned long long ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IDL unsigned long long ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น unsigned long long ๊ฐ’์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด Number ๊ฐ’์ด๋‹ค. ๋‘ ๊ฐ’์ด ๋™์ผํ•˜๊ฒŒ ๊ฐ€๊นŒ์šธ ๊ฒฝ์šฐ ์œ ํšจ์ˆซ์ž๊ฐ€ ์ง์ˆ˜์ธ ๊ฐ’์„ ์„ ํƒํ•œ๋‹ค. unsigned long long์ด 253 โˆ’ 1 ์ดํ•˜์ด๋ฉด Number๊ฐ€ unsigned long long๊ณผ ๋™์ผํ•œ ๊ฐ’์„ ์ •ํ™•ํžˆ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

3.2.4.9. ์ถ”์ƒ ์—ฐ์‚ฐ

IntegerPart(n):

  1. r๋ฅผ floor(abs(n))๋กœ ๋‘”๋‹ค.

  2. n < 0์ด๋ฉด -1 ร— r์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. ๊ทธ ์™ธ์—๋Š” r์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ConvertToInt(V, bitLength, signedness):

  1. bitLength๊ฐ€ 64์ธ ๊ฒฝ์šฐ:

    1. upperBound๋ฅผ 253 โˆ’ 1๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. signedness๊ฐ€ "unsigned"์ด๋ฉด, lowerBound๋ฅผ 0์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด lowerBound๋ฅผ โˆ’253 + 1๋กœ ๋‘ก๋‹ˆ๋‹ค.

      ์ฐธ๊ณ : ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด long long ํƒ€์ž…์ด [EnforceRange] ๋˜๋Š” [Clamp] ํ™•์žฅ ์†์„ฑ๊ณผ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ JavaScript์˜ Number ํƒ€์ž…์—์„œ ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , signedness๊ฐ€ "unsigned"์ธ ๊ฒฝ์šฐ:

    1. lowerBound๋ฅผ 0์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. upperBound๋ฅผ 2bitLength โˆ’ 1๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ:

    1. lowerBound๋ฅผ -2bitLength โˆ’ 1๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. upperBound๋ฅผ 2bitLength โˆ’ 1 โˆ’ 1๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. x๋ฅผ ? ToNumber(V)๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. x๊ฐ€ โˆ’0์ด๋ฉด, x๋ฅผ +0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. ๋ณ€ํ™˜ ๋Œ€์ƒ์ด [EnforceRange] ํ™•์žฅ ์†์„ฑ๊ณผ ์—ฐ๊ฒฐ๋œ IDL ํƒ€์ž…์ธ ๊ฒฝ์šฐ:

    1. x๊ฐ€ NaN, +โˆž ๋˜๋Š” โˆ’โˆž์ด๋ฉด, TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

    2. x๋ฅผ IntegerPart(x)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. x < lowerBound ๋˜๋Š” x > upperBound์ด๋ฉด, TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

    4. x๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  7. x๊ฐ€ NaN์ด ์•„๋‹ˆ๊ณ  ๋ณ€ํ™˜ ๋Œ€์ƒ์ด [Clamp] ํ™•์žฅ ์†์„ฑ๊ณผ ์—ฐ๊ฒฐ๋œ IDL ํƒ€์ž…์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

    1. x๋ฅผ min(max(x, lowerBound), upperBound)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. x๋ฅผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ˆ˜๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•˜๋˜, ๋‘ ์ •์ˆ˜์˜ ์ •ํ™•ํžˆ ์ค‘๊ฐ„์— ์žˆ์œผ๋ฉด ์ง์ˆ˜๋ฅผ ์„ ํƒํ•˜๊ณ  ๋‘ ์ •์ˆ˜ ์‚ฌ์ด์—์„œ๋Š”, โˆ’0 ๋Œ€์‹  +0์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    3. x๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  8. x๊ฐ€ NaN, +0, +โˆž ๋˜๋Š” โˆ’โˆž์ด๋ฉด, +0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  9. x๋ฅผ IntegerPart(x)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  10. x๋ฅผ x ๋ชจ๋“ˆ๋กœ 2bitLength๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  11. signedness๊ฐ€ "signed"์ด๊ณ  x โ‰ฅ 2bitLength โˆ’ 1์ด๋ฉด, x โˆ’ 2bitLength๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  12. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, x๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.2.5. float

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด float ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ToNumber(V) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x ๊ฐ€ NaN , +โˆž ๋˜๋Š” โˆ’โˆž์ด๋ฉด TypeError ๋ฅผ throw ํ•œ๋‹ค.

  3. S๋ฅผ ์œ ํ•œ IEEE 754 ๋‹จ์ •๋ฐ€๋„ ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’ ์ง‘ํ•ฉ(โˆ’0 ์ œ์™ธ)์— 2128, โˆ’2128 ๋‘ ํŠน์ˆ˜๊ฐ’์„ ์ถ”๊ฐ€ํ•œ ์ง‘ํ•ฉ์œผ๋กœ ๋‘”๋‹ค.

  4. y๋ฅผ x์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด S ๋‚ด ๊ฐ’์œผ๋กœ ๋‘๊ณ , ๋™์ผํ•˜๊ฒŒ ๊ฐ€๊นŒ์šธ ๊ฒฝ์šฐ ์œ ํšจ์ˆซ์ž๊ฐ€ ์ง์ˆ˜์ธ ๊ฐ’์„ ์„ ํƒํ•œ๋‹ค. (2128, โˆ’2128๋„ ์ง์ˆ˜ ์œ ํšจ์ˆซ์ž๋กœ ๊ฐ„์ฃผ.)

  5. y ๊ฐ€ 2 128 ๋˜๋Š” โˆ’2 128 ์ด๋ฉด TypeError ๋ฅผ throw ํ•œ๋‹ค.

  6. y๊ฐ€ +0์ด๊ณ  x๊ฐ€ ์Œ์ˆ˜๋ฉด โˆ’0์„ ๋ฐ˜ํ™˜.

  7. y๋ฅผ ๋ฐ˜ํ™˜.

IDL float ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น IDL float ๊ฐ’๊ณผ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ Number์ด๋‹ค.

3.2.6. unrestricted float

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด unrestricted float ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ToNumber(V) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x๊ฐ€ NaN์ด๋ฉด IEEE 754 NaN ๊ฐ’(bit ํŒจํ„ด 0x7fc00000)๊ณผ ๋Œ€์‘๋˜๋Š” IDL unrestricted float ๊ฐ’์„ ๋ฐ˜ํ™˜.

  3. S๋ฅผ ์œ ํ•œ IEEE 754 ๋‹จ์ •๋ฐ€๋„ ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’ ์ง‘ํ•ฉ(โˆ’0 ์ œ์™ธ)์— 2128, โˆ’2128 ๋‘ ํŠน์ˆ˜๊ฐ’์„ ์ถ”๊ฐ€ํ•œ ์ง‘ํ•ฉ์œผ๋กœ ๋‘”๋‹ค.

  4. y๋ฅผ x์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด S ๋‚ด ๊ฐ’์œผ๋กœ ๋‘๊ณ , ๋™์ผํ•˜๊ฒŒ ๊ฐ€๊นŒ์šธ ๊ฒฝ์šฐ ์œ ํšจ์ˆซ์ž๊ฐ€ ์ง์ˆ˜์ธ ๊ฐ’์„ ์„ ํƒํ•œ๋‹ค. (2128, โˆ’2128๋„ ์ง์ˆ˜ ์œ ํšจ์ˆซ์ž๋กœ ๊ฐ„์ฃผ.)

  5. y๊ฐ€ 2128์ด๋ฉด +โˆž๋ฅผ ๋ฐ˜ํ™˜.

  6. y๊ฐ€ โˆ’2128์ด๋ฉด โˆ’โˆž๋ฅผ ๋ฐ˜ํ™˜.

  7. y๊ฐ€ +0์ด๊ณ  x๊ฐ€ ์Œ์ˆ˜๋ฉด โˆ’0์„ ๋ฐ˜ํ™˜.

  8. y๋ฅผ ๋ฐ˜ํ™˜.

์ฐธ๊ณ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ NaN ๊ฐ’์ด ํ•˜๋‚˜๋ฟ์ด๋ฏ€๋กœ, ๋‹จ์ •๋ฐ€๋„ IEEE 754 NaN ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋กœ ์ •๊ทœํ™”ํ•ด์•ผ ํ•œ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ NaN ๊ฐ’(bit ํŒจํ„ด 0x7fc00000)์€ 32๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜๋กœ ํ•ด์„ํ•  ๋•Œ ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ์กฐ์šฉํ•œ NaN์ด๋‹ค.

IDL unrestricted float ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š” Number:

  1. ํ•ด๋‹น IDL unrestricted float ๊ฐ’์ด NaN์ด๋ฉด Number ๊ฐ’๋„ NaN์ด๋‹ค.

  2. ๊ทธ ์™ธ์—๋Š” ํ•ด๋‹น IDL unrestricted float ๊ฐ’๊ณผ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ Number์ด๋‹ค.

3.2.7. double

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด double ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ToNumber(V) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x ๊ฐ€ NaN , +โˆž ๋˜๋Š” โˆ’โˆž์ด๋ฉด TypeError ๋ฅผ throw ํ•œ๋‹ค.

  3. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL double ๊ฐ’์„ ๋ฐ˜ํ™˜.

IDL double ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น double ๊ฐ’๊ณผ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ Number์ด๋‹ค.

3.2.8. unrestricted double

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด unrestricted double ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ToNumber(V) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x๊ฐ€ NaN์ด๋ฉด IEEE 754 NaN ๊ฐ’(bit ํŒจํ„ด 0x7ff8000000000000)๊ณผ ๋Œ€์‘๋˜๋Š” IDL unrestricted double ๊ฐ’์„ ๋ฐ˜ํ™˜.

  3. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL unrestricted double ๊ฐ’์„ ๋ฐ˜ํ™˜.

์ฐธ๊ณ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ NaN ๊ฐ’์ด ํ•˜๋‚˜๋ฟ์ด๋ฏ€๋กœ, ๋ฐฐ์ •๋ฐ€๋„ IEEE 754 NaN ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋กœ ์ •๊ทœํ™”ํ•ด์•ผ ํ•œ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ NaN ๊ฐ’(bit ํŒจํ„ด 0x7ff8000000000000)์€ 64๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜๋กœ ํ•ด์„ํ•  ๋•Œ ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ์กฐ์šฉํ•œ NaN์ด๋‹ค.

IDL unrestricted double ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š” Number:

  1. ํ•ด๋‹น IDL unrestricted double ๊ฐ’์ด NaN์ด๋ฉด Number ๊ฐ’๋„ NaN์ด๋‹ค.

  2. ๊ทธ ์™ธ์—๋Š” ํ•ด๋‹น IDL unrestricted double ๊ฐ’๊ณผ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ Number์ด๋‹ค.

3.2.9. bigint

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด bigint ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ToBigInt(V) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL bigint ๊ฐ’์„ ๋ฐ˜ํ™˜.

IDL bigint ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š” BigInt:

  1. ํ•ด๋‹น IDL bigint ๊ฐ’๊ณผ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๊ฐ€์ง„ BigInt ๊ฐ’์„ ๋ฐ˜ํ™˜.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ ๋ณ€ํ™˜ํ•ด์„œ IDL ์ˆซ์ž ํƒ€์ž… T ๋˜๋Š” bigint ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ToNumeric(V) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x๊ฐ€ BigInt๋ฉด

    1. x์™€ ๋™์ผํ•œ ์ˆ˜์น˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” IDL bigint ๊ฐ’์„ ๋ฐ˜ํ™˜.

  3. ๋‹จ์–ธ: x๋Š” Number์ด๋‹ค.

  4. x๋ฅผ T๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜.

3.2.10. DOMString

JavaScript ๊ฐ’ V๋Š” ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•˜์—ฌ ๋ณ€ํ™˜๋˜์–ด IDL DOMString ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค:

  1. V๊ฐ€ null์ด๊ณ  ๋ณ€ํ™˜ ๋Œ€์ƒ์ด [LegacyNullToEmptyString] ํ™•์žฅ ์†์„ฑ๊ณผ ์—ฐ๊ฒฐ๋œ IDL ํƒ€์ž…์ด๋ฉด, ๋นˆ ๋ฌธ์ž์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” DOMString ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. x๋ฅผ ? ToString(V)๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. JavaScript String ๊ฐ’ x๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ฝ”๋“œ ๋‹จ์œ„ ์‹œํ€€์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” IDL DOMString ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

IDL DOMString ๊ฐ’์„ JavaScript ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š” IDL DOMString์ด ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ฝ”๋“œ ๋‹จ์œ„ ์‹œํ€€์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” String ๊ฐ’์ž…๋‹ˆ๋‹ค.

3.2.11. ByteString

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด ByteString ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. x๋ฅผ ? ToString(V) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. x์˜ ์–ด๋–ค ์š”์†Œ ๊ฐ’์ด 255๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด throw TypeError.

  3. x์™€ ๊ธธ์ด๊ฐ€ ๊ฐ™๊ณ  ๊ฐ ์š”์†Œ ๊ฐ’์ด x์˜ ํ•ด๋‹น ์š”์†Œ์™€ ๋™์ผํ•œ IDL ByteString ๊ฐ’์„ ๋ฐ˜ํ™˜.

IDL ByteString ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น ByteString๊ณผ ๊ธธ์ด๊ฐ€ ๊ฐ™๊ณ  ๊ฐ ์š”์†Œ ๊ฐ’์ด ByteString์˜ ํ•ด๋‹น ์š”์†Œ์™€ ๋™์ผํ•œ String ๊ฐ’์ด๋‹ค.

3.2.12. USVString

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด USVString ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. string์„ V๋ฅผ DOMString์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. string์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ์ž์—ด ๋ณ€ํ™˜์„ ํ†ตํ•ด ์Šค์นผ๋ผ ๊ฐ’ ์‹œํ€€์Šค๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ์ธ IDL USVString ๊ฐ’์„ ๋ฐ˜ํ™˜.

IDL USVString ๊ฐ’ S๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š” S ์ž์ฒด๋‹ค.

3.2.13. object

IDL object ๊ฐ’์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Object ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด object ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. V๊ฐ€ Object๊ฐ€ ์•„๋‹ˆ๋ฉด TypeError๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค.

  2. V์™€ ๋™์ผ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” IDL object ๊ฐ’์„ ๋ฐ˜ํ™˜.

IDL object ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น object๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋™์ผ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Object ๊ฐ’์ด๋‹ค.

3.2.14. symbol

IDL symbol ๊ฐ’์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Symbol ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด symbol ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:
  1. V๊ฐ€ Symbol์ด ์•„๋‹ˆ๋ฉด TypeError๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค.

  2. V์™€ ๋™์ผ ์‹ฌ๋ณผ์„ ์ฐธ์กฐํ•˜๋Š” IDL symbol ๊ฐ’์„ ๋ฐ˜ํ™˜.

IDL symbol ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น symbol๊ณผ ๋™์ผ ์‹ฌ๋ณผ์„ ์ฐธ์กฐํ•˜๋Š” Symbol ๊ฐ’์ด๋‹ค.

3.2.15. ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…

IDL ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Object ๊ฐ’(ํ•จ์ˆ˜ ๊ฐ์ฒด ํฌํ•จ)์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜(I๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค):

  1. V๊ฐ€ I๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ํ•ด๋‹น ํ”Œ๋žซํผ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” IDL ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’์„ ๋ฐ˜ํ™˜.

  2. throw TypeError.

IDL ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’์ด ์ฐธ์กฐํ•˜๋Š” ๋™์ผ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Object ๊ฐ’์ด๋‹ค.

3.2.16. ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…

IDL ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Object ๊ฐ’(ํ•จ์ˆ˜ ๊ฐ์ฒด ํฌํ•จ)์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. V ๊ฐ€ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด , TypeError ๋ฅผ throw ํ•œ๋‹ค.

  2. V๋ฅผ ์ฐธ์กฐํ•˜๊ณ , incumbent settings object๋ฅผ ์ฝœ๋ฐฑ ์ปจํ…์ŠคํŠธ๋กœ ํ•˜๋Š” IDL ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’์„ ๋ฐ˜ํ™˜.

IDL ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’์ด ์ฐธ์กฐํ•˜๋Š” ๋™์ผ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Object ๊ฐ’์ด๋‹ค.

3.2.17. ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…

IDL ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž… ๊ฐ’์€ JavaScript Object ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด(๋˜๋Š” ๊ทธ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ)์˜ ์†์„ฑ์€ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.

JavaScript ๊ฐ’ jsDict๋Š” ๋ณ€ํ™˜๋˜์–ด IDL ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž… ๊ฐ’์ด ๋˜๋ฉฐ, ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ D๋Š” ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์ž…๋‹ˆ๋‹ค):

  1. jsDict๊ฐ€ Object๊ฐ€ ์•„๋‹ˆ๊ณ  jsDict๊ฐ€ undefined๋„ null๋„ ์•„๋‹ˆ๋ผ๋ฉด, TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

  2. idlDict๋ฅผ ํƒ€์ž… D์˜ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋นˆ ์ˆœ์„œ๊ฐ€ ์ง€์ •๋œ ๋งต์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. dictionaries๋ฅผ D์™€ D์˜ ๋ชจ๋“  ์ƒ์†๋œ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋œ ๋ชฉ๋ก์œผ๋กœ ๋‘๊ณ , ๊ฐ€์žฅ ๋œ ํŒŒ์ƒ๋œ ๊ฒƒ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋งŽ์ด ํŒŒ์ƒ๋œ ๊ฒƒ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

  4. dictionaries์˜ ๊ฐ ๋”•์…”๋„ˆ๋ฆฌ dictionary์— ๋Œ€ํ•ด ์ˆœ์„œ๋Œ€๋กœ:

    1. dictionary์— ์„ ์–ธ๋œ ๊ฐ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„ member์— ๋Œ€ํ•ด ์‚ฌ์ „์ˆœ์œผ๋กœ:

      1. key๋ฅผ member์˜ ์‹๋ณ„์ž๋กœ ๋‘ก๋‹ˆ๋‹ค.

      2. jsDict๊ฐ€ undefined ๋˜๋Š” null์ธ ๊ฒฝ์šฐ:

        1. jsMemberValue๋ฅผ undefined๋กœ ๋‘ก๋‹ˆ๋‹ค.

      3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด,

        1. jsMemberValue๋ฅผ ? Get(jsDict, key)๋กœ ๋‘ก๋‹ˆ๋‹ค.

      4. jsMemberValue๊ฐ€ undefined๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ:

        1. idlMemberValue๋ฅผ jsMemberValue๋ฅผ member๊ฐ€ ์„ ์–ธ๋œ ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

        2. idlDict[key]๋ฅผ ์„ค์ •ํ•˜์—ฌ idlMemberValue๋กœ ํ•ฉ๋‹ˆ๋‹ค.

      5. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , jsMemberValue๊ฐ€ undefined์ด์ง€๋งŒ member์— ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

        1. idlMemberValue๋ฅผ member์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

        2. idlDict[key]๋ฅผ ์„ค์ •ํ•˜์—ฌ idlMemberValue๋กœ ํ•ฉ๋‹ˆ๋‹ค.

      6. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , jsMemberValue๊ฐ€ undefined์ด๊ณ  member๊ฐ€ ํ•„์ˆ˜์ธ ๊ฒฝ์šฐ, TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

  5. idlDict๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : JavaScript ๊ฐ์ฒด์—์„œ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„๋ฅผ ์กฐํšŒํ•˜๋Š” ์ˆœ์„œ๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ ์—ด๊ฑฐ ์ˆœ์„œ์™€ ๋ฐ˜๋“œ์‹œ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

IDL ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ’ V๋Š” ๋ณ€ํ™˜๋˜์–ด JavaScript Object ๊ฐ’์ด ๋˜๋ฉฐ, ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ D๋Š” ๋”•์…”๋„ˆ๋ฆฌ์ž…๋‹ˆ๋‹ค):

  1. O๋ฅผ OrdinaryObjectCreate(%Object.prototype%)๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. dictionaries๋ฅผ D์™€ D์˜ ๋ชจ๋“  ์ƒ์†๋œ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋œ ๋ชฉ๋ก์œผ๋กœ ๋‘๊ณ , ๊ฐ€์žฅ ๋œ ํŒŒ์ƒ๋œ ๊ฒƒ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋งŽ์ด ํŒŒ์ƒ๋œ ๊ฒƒ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

  3. dictionaries์˜ ๊ฐ ๋”•์…”๋„ˆ๋ฆฌ dictionary์— ๋Œ€ํ•ด ์ˆœ์„œ๋Œ€๋กœ:

    1. dictionary์— ์„ ์–ธ๋œ ๊ฐ ๋”•์…”๋„ˆ๋ฆฌ ๋ฉค๋ฒ„ member์— ๋Œ€ํ•ด ์‚ฌ์ „์ˆœ์œผ๋กœ:

      1. key๋ฅผ member์˜ ์‹๋ณ„์ž๋กœ ๋‘ก๋‹ˆ๋‹ค.

      2. V[key]๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ:

        1. idlValue๋ฅผ V[key]๋กœ ๋‘ก๋‹ˆ๋‹ค.

        2. value๋ฅผ idlValue๋ฅผ JavaScript ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

        3. ! CreateDataPropertyOrThrow(O, key, value)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

        member์— ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์œผ๋ฉด, key๋Š” ํ•ญ์ƒ V์— ์กด์žฌํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค.

  4. O๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.2.18. ์—ด๊ฑฐํ˜• ํƒ€์ž…

IDL ์—ด๊ฑฐํ˜• ํƒ€์ž…์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ String ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์—ด๊ฑฐํ˜• ํƒ€์ž… ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•(E๋Š” ํ•ด๋‹น ์—ด๊ฑฐํ˜•):

  1. S๋ฅผ ? ToString(V) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. S๊ฐ€ E์˜ ์—ด๊ฑฐํ˜• ๊ฐ’์— ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฉด throw TypeError.

  3. S์™€ ๋™์ผํ•œ E ํƒ€์ž…์˜ ์—ด๊ฑฐํ˜• ๊ฐ’์„ ๋ฐ˜ํ™˜.

IDL ์—ด๊ฑฐํ˜• ํƒ€์ž… ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น ์—ด๊ฑฐํ˜• ๊ฐ’๊ณผ ๋™์ผํ•œ ์ฝ”๋“œ ์œ ๋‹› ์‹œํ€€์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” String ๊ฐ’์ด๋‹ค.

3.2.19. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž…

IDL ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž…์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋œ๋‹ค. ๋‹จ, [LegacyTreatNonObjectAsNull]์ด ๋ถ™์€ ๊ฒฝ์šฐ์—๋Š” ์•„๋ฌด ๊ฐ์ฒด๋‚˜ ๋  ์ˆ˜ ์žˆ๋‹ค.

JavaScript ๊ฐ’ V๋Š” ๋ณ€ํ™˜๋˜์–ด ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•จ์œผ๋กœ์จ IDL ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž… ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค:

  1. IsCallable(V) ํ˜ธ์ถœ ๊ฒฐ๊ณผ๊ฐ€ false์ด๊ณ  IDL ๊ฐ’์œผ๋กœ์˜ ๋ณ€ํ™˜์ด V๊ฐ€ ์†์„ฑ์— ํ• ๋‹น๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ, ํ•ด๋‹น ์†์„ฑ์˜ ํƒ€์ž…์ด ๋„ ํ—ˆ์šฉ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ด๊ณ  [LegacyTreatNonObjectAsNull]๋กœ ์ฃผ์„์ด ์ง€์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

  2. V๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ํ˜„์ง ์„ค์ • ๊ฐ์ฒด๋ฅผ ์ฝœ๋ฐฑ ์ปจํ…์ŠคํŠธ๋กœ ํ•˜๋Š” IDL ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž… ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

IDL ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž… ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž… ๊ฐ’์ด ์ฐธ์กฐํ•˜๋Š” ๋™์ผ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ด๋‹ค.

3.2.20. ๋„ ํ—ˆ์šฉ ํƒ€์ž… โ€” T?

IDL ๋„ ํ—ˆ์šฉ ํƒ€์ž… ๊ฐ’์€ ๋‚ด๋ถ€ IDL ํƒ€์ž…์— ๋Œ€์‘ํ•˜๋Š” JavaScript ํƒ€์ž…์˜ ๊ฐ’ ๋˜๋Š” JavaScript null ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

JavaScript ๊ฐ’ V๋Š” ๋ณ€ํ™˜๋˜์–ด IDL ๋„ ํ—ˆ์šฉ ํƒ€์ž… T? ๊ฐ’(T๋Š” ๋‚ด๋ถ€ ํƒ€์ž…)์ด ๋˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. V๊ฐ€ Object๊ฐ€ ์•„๋‹ˆ๊ณ , IDL ๊ฐ’์œผ๋กœ์˜ ๋ณ€ํ™˜์ด V๊ฐ€ ์†์„ฑ์— ํ• ๋‹น๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ–‰๋˜๊ณ  ๊ทธ ํƒ€์ž…์ด ๋„ ํ—ˆ์šฉ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ด๋ฉฐ [LegacyTreatNonObjectAsNull]๋กœ ์ฃผ์„์ด ์ง€์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, IDL ๋„ ํ—ˆ์šฉ ํƒ€์ž… T? ๊ฐ’ null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , V๊ฐ€ undefined์ด๋ฉฐ, T๊ฐ€ undefined๋ฅผ ํฌํ•จํ•œ๋‹ค๋ฉด, ์œ ์ผํ•œ undefined ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , V๊ฐ€ null ๋˜๋Š” undefined์ด๋ฉด, IDL ๋„ ํ—ˆ์šฉ ํƒ€์ž… T? ๊ฐ’ null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, V๋ฅผ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๋‚ด๋ถ€ IDL ํƒ€์ž… T์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

IDL ๋„ ํ—ˆ์šฉ ํƒ€์ž… ๊ฐ’์„ JavaScript ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. IDL ๋„ ํ—ˆ์šฉ ํƒ€์ž… T? ๊ฐ’์ด null์ด๋ฉด, JavaScript ๊ฐ’์€ null์ž…๋‹ˆ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, JavaScript ๊ฐ’์€ IDL ๋„ ํ—ˆ์šฉ ํƒ€์ž… ๊ฐ’์„ ๋‚ด๋ถ€ IDL ํƒ€์ž… T์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

3.2.21. ์‹œํ€€์Šค โ€” sequence<T>

IDL sequence<T> ๊ฐ’์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Array ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด sequence<T> ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•:

  1. V ๊ฐ€ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด , TypeError ๋ฅผ throw ํ•œ๋‹ค.

  2. method๋ฅผ ? GetMethod(V, %Symbol.iterator%) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  3. method ๊ฐ€ undefined ์ด๋ฉด TypeError ๋ฅผ throw ํ•œ๋‹ค.

  4. V์™€ method๋กœ ์‹œํ€€์Šค ์ƒ์„ฑ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜.

sequence<T> ํƒ€์ž…์˜ IDL ์‹œํ€€์Šค ๊ฐ’ S๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Array ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•:

  1. n์„ S์˜ ๊ธธ์ด๋กœ ๋‘”๋‹ค.

  2. A๋ฅผ [] ์‹์œผ๋กœ ์ƒ์„ฑํ•œ ์ƒˆ Array ๊ฐ์ฒด๋กœ ๋‘”๋‹ค.

  3. i๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”.

  4. i < n ๋™์•ˆ:

    1. V๋ฅผ S์˜ ์ธ๋ฑ์Šค i์˜ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

    2. E๋ฅผ V๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    3. P๋ฅผ ! ToString(i) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    4. ! CreateDataPropertyOrThrow(A, P, E)์„ ์ˆ˜ํ–‰.

    5. i๋ฅผ i + 1๋กœ ์„ค์ •.

  5. A๋ฅผ ๋ฐ˜ํ™˜.

3.2.21.1. ์ดํ„ฐ๋Ÿฌ๋ธ”์—์„œ ์‹œํ€€์Šค ์ƒ์„ฑํ•˜๊ธฐ

์ดํ„ฐ๋Ÿฌ๋ธ” iterable๊ณผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ getter method๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, sequence<T> ํƒ€์ž…์˜ IDL ๊ฐ’์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค:

  1. iteratorRecord๋ฅผ ? GetIteratorFromMethod(iterable, method)๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. i๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

  3. ๋ฐ˜๋ณตํ•œ๋‹ค

    1. next๋ฅผ ? IteratorStepValue(iteratorRecord)๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. next๊ฐ€ done์ด๋ฉด, i ๊ธธ์ด์˜ sequence<T> ํƒ€์ž…์˜ IDL ์‹œํ€€์Šค ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ ์ธ๋ฑ์Šค j์˜ ์š”์†Œ ๊ฐ’์€ Sj์ด๋‹ค.

    3. Si๋ฅผ next๋ฅผ T ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

    4. i๋ฅผ i + 1๋กœ ์„ค์ •ํ•œ๋‹ค.

๋‹ค์Œ interface๋Š” ์‹œํ€€์Šค ํƒ€์ž…์˜ attribute์™€ ์‹œํ€€์Šค ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๊ฐ–๋Š” operation์„ ์ •์˜ํ•œ๋‹ค.

[Exposed=Window]
interface Canvas {

  sequence<DOMString> getSupportedImageCodecs();

  undefined drawPolygon(sequence<double> coordinates);
  sequence<double> getLastDrawnPolygon();

  // ...
};

์ด ์ธํ„ฐํŽ˜์ด์Šค์˜ JavaScript ๊ตฌํ˜„์—์„œ, String ํƒ€์ž…์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ง„ Array ๊ฐ์ฒด๋Š” sequence<DOMString>์„ ๋‚˜ํƒ€๋‚ด๊ณ , Number ํƒ€์ž…์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ง„ Array๋Š” sequence<double>์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. Array ๊ฐ์ฒด๋Š” ์‹ค์งˆ์ ์œผ๋กœ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค; getSupportedImageCodecs() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Array๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉฐ, Array๋ฅผ drawPolygon์— ์ „๋‹ฌํ•˜๋”๋ผ๋„ ํ˜ธ์ถœ์ด ๋๋‚œ ํ›„ ์ฐธ์กฐ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค.

// Canvas ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๋Š”๋‹ค. getSupportedImageCodecs()๊ฐ€ "image/png"์™€ "image/svg+xml" ๋‘ ๊ฐœ์˜ DOMString ๊ฐ’์„ ๊ฐ–๋Š” ์‹œํ€€์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •.
// ๊ธธ์ด๊ฐ€ 2์ธ Array ๊ฐ์ฒด.
var canvas = getCanvas();

// ๊ธธ์ด๊ฐ€ 2์ธ Array ๊ฐ์ฒด.
var supportedImageCodecs = canvas.getSupportedImageCodecs();

// "image/png"๋กœ ํ‰๊ฐ€๋จ.
supportedImageCodecs[0];

// canvas.getSupportedImageCodecs()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Array ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ, ๋ฐ˜ํ™˜๋œ Array๋ฅผ ์ˆ˜์ •ํ•ด๋„ ๋‹ค์Œ ํ˜ธ์ถœ์˜ ๊ฐ’์—๋Š” ์˜ํ–ฅ์ด ์—†๋‹ค.
supportedImageCodecs[0] = "image/jpeg";

// "image/png"๋กœ ํ‰๊ฐ€๋จ.
canvas.getSupportedImageCodecs()[0];

// ๊ฐ ํ˜ธ์ถœ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Array ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ, ์ด ๋น„๊ต๋Š” false๊ฐ€ ๋จ.
canvas.getSupportedImageCodecs() == canvas.getSupportedImageCodecs();

// Number์˜ Array...
var a = [0, 0, 100, 0, 50, 62.5];

// ...์„ sequence<double>์„ ๊ธฐ๋Œ€ํ•˜๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ.
canvas.drawPolygon(a);

// ๊ฐ ์š”์†Œ๋Š” ๋จผ์ € ToNumber()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ double๋กœ ๋ณ€ํ™˜๋จ.
// ๋”ฐ๋ผ์„œ ๋‹ค์Œ ํ˜ธ์ถœ์€ ์ด์ „ ํ˜ธ์ถœ๊ณผ ๋™์ผํ•˜์ง€๋งŒ "hi"๊ฐ€ drawPolygon() ๋ฐ˜ํ™˜ ์ „์— alert๋จ.
a = [false, "",
     { valueOf: function() { alert("hi"); return 100; } }, 0,
     "50", new Number(62.5)];
canvas.drawPolygon(a);

// drawPolygon()์— ์ „๋‹ฌ๋œ Array๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ Canvas์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ. ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ.
a[4] = 20;
var b = canvas.getLastDrawnPolygon();
alert(b[4]);    // "50"์ด alert๋จ.

3.2.22. ๋น„๋™๊ธฐ ์‹œํ€€์Šค โ€” async_sequence<T>

JavaScript ๋ฐ”์ธ๋”ฉ์—์„œ, IDL async sequence ๊ฐ’์€ ๋‹ค์Œ struct์˜ items๋กœ ํ‘œํ˜„๋œ๋‹ค:

JavaScript ๊ฐ’ V๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด IDL async_sequence<T> ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค:
  1. V๊ฐ€ Object๊ฐ€ ์•„๋‹ˆ๋ฉด, TypeError๋ฅผ throwํ•œ๋‹ค.

  2. method๋ฅผ ? GetMethod(obj, %Symbol.asyncIterator%)๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. method๊ฐ€ undefined์ผ ๊ฒฝ์šฐ:

    1. syncMethod๋ฅผ ? GetMethod(obj, %Symbol.iterator%)๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. syncMethod๊ฐ€ undefined์ด๋ฉด, TypeError๋ฅผ throwํ•œ๋‹ค.

    3. IDL async sequence ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. object๋Š” V, method๋Š” syncMethod, type์€ "sync"๋กœ ์„ค์ •๋œ๋‹ค.

  4. IDL async sequence ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. object๋Š” V, method๋Š” method, type ์€ "async"๋กœ ์„ค์ •๋œ๋‹ค.

IDL async_sequence<T> ๊ฐ’ V๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด JavaScript ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค:
  1. V์˜ object๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.2.22.1. ๋น„๋™๊ธฐ ์‹œํ€€์Šค ๋ฐ˜๋ณต

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

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“ค์€ ๊ตฌ์กฐ์ฒด์ด๋ฉฐ, ๋‹ค์Œ ํ•ญ๋ชฉ๋“ค์„ ๊ฐ€์ง„๋‹ค:

๋น„๋™๊ธฐ ์‹œํ€€์Šค ์—ด๊ธฐ๋ฅผ ์œ„ํ•ด async_sequence<T> sequence์— ๋Œ€ํ•ด:

  1. iterator๋ฅผ ? GetIteratorFromMethod(sequence์˜ object, sequence์˜ method)๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. sequence์˜ type์ด "sync"์ด๋ฉด, iterator๋ฅผ CreateAsyncFromSyncIterator(iterator)๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, underlying record๋Š” iterator๋กœ, type parameter๋Š” T๋กœ ์„ค์ •ํ•œ๋‹ค.

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ๋‹ค์Œ ๊ฐ’ ๊ตฌํ•˜๊ธฐ๋ฅผ ์œ„ํ•ด ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ iterator์— ๋Œ€ํ•ด:

  1. nextResult๋ฅผ IteratorNext(iterator์˜ underlying record)๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. nextResult๊ฐ€ abrupt completion์ด๋ฉด, ๊ฑฐ๋ถ€๋œ ํ”„๋ผ๋ฏธ์Šค nextResult.[[Value]]๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. nextPromise๋ฅผ ํ•ด๊ฒฐ๋œ ํ”„๋ผ๋ฏธ์Šค nextResult.[[Value]]๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. nextPromise์— ๋Œ€ํ•ด ๋ฐ˜์‘ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ์ด๋•Œ iterResult๋ฅผ ์ธ์ž๋กœ ํ•œ๋‹ค:

    1. iterResult๊ฐ€ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด, throw ํ•œ๋‹ค. TypeError.

    2. done์„ ? IteratorComplete(iterResult)๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. done์ด true์ด๋ฉด:

      1. ๋ฐ˜๋ณต ์ข…๋ฃŒ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    4. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

      1. V๋ฅผ ? IteratorValue(iterResult)๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. value๋ฅผ ๋ณ€ํ™˜ V๋ฅผ iterator์˜ type parameter ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. value๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋‹ซ๊ธฐ๋ฅผ ์œ„ํ•ด async iterator<T> iterator, ECMAScript ๊ฐ’ reason๊ณผ ํ•จ๊ป˜:

  1. iteratorRecord๋ฅผ iterator์˜ underlying record๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. iteratorObj๋ฅผ iteratorRecord.[[Iterator]]๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. returnMethod๋ฅผ GetMethod(iteratorObj, "return")๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. returnMethod๊ฐ€ abrupt completion์ด๋ฉด, ๊ฑฐ๋ถ€๋œ ํ”„๋ผ๋ฏธ์Šค returnMethod.[[Value]]๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. returnMethod๊ฐ€ undefined์ด๋ฉด, ํ•ด๊ฒฐ๋œ ํ”„๋ผ๋ฏธ์Šค undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. returnResult๋ฅผ Call(returnMethod.[[Value]], iteratorObj, ยซ reason ยป)๋กœ ์„ค์ •ํ•œ๋‹ค.

  7. returnResult๊ฐ€ abrupt completion์ด๋ฉด, ๊ฑฐ๋ถ€๋œ ํ”„๋ผ๋ฏธ์Šค returnResult.[[Value]]๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  8. returnPromise๋ฅผ ํ•ด๊ฒฐ๋œ ํ”„๋ผ๋ฏธ์Šค returnResult.[[Value]]๋กœ ์„ค์ •ํ•œ๋‹ค.

  9. returnPromise์— ๋Œ€ํ•ด ๋ฐ˜์‘ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, returnPromiseResult๋ฅผ ์ธ์ž๋กœ ํ•œ๋‹ค:

    1. returnPromiseResult๊ฐ€ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด, throw ํ•œ๋‹ค. TypeError.

    2. undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

concatN์€ operation์ด๋ฉฐ, ๋น„๋™๊ธฐ ์‹œํ€€์Šค์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ์—ฐ๊ฒฐํ•œ ๊ฐ’์„ ํ”„๋ผ๋ฏธ์Šค๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ์—ฐ๊ฒฐ์€ ๋น„๋™๊ธฐ ์‹œํ€€์Šค๊ฐ€ maxN๊ฐœ์˜ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋ฉด ์ค‘๋‹จ๋˜๊ณ  ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋‹ซ๋Š”๋‹ค.

interface I {
  Promise<DOMString> concatN(async_sequence<DOMString> strings, unsigned long maxN);
};

concatN(sequence, maxN) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. promise๋ฅผ ์ƒˆ๋กœ์šด ํ”„๋ผ๋ฏธ์Šค๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. result๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. n์„ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. iterator๋ฅผ ๋น„๋™๊ธฐ ์‹œํ€€์Šค ์—ด๊ธฐ์˜ ๊ฒฐ๊ณผ๋กœ sequence์— ๋Œ€ํ•ด ์ƒ์„ฑํ•œ๋‹ค.

  5. step์„ ๋น„๋™๊ธฐ ์‹œํ€€์Šค๋ฅผ ์ฒ˜๋ฆฌํ•  ๋‹จ๊ณ„๋“ค์˜ ์‹œํ€€์Šค๋กœ ์„ค์ •ํ•œ๋‹ค:

    1. next๋ฅผ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ ๋‹ค์Œ ๊ฐ’ ๊ตฌํ•˜๊ธฐ์˜ ๊ฒฐ๊ณผ๋กœ iterator์— ๋Œ€ํ•ด ์–ป๋Š”๋‹ค.

    2. ๋ฐ˜์‘ํ•˜์—ฌ next๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค:

      • next๊ฐ€ ๊ฐ’ v๋กœ ์ดํ–‰๋˜์—ˆ๋‹ค๋ฉด:

        1. v๊ฐ€ ๋ฐ˜๋ณต ์ข…๋ฃŒ๋ผ๋ฉด, resolveํ•˜์—ฌ promise๋ฅผ result๋กœ ์ดํ–‰ํ•œ๋‹ค.

        2. result๋ฅผ result์™€ v๋ฅผ ์—ฐ๊ฒฐํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

        3. n์„ n + 1๋กœ ์„ค์ •ํ•œ๋‹ค.

        4. n์ด maxN๋ผ๋ฉด:

          1. finish๋ฅผ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋‹ซ๊ธฐ ๊ฒฐ๊ณผ๋กœ iterator์™€ reason undefined๋กœ ์–ป๋Š”๋‹ค.

          2. ๋ฐ˜์‘ํ•˜์—ฌ finish๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค:

            • finish๊ฐ€ ์ดํ–‰๋˜์—ˆ๋‹ค๋ฉด, resolveํ•˜์—ฌ promise๋ฅผ result๋กœ ์ดํ–‰ํ•œ๋‹ค.

            • finish๊ฐ€ r๋กœ ๊ฑฐ๋ถ€๋˜์—ˆ๋‹ค๋ฉด, rejectํ•˜์—ฌ promise๋ฅผ r๋กœ ๊ฑฐ๋ถ€ํ•œ๋‹ค.

        5. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

          1. step์„ ํ˜ธ์ถœํ•œ๋‹ค.

      • next๊ฐ€ r๋กœ ๊ฑฐ๋ถ€๋˜์—ˆ๋‹ค๋ฉด, rejectํ•˜์—ฌ promise๋ฅผ r๋กœ ๊ฑฐ๋ถ€ํ•œ๋‹ค.

  6. step์„ ํ˜ธ์ถœํ•œ๋‹ค.

  7. promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.2.23. ๋ ˆ์ฝ”๋“œ โ€” record<K, V>

IDL record<K, V> ๊ฐ’์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ O๋Š” ๋ณ€ํ™˜๋˜์–ด IDL record<K, V> ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

  1. O๊ฐ€ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด, throw๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. TypeError.

  2. result๋ฅผ record<K, V> ์˜ ์ƒˆ๋กœ์šด ๋นˆ ์ธ์Šคํ„ด์Šค๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. keys๋ฅผ ? O.[[OwnPropertyKeys]]()๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ฐ keys์˜ key์— ๋Œ€ํ•ด:

    1. desc๋ฅผ ? O.[[GetOwnProperty]](key)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. desc๊ฐ€ undefined๊ฐ€ ์•„๋‹ˆ๊ณ , desc.[[Enumerable]]๊ฐ€ true์ผ ๊ฒฝ์šฐ:

      1. typedKey๋ฅผ key IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ ํ•˜์—ฌ ํƒ€์ž… K๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

      2. value๋ฅผ ? Get(O, key)์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      3. typedValue๋ฅผ value IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ ํ•˜์—ฌ ํƒ€์ž… V๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

      4. result[typedKey]์— typedValue๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        ์ฐธ๊ณ : K๊ฐ€ USVString ์ด๊ณ  key์— ์ง์ด ์—†๋Š” ๋Œ€๋ฆฌ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ, typedKey๊ฐ€ ์ด๋ฏธ result์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  5. result๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

IDL record<โ€ฆ> ๊ฐ’ D๋Š” ๋ณ€ํ™˜๋˜์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค:

  1. result๋ฅผ OrdinaryObjectCreate(%Object.prototype%)์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ฐ D์˜ key โ†’ value ์Œ์— ๋Œ€ํ•ด:

    1. jsKey๋ฅผ key ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. jsValue๋ฅผ value ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. created๋ฅผ ! CreateDataProperty(result, jsKey, jsValue)์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. Assert: created๋Š” true์ž…๋‹ˆ๋‹ค.

  3. result๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ {b: 3, a: 4}๋ฅผ record<DOMString, double> ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋ฉด, IDL ๊ฐ’ ยซ[ "b" โ†’ 3, "a" โ†’ 4 ]ยป๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ ˆ์ฝ”๋“œ๋Š” ์ž์‹ ์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ๋งŒ ๊ณ ๋ คํ•˜๋ฏ€๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ IDL ์—ฐ์‚ฐ record<DOMString, double> identity(record<DOMString, double> arg)์ด ์ธ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ, ์•„๋ž˜ ์ฝ”๋“œ๋Š” assertion์„ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค:

let proto = {a: 3, b: 4};
let obj = {__proto__: proto, d: 5, c: 6}
Object.defineProperty(obj, "e", {value: 7, enumerable: false});
let result = identity(obj);
console.assert(result.a === undefined);
console.assert(result.b === undefined);
console.assert(result.e === undefined);
let entries = Object.entries(result);
console.assert(entries[0][0] === "d");
console.assert(entries[0][1] === 5);
console.assert(entries[1][0] === "c");
console.assert(entries[1][1] === 6);

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

๊ฐ’ ํƒ€์ž…์— ์ „๋‹ฌ ๊ฒฐ๊ณผ
{"๐Ÿ˜ž": 1} record<ByteString, double> TypeError
{"\uD83D": 1} record<USVString, double> ยซ[ "\uFFFD" โ†’ 1 ]ยป
{"\uD83D": {hello: "world"}} record<DOMString, double> ยซ[ "\uD83D" โ†’ 0 ]ยป

3.2.24. Promise ํƒ€์ž… โ€” Promise<T>

IDL promise ํƒ€์ž… ๊ฐ’์€ JavaScript PromiseCapability ๋ ˆ์ฝ”๋“œ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

JavaScript ๊ฐ’ V๋Š” ๋ณ€ํ™˜๋˜์–ด IDL์˜ Promise<T> ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. promiseCapability๋ฅผ ? NewPromiseCapability(%Promise%)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ? Call(promiseCapability.[[Resolve]], undefined, ยซ V ยป)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  3. promiseCapability๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

IDL promise ํƒ€์ž… ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š”, ํ•ด๋‹น IDL promise ํƒ€์ž…์ด ํ‘œํ˜„ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์˜ [[Promise]] ํ•„๋“œ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.

JS ๊ฐ’์„ Promise<T> IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, ๋จผ์ € ๊ทธ ๊ฐ’์ด (IDL) Promise๋กœ ๊ฐ์‹ธ์ง€๊ณ , ์ดํ›„์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๊ทธ promise๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ T ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ํ•ด๊ฒฐ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์˜ˆ๋ฅผ ๋“ค์–ด, Promise<T> ์ธ์ž๋ฅผ ๋ฐ›๋„๋ก ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋Š” Promise ๊ฐ์ฒด (๊ฒฐ๊ตญ T ๊ฐ์ฒด๋กœ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•˜๋Š”)์™€ T ๊ฐ์ฒด ์ž์ฒด ๋ชจ๋‘๋ฅผ ์ž๋™์œผ๋กœ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

3.2.24.1. Promise ์ƒ์„ฑ ๋ฐ ์กฐ์ž‘

์ƒˆ๋กœ์šด promise ์ƒ์„ฑ์„ Promise<T> ํƒ€์ž…์œผ๋กœ realm realm์—์„œ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. constructor๋ฅผ realm.[[Intrinsics]].[[%Promise%]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ? NewPromiseCapability(constructor)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ๋œ promise ์ƒ์„ฑ์„ Promise<T> ํƒ€์ž…์œผ๋กœ x (ํƒ€์ž… T์˜ ๊ฐ’)์™€ ํ•จ๊ป˜ realm realm์—์„œ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. value๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ x์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. constructor๋ฅผ realm.[[Intrinsics]].[[%Promise%]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. promiseCapability๋ฅผ ? NewPromiseCapability(constructor)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. ! Call(promiseCapability.[[Resolve]], undefined, ยซ value ยป)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  5. promiseCapability๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฑฐ๋ถ€๋œ promise ์ƒ์„ฑ์„ Promise<T> ํƒ€์ž…์œผ๋กœ reason r (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’)๊ณผ ํ•จ๊ป˜ realm realm์—์„œ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. constructor๋ฅผ realm.[[Intrinsics]].[[%Promise%]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. promiseCapability๋ฅผ ? NewPromiseCapability(constructor)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ! Call(promiseCapability.[[Reject]], undefined, ยซ r ยป)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  4. promiseCapability๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

resolve๋ฅผ Promise<T> p์— x (ํƒ€์ž… T์˜ ๊ฐ’)๋กœ ํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. x๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด, undefined ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. value๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ x์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ! Call(p.[[Resolve]], undefined, ยซ value ยป)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

T๊ฐ€ undefined ์ธ ๊ฒฝ์šฐ, x ์ธ์ž๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋” ๊ฐ„๋‹จํ•œ "resolve p" ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

reject๋ฅผ Promise<T> p์— reason r (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’)์œผ๋กœ ํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. ! Call(p.[[Reject]], undefined, ยซ r ยป)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

react๋ฅผ Promise<T> promise์— ๋Œ€ํ•ด, promise๊ฐ€ ์ดํ–‰๋˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋˜์—ˆ์„ ๋•Œ ์ˆ˜ํ–‰ํ•  1~2๊ฐœ์˜ ๋‹จ๊ณ„ ์ง‘ํ•ฉ์„ ๋ฐ›์•„, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. onFulfilledSteps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๋กœ V๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค:

    1. value๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ V (ํƒ€์ž… T)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. promise๊ฐ€ ์ดํ–‰๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ๋‹จ๊ณ„๊ฐ€ ์žˆ๋‹ค๋ฉด, result๋ฅผ ํ•ด๋‹น ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. T๊ฐ€ undefined๊ฐ€ ์•„๋‹ˆ๋ฉด value๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด result๋ฅผ value๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. result๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. onFulfilled๋ฅผ CreateBuiltinFunction(onFulfilledSteps, 1, "", ยซ ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

  3. onRejectedSteps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๋กœ R๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค:

    1. reason๋ฅผ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ R (ํƒ€์ž… any)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. promise๊ฐ€ ๊ฑฐ๋ถ€๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ๋‹จ๊ณ„๊ฐ€ ์žˆ๋‹ค๋ฉด, result๋ฅผ ํ•ด๋‹น ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด result๋ฅผ ๊ฑฐ๋ถ€๋œ promise ์ƒ์„ฑ reason์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. result๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. onRejected๋ฅผ CreateBuiltinFunction(onRejectedSteps, 1, "", ยซ ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

  5. constructor๋ฅผ promise.[[Promise]].[[Realm]].[[Intrinsics]].[[%Promise%]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. newCapability๋ฅผ ? NewPromiseCapability(constructor)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ : ๋ชจ๋“  ํ˜ธ์ถœ์ž๊ฐ€ ๋ฐ˜ํ™˜๋œ Promise๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์ฒด๋Š” newCapability ์ƒ์„ฑ ์ƒ๋žต์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  7. PerformPromiseThen(promise.[[Promise]], onFulfilled, onRejected, newCapability)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  8. newCapability๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ promise.then() ๋ฉ”์„œ๋“œ์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ๋‹จ๊ณ„์—์„œ U ํƒ€์ž…์ด๋‚˜ Promise<U> ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์—ญ์‹œ Promise<U> ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋‹จ๊ณ„ ์ดํ–‰ ์‹œ ์ˆ˜ํ–‰๋ฅผ Promise<T> promise๊ฐ€ ์ดํ–‰๋  ๋•Œ, ํƒ€์ž… T ๊ฐ’์„ ๋ฐ›๋Š” ๋‹จ๊ณ„ steps๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. react๋ฅผ promise์— ๋Œ€ํ•ด ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

    • promise๊ฐ€ ๊ฐ’ v๋กœ ์ดํ–‰๋˜์—ˆ๋‹ค๋ฉด:

      1. steps๋ฅผ v๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋‹จ๊ณ„ ๊ฑฐ๋ถ€ ์‹œ ์ˆ˜ํ–‰๋ฅผ Promise<T> promise๊ฐ€ ๊ฑฐ๋ถ€๋  ๋•Œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์„ ๋ฐ›๋Š” ๋‹จ๊ณ„ steps๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. react๋ฅผ promise์— ๋Œ€ํ•ด ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

    • promise๊ฐ€ reason r๋กœ ๊ฑฐ๋ถ€๋˜์—ˆ๋‹ค๋ฉด:

      1. steps๋ฅผ r๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋‘ ๋Œ€๊ธฐ(wait for all)๋ฅผ list ํƒ€์ž…์ธ Promise<T> ๊ฐ’ promises์— ๋Œ€ํ•ด, list ํƒ€์ž… T ๊ฐ’์„ ๋ฐ›๋Š” ์„ฑ๊ณต ๋‹จ๊ณ„ successSteps์™€ ๊ฑฐ๋ถ€ reason any ๊ฐ’์„ ๋ฐ›๋Š” ์‹คํŒจ ๋‹จ๊ณ„ failureSteps๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. fullfilledCount๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. rejected๋ฅผ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. rejectionHandlerSteps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๋กœ arg๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค:

    1. rejected๊ฐ€ true์ด๋ฉด ์ด ๋‹จ๊ณ„๋“ค์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

    2. rejected๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. failureSteps๋ฅผ arg๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  4. rejectionHandler๋ฅผ CreateBuiltinFunction(rejectionHandlerSteps, 1, "", ยซ ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

  5. total์„ promises์˜ size๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. total์ด 0์ด๋ฉด:

    1. ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์— successSteps๋ฅผ ยซ ยป๋กœ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    2. ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  7. index๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  8. result๋ฅผ list ํƒ€์ž…์œผ๋กœ, total ๊ฐœ์˜ null ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  9. ๊ฐ promises์˜ promise์— ๋Œ€ํ•ด:

    1. promiseIndex๋ฅผ index๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. fulfillmentHandler๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๋กœ arg๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค:

      1. result[promiseIndex]์— arg๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. fullfilledCount๋ฅผ fullfilledCount+1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      3. fullfilledCount๊ฐ€ total๊ณผ ๊ฐ™์œผ๋ฉด, successSteps๋ฅผ result๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    3. fulfillmentHandler๋ฅผ CreateBuiltinFunction(fulfillmentHandler, 1, "", ยซ ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

    4. PerformPromiseThen(promise, fulfillmentHandler, rejectionHandler)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    5. index๋ฅผ index+1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋‘ ๊ธฐ๋‹ค๋ฆฌ๋Š” promise ์–ป๊ธฐ๋ฅผ list ํƒ€์ž… Promise<T> ๊ฐ’ promises์™€ realm realm์— ๋Œ€ํ•ด ์–ป์œผ๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. promise๋ฅผ ์ƒˆ๋กœ์šด promise ์ƒ์„ฑ์œผ๋กœ Promise<sequence<T>> ํƒ€์ž…์œผ๋กœ realm์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. successSteps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๋กœ results๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค:

    1. resolve promise๋ฅผ results๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  3. failureSteps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๋กœ reason์„ ๋ฐ›์Šต๋‹ˆ๋‹ค:

    1. reject promise ๋ฅผ reason์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ชจ๋‘ ๋Œ€๊ธฐ(wait for all)๋ฅผ promises์™€ successSteps, failureSteps๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  5. promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ •์˜๋Š” ์—ฌ๋Ÿฌ promise์˜ ๊ฒฐ๊ณผ๋ฅผ ์ง‘๊ณ„ํ•œ ๋’ค, ๊ทธ ๊ฒฐ๊ณผ๋กœ ๋˜ ๋‹ค๋ฅธ promise๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. JavaScript์˜ Promise.all() ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ promise๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ๋ชจ๋‘ ๋Œ€๊ธฐ(waiting for all)๊ฐ€ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

handled๋กœ ํ‘œ์‹œํ•˜๋ ค๋ฉด Promise<T> promise์˜ promise.[[Promise]].[[PromiseIsHandled]]๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ •์˜๋Š” ๊ฑฐ๋ถ€๊ฐ€ ์ž์ฃผ ๋ฌด์‹œ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” promise์— ์œ ์šฉํ•˜๋ฉฐ, ์ด๋Ÿฌํ•œ promise๊ฐ€ unhandledrejection ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ํ™•์ธํ•  ์ˆ˜๋„, ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” promise ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด writableStreamWriter.closed promise๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.24.2. ์˜ˆ์‹œ

delay๋Š” ์—ฐ์‚ฐ์ด๋ฉฐ, ์ง€์ •ํ•œ ๋ฐ€๋ฆฌ์ดˆ ํ›„์— ์ดํ–‰๋˜๋Š” promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์ค„์˜ ์„ค๋ช…์œผ๋กœ promise๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ resolveํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

interface I {
  Promise<undefined> delay(unrestricted double ms);
};

delay(ms) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. realm์„ this์˜ ๊ด€๋ จ ๋ ๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. taskSource๋ฅผ ์ ์ ˆํ•œ ํƒœ์Šคํฌ ์†Œ์Šค๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. ms๊ฐ€ NaN์ด๋ฉด ms๋ฅผ +0์œผ๋กœ, ์•„๋‹ˆ๋ฉด ms์™€ +0 ์ค‘ ๋” ํฐ ๊ฐ’์œผ๋กœ ms๋ฅผ ์„ค์ •ํ•œ๋‹ค.

  4. p๋ฅผ ์ƒˆ๋กœ์šด promise๋กœ realm์—์„œ ์ƒ์„ฑํ•œ๋‹ค.

  5. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•œ๋‹ค:

    1. ms ๋ฐ€๋ฆฌ์ดˆ ๋Œ€๊ธฐํ•œ๋‹ค.

    2. ํƒœ์Šคํฌ ํ์— ๋“ฑ๋กํ•˜์—ฌ taskSource์— resolve p๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  6. p๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

validatedDelay ์—ฐ์‚ฐ์€ delay ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ธ์ž๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ฆ‰์‹œ ์‹คํŒจ๋ฅผ ์•Œ๋ฆด ๋•Œ rejected promise๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

interface I {
  Promise<undefined> validatedDelay(unrestricted double ms);
};

validatedDelay(ms) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. realm์„ this์˜ ๊ด€๋ จ ๋ ๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. taskSource๋ฅผ ์ ์ ˆํ•œ ํƒœ์Šคํฌ ์†Œ์Šค๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. ms๊ฐ€ NaN์ด๋ฉด ๊ฑฐ๋ถ€๋œ promise TypeError ๋ฅผ realm์—์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. ms < 0์ด๋ฉด ๊ฑฐ๋ถ€๋œ promise RangeError ๋ฅผ realm์—์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. p๋ฅผ ์ƒˆ๋กœ์šด promise๋กœ realm์—์„œ ์ƒ์„ฑํ•œ๋‹ค.

  6. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•œ๋‹ค:

    1. ms ๋ฐ€๋ฆฌ์ดˆ ๋Œ€๊ธฐํ•œ๋‹ค.

    2. ํƒœ์Šคํฌ ํ์— ๋“ฑ๋กํ•˜์—ฌ taskSource์— resolve p๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  7. p๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

addDelay๋Š” ์—ฐ์‚ฐ์ด๋ฉฐ, promise๊ฐ€ settle๋œ ํ›„ ๋ฐ˜ํ™˜ promise๊ฐ€ settle๋˜๊ธฐ๊นŒ์ง€ ์ถ”๊ฐ€ ๋ฐ€๋ฆฌ์ดˆ ์ง€์—ฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

interface I {
  Promise<any> addDelay(Promise<any> promise, unrestricted double ms);
};

addDelay(ms, promise) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. realm์„ this์˜ ๊ด€๋ จ ๋ ๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. taskSource๋ฅผ ์ ์ ˆํ•œ ํƒœ์Šคํฌ ์†Œ์Šค๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. ms๊ฐ€ NaN์ด๋ฉด ms๋ฅผ +0์œผ๋กœ, ์•„๋‹ˆ๋ฉด ms์™€ +0 ์ค‘ ๋” ํฐ ๊ฐ’์œผ๋กœ ms๋ฅผ ์„ค์ •ํ•œ๋‹ค.

  4. p๋ฅผ ์ƒˆ๋กœ์šด promise๋กœ realm์—์„œ ์ƒ์„ฑํ•œ๋‹ค.

  5. React๋ฅผ promise์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค:

  6. p๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

environment.ready๋Š” ํŠน์„ฑ(attribute)์ด๋ฉฐ, ํ™˜๊ฒฝ(์˜ˆ: DOM ๋ฌธ์„œ)์˜ ์ผ๋ถ€๊ฐ€ "์ค€๋น„๋จ" ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋น„๋™๊ธฐ์„ฑ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

interface Environment {
  readonly attribute Promise<undefined> ready;
};

๋ชจ๋“  Environment ๊ฐ์ฒด๋Š” ready promise๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, ์ด ๊ฐ’์€ Promise<undefined>์ด๋‹ค.

ready ํŠน์„ฑ getter ๋‹จ๊ณ„:

  1. this์˜ ready promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Environment ๊ฐ์ฒด๋ฅผ realm realm์—์„œ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. taskSource๋ฅผ ์ ์ ˆํ•œ ํƒœ์Šคํฌ ์†Œ์Šค๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. environment๋ฅผ ์ƒˆ๋กœ์šด Environment ๊ฐ์ฒด๋กœ realm์—์„œ ์ƒ์„ฑํ•œ๋‹ค.

  3. environment์˜ ready promise๋ฅผ ์ƒˆ๋กœ์šด promise๋กœ realm์—์„œ ์„ค์ •ํ•œ๋‹ค.

  4. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•œ๋‹ค:

    1. ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰.

    2. environment๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ready๊ฐ€ ๋˜๋ฉด, ํƒœ์Šคํฌ ํ์— ๋“ฑ๋กํ•˜์—ฌ taskSource์— resolve environment์˜ ready promise๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    3. environment๊ฐ€ ready๊ฐ€ ๋˜์ง€ ๋ชปํ•˜๋ฉด, ํƒœ์Šคํฌ ํ์— ๋“ฑ๋กํ•˜์—ฌ taskSource์— reject environment์˜ ready promise๋ฅผ "NetworkError" DOMException์œผ๋กœ ๊ฑฐ๋ถ€ํ•œ๋‹ค.

  5. environment๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

interface I {
  Promise<undefined> addBookmark();
};

addBookmark() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. taskSource๋ฅผ ์ ์ ˆํ•œ ํƒœ์Šคํฌ ์†Œ์Šค๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋ช…์‹œ์  ์‚ฌ์šฉ์ž ๋™์ž‘์˜ ๊ฒฐ๊ณผ๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๊ฑฐ๋ถ€๋œ promise๋ฅผ "SecurityError" DOMException์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. ๋ฌธ์„œ์˜ ๋™์ž‘ ๋ชจ๋“œ๊ฐ€ standalone์ด๋ฉด ๊ฑฐ๋ถ€๋œ promise๋ฅผ "NotSupportedError" DOMException์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. promise๋ฅผ ์ƒˆ๋กœ์šด promise๋กœ ์ƒ์„ฑํ•œ๋‹ค.

  5. info๋ฅผ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์–ป์€ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  6. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•œ๋‹ค:

    1. info๋ฅผ ํ™œ์šฉํ•˜์—ฌ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋ณ„ ๋ฐฉ์‹์œผ๋กœ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ๋งˆํฌ ์ถ”๊ฐ€ ์—ฌ๋ถ€๋ฅผ ์„ ํƒํ•˜๋„๋ก ํ•œ๋‹ค.

      1. ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ๋งˆํฌ ์ถ”๊ฐ€ ์š”์ฒญ์„ ์ค‘๋‹จ(์˜ˆ: ESC ํ‚ค, ์ทจ์†Œ ๋ฒ„ํŠผ ๋“ฑ)ํ•˜๋ฉด, ํƒœ์Šคํฌ ํ์— ๋“ฑ๋กํ•˜์—ฌ taskSource์— reject promise๋ฅผ "AbortError" DOMException์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

      2. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, ํƒœ์Šคํฌ ํ์— ๋“ฑ๋กํ•˜์—ฌ taskSource์— resolve promise๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  7. promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

[SERVICE-WORKERS]์˜ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋ชจ๋‘ ๊ธฐ๋‹ค๋ฆฌ๋Š” promise ์–ป๊ธฐ(get a promise to wait for all)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. batchRequest๋Š” ๊ทธ ์šฉ๋ก€ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋‹จ์ˆœํ™”ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅ๊ฐ’์œผ๋กœ sequence ํƒ€์ž…์˜ URL ๋ชฉ๋ก์„ ๋ฐ›๊ณ , ๊ฐ URL์„ fetchํ•˜์—ฌ ์ƒ์„ฑ๋œ sequence ํƒ€์ž…์˜ Response ๊ฐ์ฒด์˜ promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. fetch ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด, ํ•ด๋‹น ์‹คํŒจ๋กœ ๊ฑฐ๋ถ€๋œ promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

interface I {
  Promise<sequence<Response>> batchRequest(sequence<USVString> urls);
};

batchRequest(urls) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. responsePromises๋ฅผ ยซ ยป๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. ๊ฐ urls์˜ url์— ๋Œ€ํ•ด:

    1. p๋ฅผ fetch() ํ•จ์ˆ˜์— url์„ ๋„ฃ์–ด ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ์ถ”๊ฐ€ํ•˜์—ฌ p๋ฅผ responsePromises์— ๋„ฃ๋Š”๋‹ค.

  3. p๋ฅผ ๋ชจ๋‘ ๊ธฐ๋‹ค๋ฆฌ๋Š” promise ์–ป๊ธฐ๋กœ responsePromises์— ๋Œ€ํ•ด ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. p๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.2.25. Union ํƒ€์ž…

IDL union ํƒ€์ž… ๊ฐ’์€ ํ•ด๋‹น union์˜ ๋ฉค๋ฒ„ ํƒ€์ž…์— ํ•ด๋‹นํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋ฅผ IDL union ํƒ€์ž… ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ฉ๋‹ˆ๋‹ค:

  1. union ํƒ€์ž…์ด undefined๋ฅผ ํฌํ•จํ•˜๊ณ  V๊ฐ€ undefined๋ผ๋ฉด, ๊ณ ์œ ํ•œ undefined ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. union ํƒ€์ž…์ด nullable ํƒ€์ž…์„ ํฌํ•จํ•˜๊ณ  V๊ฐ€ null ๋˜๋Š” undefined๋ผ๋ฉด, IDL ๊ฐ’ null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. types๋ฅผ union ํƒ€์ž…์˜ ํ‰ํƒ„ํ™”๋œ ๋ฉค๋ฒ„ ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. V๊ฐ€ null ๋˜๋Š” undefined๋ผ๋ฉด:

    1. types์— dictionary ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ ํ•ด๋‹น dictionary ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. V๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๋ฉด:

    1. types์— interface ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ  V๊ฐ€ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด, V ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. types์— object๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. V๊ฐ€ Object์ด๋ฉฐ, [[ArrayBufferData]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์žˆ๊ณ , IsSharedArrayBuffer(V)๊ฐ€ false๋ผ๋ฉด:

    1. types์— ArrayBuffer๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ ArrayBuffer๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. types์— object๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  7. V๊ฐ€ Object์ด๋ฉฐ, [[ArrayBufferData]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์žˆ๊ณ , IsSharedArrayBuffer(V)๊ฐ€ true๋ผ๋ฉด:

    1. types์— SharedArrayBuffer๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ SharedArrayBuffer๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. types์— object๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  8. V๊ฐ€ Object์ด๋ฉฐ, [[DataView]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์žˆ๋‹ค๋ฉด:

    1. types์— DataView๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ DataView๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. types์— object๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  9. V๊ฐ€ Object์ด๋ฉฐ, [[TypedArrayName]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์žˆ๋‹ค๋ฉด:

    1. types์— typed array ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ , ํ•ด๋‹น ํƒ€์ž… ์ด๋ฆ„์ด V์˜ [[TypedArrayName]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์˜ ๊ฐ’๊ณผ ๊ฐ™๋‹ค๋ฉด, V๋ฅผ ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. types์— object๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  10. IsCallable(V)๊ฐ€ true๋ผ๋ฉด:

    1. types์— callback function ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ ํ•ด๋‹น callback function ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. types์— object๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  11. V๊ฐ€ Object๋ผ๋ฉด:

    1. types์— async sequence ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด

      1. types์— string ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ฑฐ๋‚˜, V์— [[StringData]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์—†๋‹ค๋ฉด,

        1. asyncMethod๋ฅผ ? GetMethod(V, %Symbol.asyncIterator%)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        2. asyncMethod๊ฐ€ undefined๊ฐ€ ์•„๋‹ˆ๋ฉด, IDL async sequence ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. object๋Š” V, method๋Š” syncMethod, type์€ "async"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        3. syncMethod๋ฅผ ? GetMethod(V, %Symbol.iterator%)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        4. syncMethod๊ฐ€ undefined๊ฐ€ ์•„๋‹ˆ๋ฉด, IDL async sequence ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. object๋Š” V, method๋Š” syncMethod, type์€ "sync"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. types์— sequence ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด

      1. method๋ฅผ ? GetMethod(V, %Symbol.iterator%)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. method๊ฐ€ undefined๊ฐ€ ์•„๋‹ˆ๋ฉด, ํ•ด๋‹น ํƒ€์ž…์˜ ์‹œํ€€์Šค ์ƒ์„ฑ ๊ฒฐ๊ณผ๋ฅผ V์™€ method๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. types์— frozen array ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด

      1. method๋ฅผ ? GetMethod(V, %Symbol.iterator%)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. method๊ฐ€ undefined๊ฐ€ ์•„๋‹ˆ๋ฉด, ํ•ด๋‹น ํƒ€์ž…์˜ frozen array ์ƒ์„ฑ ๊ฒฐ๊ณผ๋ฅผ V์™€ method๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    4. types์— dictionary ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ ํ•ด๋‹น dictionary ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    5. types์— record ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ ํ•ด๋‹น record ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    6. types์— callback interface ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ ํ•ด๋‹น callback interface ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    7. types์— object๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  12. V๊ฐ€ Boolean ํƒ€์ž…์ด๋ผ๋ฉด:

    1. types์— boolean์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ boolean์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  13. V๊ฐ€ Number ํƒ€์ž…์ด๋ผ๋ฉด:

    1. types์— numeric ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ ํ•ด๋‹น numeric ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  14. V๊ฐ€ BigInt ํƒ€์ž…์ด๋ผ๋ฉด:

    1. types์— bigint๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ bigint๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  15. types์— string ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  16. types์— numeric ํƒ€์ž…๊ณผ bigint๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ ํ•ด๋‹น numeric ํƒ€์ž… ๋˜๋Š” bigint๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  17. types์— numeric ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ ํ•ด๋‹น numeric ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  18. types์— boolean์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ boolean์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  19. types์— bigint๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, V๋ฅผ bigint๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  20. TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค. TypeError.

IDL union ํƒ€์ž… ๊ฐ’์€ ํ•ด๋‹น union ๊ฐ’์˜ ๊ตฌ์ฒด ํƒ€์ž…(specific type)์— ๋Œ€ํ•œ ๋ณ€ํ™˜ ๊ทœ์น™์— ๋”ฐ๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. (์ž์„ธํ•œ ๋‚ด์šฉ์€ ยงโ€ฏ3.2 JavaScript ํƒ€์ž… ๋งคํ•‘ ์ฐธ์กฐ)

3.2.26. ๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž…

IDL ArrayBuffer ๊ฐ’์€ ํ•ด๋‹น JavaScript ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ’์ด ์—ฐ๊ฒฐ๋œ [AllowResizable] ํ™•์žฅ ์†์„ฑ์„ ๊ฐ–์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, JavaScript ArrayBuffer ๊ฐ์ฒด V ์ค‘ IsFixedLengthArrayBuffer(V)๊ฐ€ true์ธ ๊ฒƒ๋งŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IDL SharedArrayBuffer ๊ฐ’์€ ํ•ด๋‹น JavaScript ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ’์ด ์—ฐ๊ฒฐ๋œ [AllowResizable] ํ™•์žฅ ์†์„ฑ์„ ๊ฐ–์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, JavaScript SharedArrayBuffer ๊ฐ์ฒด V ์ค‘ IsFixedLengthArrayBuffer(V)๊ฐ€ true์ธ ๊ฒƒ๋งŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IDL ๋ฒ„ํผ ๋ทฐ ํƒ€์ž…์˜ ๊ฐ’์€ ํ•ด๋‹น JavaScript ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ์ด๋Ÿฌํ•œ ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ์ œํ•œ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

JavaScript ๊ฐ’ V๋Š” ๋ณ€ํ™˜๋˜์–ด IDL ArrayBuffer ๊ฐ’์ด ๋˜๋ฉฐ, ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. V๊ฐ€ Object๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜, V์— [[ArrayBufferData]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์—†์œผ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  2. IsSharedArrayBuffer(V)๊ฐ€ true์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  3. ๋ณ€ํ™˜ ๋Œ€์ƒ์ธ IDL ํƒ€์ž…์ด ์—ฐ๊ฒฐ๋œ [AllowResizable] ํ™•์žฅ ์†์„ฑ์„ ๊ฐ–์ง€ ์•Š๊ณ , IsFixedLengthArrayBuffer(V)๊ฐ€ false์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  4. IDL ArrayBuffer ๊ฐ’ ์ค‘ V์™€ ๋™์ผํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

JavaScript ๊ฐ’ V๋Š” ๋ณ€ํ™˜๋˜์–ด IDL SharedArrayBuffer ๊ฐ’์ด ๋˜๋ฉฐ, ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. V๊ฐ€ Object๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜, V์— [[ArrayBufferData]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์—†์œผ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  2. IsSharedArrayBuffer(V)๊ฐ€ false์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  3. ๋ณ€ํ™˜ ๋Œ€์ƒ์ธ IDL ํƒ€์ž…์ด ์—ฐ๊ฒฐ๋œ [AllowResizable] ํ™•์žฅ ์†์„ฑ์„ ๊ฐ–์ง€ ์•Š๊ณ , IsFixedLengthArrayBuffer(V)๊ฐ€ false์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  4. IDL SharedArrayBuffer ๊ฐ’ ์ค‘ V์™€ ๋™์ผํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

JavaScript ๊ฐ’ V๋Š” ๋ณ€ํ™˜๋˜์–ด IDL DataView ๊ฐ’์ด ๋˜๋ฉฐ, ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. V๊ฐ€ Object๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜, V์— [[DataView]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์—†์œผ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  2. ๋ณ€ํ™˜ ๋Œ€์ƒ์ธ IDL ํƒ€์ž…์ด ์—ฐ๊ฒฐ๋œ [AllowShared] ํ™•์žฅ ์†์„ฑ์„ ๊ฐ–์ง€ ์•Š๊ณ , IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) ๊ฐ€ true์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  3. ๋ณ€ํ™˜ ๋Œ€์ƒ์ธ IDL ํƒ€์ž…์ด ์—ฐ๊ฒฐ๋œ [AllowResizable] ํ™•์žฅ ์†์„ฑ์„ ๊ฐ–์ง€ ์•Š๊ณ , IsFixedLengthArrayBuffer(V.[[ViewedArrayBuffer]]) ๊ฐ€ false์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  4. IDL DataView ๊ฐ’ ์ค‘ V์™€ ๋™์ผํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

JavaScript ๊ฐ’ V๋Š” ๋ณ€ํ™˜๋˜์–ด IDL Int8Array, Int16Array, Int32Array, Uint8Array, Uint16Array, Uint32Array, Uint8ClampedArray, BigInt64Array, BigUint64Array, Float16Array, Float32Array, ๋˜๋Š” Float64Array ๊ฐ’์œผ๋กœ ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•˜์—ฌ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค:

  1. T๋ฅผ V๊ฐ€ ๋ณ€ํ™˜๋˜๋Š” ๋Œ€์ƒ IDL ํƒ€์ž…์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. V๊ฐ€ Object๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜, V์— [[TypedArrayName]] ๋‚ด๋ถ€ ์Šฌ๋กฏ ์ค‘ T์˜ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ๊ฒƒ์ด ์—†๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  3. ๋ณ€ํ™˜ ๋Œ€์ƒ์ธ IDL ํƒ€์ž…์ด ์—ฐ๊ฒฐ๋œ [AllowShared] ํ™•์žฅ ์†์„ฑ์„ ๊ฐ–์ง€ ์•Š๊ณ , IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) ๊ฐ€ true์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  4. ๋ณ€ํ™˜ ๋Œ€์ƒ์ธ IDL ํƒ€์ž…์ด ์—ฐ๊ฒฐ๋œ [AllowResizable] ํ™•์žฅ ์†์„ฑ์„ ๊ฐ–์ง€ ์•Š๊ณ , IsFixedLengthArrayBuffer(V.[[ViewedArrayBuffer]]) ๊ฐ€ false์ด๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

  5. V์™€ ๋™์ผํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ์ธ ํƒ€์ž… T์˜ IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

IDL buffer source ํƒ€์ž…์˜ ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋Š” ํ•ด๋‹น IDL ๊ฐ’์ด ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด์™€ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” Object ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ์„ ํ•˜๋ ค๋ฉด ArrayBuffer๋ฅผ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค bytes์™€ realm realm์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:
  1. jsArrayBuffer๋ฅผ ? AllocateArrayBuffer(realm.[[Intrinsics]].[[%ArrayBuffer%]], bytes์˜ ๊ธธ์ด)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. arrayBuffer๋ฅผ ๋ณ€ํ™˜์„ ํ†ตํ•ด jsArrayBuffer๋ฅผ ArrayBuffer ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. bytes๋ฅผ arrayBuffer์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

  4. arrayBuffer๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ์„ ํ•˜๋ ค๋ฉด SharedArrayBuffer๋ฅผ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค bytes์™€ realm realm์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:
  1. jsSharedArrayBuffer๋ฅผ ? AllocateSharedArrayBuffer(realm.[[Intrinsics]].[[%SharedArrayBuffer%]], bytes์˜ ๊ธธ์ด)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. sharedArrayBuffer๋ฅผ ๋ณ€ํ™˜์„ ํ†ตํ•ด jsSharedArrayBuffer๋ฅผ SharedArrayBuffer ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. bytes๋ฅผ sharedArrayBuffer์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

  4. sharedArrayBuffer๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ์„ ํ•˜๋ ค๋ฉด ArrayBufferView ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค bytes์™€ realm realm์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:
  1. ๋‹จ, ํƒ€์ž…์ด DataView๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, bytes์˜ ๊ธธ์ด๋ฅผ ํ•ด๋‹น ํƒ€์ž…์˜ ์š”์†Œ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๊ฐ€ 0์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. arrayBuffer๋ฅผ ์ƒ์„ฑ์„ ํ†ตํ•ด ArrayBuffer๋กœ bytes์™€ realm์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  3. jsArrayBuffer๋ฅผ ๋ณ€ํ™˜์„ ํ†ตํ•ด arrayBuffer๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. constructor๋ฅผ realm.[[Intrinsics]]์—์„œ ์ƒ์„ฑํ•  ArrayBufferView ํƒ€์ž…์— ๋งž๋Š” ์ƒ์„ฑ์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. jsView๋ฅผ ! Construct(constructor, ยซ jsArrayBuffer ยป)๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  6. ๋ณ€ํ™˜์„ ํ†ตํ•ด jsView๋ฅผ ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„ํผ ์†Œ์Šค์˜ ๋ฐ”์ดํŠธ ๋ณต์‚ฌ ์–ป๊ธฐ๋Š” buffer source ํƒ€์ž… ์ธ์Šคํ„ด์Šค bufferSource์— ๋Œ€ํ•ด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:
  1. jsBufferSource๋ฅผ ๋ณ€ํ™˜์„ ํ†ตํ•ด bufferSource๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. jsArrayBuffer๋ฅผ jsBufferSource๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. offset์„ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. length์„ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. jsBufferSource๊ฐ€ [[ViewedArrayBuffer]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์„ ๊ฐ€์ง€๋ฉด:

    1. jsArrayBuffer๋ฅผ jsBufferSource.[[ViewedArrayBuffer]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. offset์„ jsBufferSource.[[ByteOffset]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. length์„ jsBufferSource.[[ByteLength]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

    1. jsBufferSource๋Š” ArrayBuffer ๋˜๋Š” SharedArrayBuffer ๊ฐ์ฒด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    2. length์„ jsBufferSource.[[ArrayBufferByteLength]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. IsDetachedBuffer(jsArrayBuffer)๊ฐ€ true๋ฉด ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  8. bytes๋ฅผ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋กœ ์ƒ์„ฑํ•˜๋ฉฐ, ๊ธธ์ด๋Š” length๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. ๊ฐ i์— ๋Œ€ํ•ด, ๋ฒ”์œ„ offset๋ถ€ํ„ฐ offset + length๊นŒ์ง€์—์„œ ๋๊ฐ’์„ ์ œ์™ธํ•˜๊ณ , ์„ค์ • ๋Œ€์ƒ์ธ bytes[i โˆ’ offset]์„ GetValueFromBuffer(jsArrayBuffer, i, Uint8, true, Unordered)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  10. bytes๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์ดํŠธ ๊ธธ์ด๋Š” buffer source ํƒ€์ž… ์ธ์Šคํ„ด์Šค bufferSource์— ๋Œ€ํ•ด ๋‹ค์Œ ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค:
  1. jsBufferSource๋ฅผ ๋ณ€ํ™˜์„ ํ†ตํ•ด bufferSource๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. jsBufferSource๊ฐ€ [[ViewedArrayBuffer]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์„ ๊ฐ€์ง€๋ฉด, jsBufferSource.[[ByteLength]]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. jsBufferSource.[[ArrayBufferByteLength]]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ € ๋ฒ„ํผ(underlying buffer)๋ž€ ๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž… ์ธ์Šคํ„ด์Šค bufferSource์— ๋Œ€ํ•ด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:
  1. bufferSource๊ฐ€ ๋ฒ„ํผ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ผ๋ฉด bufferSource๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. jsBufferView๋ฅผ IDL์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ bufferSource์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. jsBuffer๋ฅผ jsBufferView.[[ViewedArrayBuffer]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. IsSharedArrayBuffer(jsBuffer)๊ฐ€ false๋ผ๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์„ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ jsBuffer๋ฅผ ArrayBuffer ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์„ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ jsBuffer๋ฅผ SharedArrayBuffer ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์“ฐ๊ธฐ(write)๋ž€ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค(byte sequence) bytes๋ฅผ ๋ฒ„ํผ ํƒ€์ž… ์ธ์Šคํ„ด์Šค arrayBuffer์— ์“ธ ๋•Œ, ์˜ต์…”๋„๋กœ startingOffset (๊ธฐ๋ณธ๊ฐ’ 0)์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1. jsArrayBuffer๋ฅผ IDL์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ arrayBuffer์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹จ์–ธ: bytes์˜ ๊ธธ์ด(length) โ‰ค jsArrayBuffer.[[ArrayBufferByteLength]] โˆ’ startingOffset.

  3. ๊ฐ i์— ๋Œ€ํ•ด, ๋ฒ”์œ„ startingOffset๋ถ€ํ„ฐ startingOffset + bytes์˜ ๊ธธ์ด๊นŒ์ง€์—์„œ ๋๊ฐ’์„ ์ œ์™ธํ•˜๊ณ , ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค: SetValueInBuffer(jsArrayBuffer, i, Uint8, bytes[i - startingOffset], true, Unordered).

์“ฐ๊ธฐ(write)๋ž€ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค(byte sequence) bytes๋ฅผ ArrayBufferView view์— ์“ธ ๋•Œ, ์˜ต์…”๋„๋กœ startingOffset (๊ธฐ๋ณธ๊ฐ’ 0)์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  1. jsView๋ฅผ IDL์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ view์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹จ์–ธ: bytes์˜ ๊ธธ์ด โ‰ค jsView.[[ByteLength]] โˆ’ startingOffset.

  3. ๋‹จ์–ธ: view๊ฐ€ DataView๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ, bytes์˜ ๊ธธ์ด๋ฅผ modulo view์˜ ํƒ€์ž…์˜ ์š”์†Œ ํฌ๊ธฐ(element size)๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๊ฐ€ 0์ž„์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  4. arrayBuffer๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์„ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ jsView.[[ViewedArrayBuffer]]๋ฅผ ArrayBuffer ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ์“ฐ๊ธฐ(write)๋ฅผ bytes์™€ arrayBuffer๋กœ, startingOffset์„ jsView.[[ByteOffset]] + startingOffset์œผ๋กœ ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž… ์ธ์Šคํ„ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ๋Š”, ์•„๋ž˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์‹œ์ ์— ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์ž๋‚˜ ๋‹ค๋ฅธ API์— ์˜ํ•ด ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ช…์„ธ ์ž‘์„ฑ ์‹œ ๊ฐ๋ณ„ํžˆ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ SharedArrayBuffer ๊ฐ์ฒด๊ฐ€ ๊ด€๋ จ๋œ ๊ฒฝ์šฐ ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

๊ณต์œ ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๋ณด๋‹ค ๊ถŒ์žฅ๋˜๋Š” ํŒจํ„ด์€ transfer(์ด์ „)๋ฅผ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜์—ฌ ArrayBuffer ์ธ์Šคํ„ด์Šค์˜ ์“ฐ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ์ˆ˜์ •๊ณผ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•œ ๋’ค, ํ•„์š”์— ๋”ฐ๋ผ ์ƒˆ ArrayBuffer ์ธ์Šคํ„ด์Šค๋ฅผ ์ž‘์„ฑ์ž ์ฝ”๋“œ์— ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ๋ฒ„ํผ ์†Œ์Šค๊ฐ€ ๊ฐ€์ง„ ๋ฐ”์ดํŠธ์˜ ๋ณต์‚ฌ๋ณธ์„ ์–ป์–ด ํ•ด๋‹น ๋ฐ”์ดํŠธ๋ฅผ ์ˆ˜์ •ํ•œ ๋’ค, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์„ฑํ•œ ์ƒˆ๋กœ์šด ArrayBuffer๋‚˜ ArrayBufferView ๋ฅผ ์ž‘์„ฑ์ž ์ฝ”๋“œ์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

detach(๋ถ„๋ฆฌ)๋ž€ ArrayBuffer arrayBuffer์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:
  1. jsArrayBuffer๋ฅผ IDL์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ arrayBuffer์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ? DetachArrayBuffer(jsArrayBuffer)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ jsArrayBuffer๊ฐ€ [[ArrayBufferDetachKey]]๊ฐ€ undefined๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ, (์˜ˆ: WebAssembly.Memory์˜ buffer ์†์„ฑ๊ฐ’ ๋“ฑ) ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. [WASM-JS-API-1]

์ด๋ฏธ detached(๋ถ„๋ฆฌ๋จ)๋œ ๋ฒ„ํผ๋ฅผ detachํ•˜๋Š” ๊ฒƒ์€ ์•„๋ฌด ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž… ์ธ์Šคํ„ด์Šค bufferSource๊ฐ€ detached(๋ถ„๋ฆฌ๋จ)์ธ์ง€ ์—ฌ๋ถ€๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:
  1. jsArrayBuffer๋ฅผ IDL์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ bufferSource์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. jsArrayBuffer๊ฐ€ [[ViewedArrayBuffer]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์„ ๊ฐ€์ง„ ๊ฒฝ์šฐ, jsArrayBuffer๋ฅผ jsArrayBuffer.[[ViewedArrayBuffer]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. IsDetachedBuffer(jsArrayBuffer)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž… ์ธ์Šคํ„ด์Šค bufferSource๊ฐ€ transferable(์ด์ „ ๊ฐ€๋Šฅ)์ธ์ง€ ์—ฌ๋ถ€๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:
  1. jsArrayBuffer๋ฅผ IDL์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ bufferSource์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. jsArrayBuffer๊ฐ€ [[ViewedArrayBuffer]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์„ ๊ฐ€์ง„ ๊ฒฝ์šฐ, jsArrayBuffer๋ฅผ jsArrayBuffer.[[ViewedArrayBuffer]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. IsSharedArrayBuffer(jsArrayBuffer)๊ฐ€ true์ด๋ฉด false ๋ฐ˜ํ™˜.

  4. IsDetachedBuffer(jsArrayBuffer)๊ฐ€ true์ด๋ฉด false ๋ฐ˜ํ™˜.

  5. jsArrayBuffer.[[ArrayBufferDetachKey]]๊ฐ€ undefined๊ฐ€ ์•„๋‹ˆ๋ฉด false ๋ฐ˜ํ™˜.

  6. true ๋ฐ˜ํ™˜.

transfer(์ด์ „)๋ž€ ArrayBuffer arrayBuffer๋ฅผ, ์˜ต์…”๋„ํ•˜๊ฒŒ realm targetRealm์— ์ด์ „ํ•  ๋•Œ:
  1. jsArrayBuffer๋ฅผ IDL์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ arrayBuffer์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. IsDetachedBuffer(jsArrayBuffer)๊ฐ€ true๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค. TypeError.

  3. arrayBufferData๋ฅผ jsArrayBuffer.[[ArrayBufferData]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. arrayBufferByteLength๋ฅผ jsArrayBuffer.[[ArrayBufferByteLength]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ? DetachArrayBuffer(jsArrayBuffer)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  6. targetRealm์ด ์—†์œผ๋ฉด targetRealm์„ ํ˜„์žฌ realm์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. jsTransferred๋ฅผ ? AllocateArrayBuffer(targetRealm.[[Intrinsics]].[[%ArrayBuffer%]], 0)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  8. jsTransferred.[[ArrayBufferData]]๋ฅผ arrayBufferData๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. jsTransferred.[[ArrayBufferByteLength]]๋ฅผ arrayBufferByteLength๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  10. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์„ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ jsTransferred๋ฅผ ArrayBuffer ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:
  • arrayBuffer๊ฐ€ detached(๋ถ„๋ฆฌ๋จ)๋  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๋ช… (์ฐธ๊ณ )์— ๋ช…์‹œ๋œ ์ด์œ  ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค;

  • arrayBuffer๊ฐ€ ์ด๋ฏธ detached(๋ถ„๋ฆฌ๋จ)์ธ ๊ฒฝ์šฐ;

  • realm์— ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†์„ ๋•Œ. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” realm์ด arrayBuffer๊ฐ€ ํ• ๋‹น๋œ ์—์ด์ „ํŠธ ํด๋Ÿฌ์Šคํ„ฐ(agent cluster)์™€ ๋‹ค๋ฅผ ๋•Œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์—์ด์ „ํŠธ ํด๋Ÿฌ์Šคํ„ฐ์ธ ๊ฒฝ์šฐ์—๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฐฑํ‚น ํฌ์ธํ„ฐ๋งŒ ๋ณ€๊ฒฝํ•˜์—ฌ ๋” ๋‚˜์€ ์„ฑ๋Šฅ๊ณผ ํ• ๋‹น ์—†์ด ๋™์ผํ•œ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.27. ๋ถˆ๋ณ€ ๋ฐฐ์—ด โ€” FrozenArray<T>

๋ถˆ๋ณ€ ๋ฐฐ์—ด ํƒ€์ž…์˜ ๊ฐ’์€ ๋ถˆ๋ณ€(frozen) JavaScript Array ๊ฐ์ฒด ์ฐธ์กฐ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

JavaScript ๊ฐ’ V๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ IDL FrozenArray<T> ๊ฐ’์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. values๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ V๋ฅผ IDL ํƒ€์ž… sequence<T>์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. ๋ถˆ๋ณ€ ๋ฐฐ์—ด ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— values๋ฅผ ๋„ฃ์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ถˆ๋ณ€ ๋ฐฐ์—ด ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ํƒ€์ž… T์˜ ๊ฐ’ ์‹œํ€€์Šค์— ๋Œ€ํ•ด ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. array๋ฅผ IDL โ†’ JavaScript ๊ฐ’ ๋ณ€ํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํƒ€์ž… T ๊ฐ’ ์‹œํ€€์Šค๋ฅผ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. ! SetIntegrityLevel(array, "frozen")์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  3. array๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IDL โ†’ JavaScript ๊ฐ’ ๋ณ€ํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฒฐ๊ณผ๋กœ IDL FrozenArray<T> ๊ฐ’์„ JavaScript ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด, ํ•ด๋‹น IDL FrozenArray<T>์ด ์ฐธ์กฐํ•˜๋Š” ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” Object ๊ฐ’์ด ๋œ๋‹ค.

3.2.27.1. ์ดํ„ฐ๋Ÿฌ๋ธ”๋กœ๋ถ€ํ„ฐ ๋ถˆ๋ณ€ ๋ฐฐ์—ด ์ƒ์„ฑ

์ดํ„ฐ๋Ÿฌ๋ธ” iterable๊ณผ ์ดํ„ฐ๋ ˆ์ดํ„ฐ getter method๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, IDL ํƒ€์ž… FrozenArray<T>๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜:

  1. values๋ฅผ ์ดํ„ฐ๋Ÿฌ๋ธ”๋กœ๋ถ€ํ„ฐ ์‹œํ€€์Šค ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— iterable๊ณผ method๋ฅผ ๋„ฃ์–ด ํƒ€์ž… sequence<T>๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. ๋ถˆ๋ณ€ ๋ฐฐ์—ด ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— values๋ฅผ ๋„ฃ์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.2.28. ๊ด€์ธก ๋ฐฐ์—ด โ€” ObservableArray<T>

๊ด€์ธก ๋ฐฐ์—ด ํƒ€์ž…์˜ ๊ฐ’์€ observable array exotic object๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ณ€ํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋Œ€์‹ , ๊ด€์ธก ๋ฐฐ์—ด ํƒ€์ž…์€ attribute getter์™€ attribute setter ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ผ๋ถ€๋กœ ํŠน๋ณ„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

JavaScript ๋ฐ”์ธ๋”ฉ์—์„œ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” JavaScript ๊ฐ์ฒด๋Š” backing observable array exotic object๋ฅผ ๊ฐ ์ •๊ทœ attribute์— ๋Œ€ํ•ด ๊ด€์ธก ๋ฐฐ์—ด ํƒ€์ž…์— ๋Œ€ํ•ด ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด๋Š” attribute ์ •์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ผ๋ถ€๋กœ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

JavaScript ๋ฐ”์ธ๋”ฉ์—์„œ ๊ด€์ธก ๋ฐฐ์—ด attribute์˜ backing list๋Š”, ํ”Œ๋žซํผ ๊ฐ์ฒด obj์™€ attribute attribute๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” list์ž…๋‹ˆ๋‹ค:
  1. ๋‹จ์–ธ: obj๋Š” ๊ตฌํ˜„ํ•œ interface์— ์ •๊ทœ attribute attribute๊ฐ€ ์žˆ๋‹ค.

  2. oa๋ฅผ obj์˜ backing observable array exotic object๋กœ attribute์— ๋Œ€ํ•ด ์„ค์ •ํ•œ๋‹ค.

  3. oa.[[ProxyHandler]].[[BackingList]]๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.3. ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

์ด ์ ˆ์—์„œ๋Š” JavaScript ๋ฐ”์ธ๋”ฉ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์—ฌ๋Ÿฌ ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

3.3.1. [AllowResizable]

๋งŒ์•ฝ [AllowResizable] ํ™•์žฅ ์†์„ฑ์ด ์ž ์žฌ์ ์œผ๋กœ ๋„ ํ—ˆ์šฉ ๋ฒ„ํผ ํƒ€์ž…์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹นํ•˜๋Š” JavaScript์˜ ๊ฐ๊ฐ ๋Œ€์‘ํ•˜๋Š” ArrayBuffer ๋˜๋Š” SharedArrayBuffer ๊ฐ์ฒด๊ฐ€ ํฌ๊ธฐ ์กฐ์ • ๊ฐ€๋Šฅํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ์ƒˆ IDL ํƒ€์ž…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋งŒ์•ฝ [AllowResizable] ํ™•์žฅ ์†์„ฑ์ด ์ž ์žฌ์ ์œผ๋กœ ๋„ ํ—ˆ์šฉ ๋ฒ„ํผ ๋ทฐ ํƒ€์ž…์— ๋‚˜ํƒ€๋‚˜๊ณ  [AllowShared] ํ™•์žฅ ์†์„ฑ์€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์œผ๋ฉด, ์ƒˆ IDL ํƒ€์ž…์„ ๋งŒ๋“ค์–ด ๋ฒ„ํผ ๋ทฐ ํƒ€์ž…์ด JavaScript ArrayBuffer ์ค‘ ํฌ๊ธฐ ์กฐ์ • ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, ๊ณ ์ • ๊ธธ์ด์˜ ArrayBuffer๋งŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋„๋ก ์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ [AllowResizable] ํ™•์žฅ ์†์„ฑ๊ณผ [AllowShared] ํ™•์žฅ ์†์„ฑ์ด ๋ชจ๋‘ ์ž ์žฌ์ ์œผ๋กœ ๋„ ํ—ˆ์šฉ ๋ฒ„ํผ ๋ทฐ ํƒ€์ž…์— ๋‚˜ํƒ€๋‚˜๋ฉด, ์ƒˆ IDL ํƒ€์ž…์„ ๋งŒ๋“ค์–ด ๋ฒ„ํผ ๋ทฐ ํƒ€์ž…์ด ์ถ”๊ฐ€๋กœ JavaScript SharedArrayBuffer ์ค‘ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

[AllowResizable] ํ™•์žฅ ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž ์žฌ์ ์œผ๋กœ ๋„ ํ—ˆ์šฉ ๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž…์ด ์•„๋‹Œ ํƒ€์ž…์€ [AllowResizable] ํ™•์žฅ ์†์„ฑ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

[AllowResizable]์˜ ์‚ฌ์šฉ์— ์ˆ˜๋ฐ˜๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์€ ยง 3.2.26 ๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž…์˜ JavaScript ๊ฐ’์„ IDL ๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ทœ์น™์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

[AllowResizable] ๋ฐ [AllowShared] ๋‘˜ ๋‹ค์˜ ์‚ฌ์šฉ ์˜ˆ๋Š” ยง 3.3.2 [AllowShared]์˜ ์˜ˆ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

3.3.2. [AllowShared]

๋งŒ์•ฝ [AllowShared] ํ™•์žฅ ์†์„ฑ์ด ์ž ์žฌ์ ์œผ๋กœ ๋„ ํ—ˆ์šฉ ๋ฒ„ํผ ๋ทฐ ํƒ€์ž…์— ๋‚˜ํƒ€๋‚˜๋ฉด, ๊ฐ์ฒด๊ฐ€ ๋‹ค์Œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ƒˆ IDL ํƒ€์ž…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค: SharedArrayBuffer ์ฆ‰, ArrayBuffer๋งŒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋„๋ก ์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

[AllowShared] ํ™•์žฅ ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž ์žฌ์ ์œผ๋กœ ๋„ ํ—ˆ์šฉ ๋ฒ„ํผ ๋ทฐ ํƒ€์ž…์ด ์•„๋‹Œ ํƒ€์ž…์€ [AllowShared] ํ™•์žฅ ์†์„ฑ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

[AllowShared]์˜ ์‚ฌ์šฉ์— ์ˆ˜๋ฐ˜๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์€ ยง 3.2.26 ๋ฒ„ํผ ์†Œ์Šค ํƒ€์ž…์˜ JavaScript ๊ฐ’์„ IDL ๋ฒ„ํผ ๋ทฐ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ทœ์น™์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” [AllowResizable]์™€ [AllowShared] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ์กฐํ•ฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:
[Exposed=Window]
interface ExampleBufferFeature {
  undefined writeInto(ArrayBufferView dest);
  undefined writeIntoResizable([AllowResizable] ArrayBufferView dest);
  undefined writeIntoShared([AllowShared] ArrayBufferView dest);
  undefined writeIntoSharedResizable([AllowResizable, AllowShared] ArrayBufferView dest);
};

์ด ์ •์˜์—์„œ,

3.3.3. [Clamp]

[Clamp] ํ™•์žฅ ์†์„ฑ์ด ์ž ์žฌ์ ์œผ๋กœ ๋„ ํ—ˆ์šฉ ์ •์ˆ˜ ํƒ€์ž…์— ๋‚˜ํƒ€๋‚˜๋ฉด, JavaScript Number๊ฐ€ IDL ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋  ๋•Œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฐ’์— ๋ชจ๋“ˆ๋กœ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์œ ํšจํ•œ ๊ฐ’์˜ ๋ฒ”์œ„๋กœ ์ œํ•œ๋˜๋„๋ก ํ•˜๋Š” ์ƒˆ๋กœ์šด IDL ํƒ€์ž…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค(ToInt32, ToUint32 ๋“ฑ).

[Clamp] ํ™•์žฅ ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

JavaScript ๊ฐ’์„ ๋‹ค์–‘ํ•œ IDL ์ •์ˆ˜ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ทœ์น™์€ ยง 3.2.4 ์ •์ˆ˜ ํƒ€์ž…์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋‹ค์Œ ์‚ฌ์šฉ์— ์ˆ˜๋ฐ˜๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค: [Clamp].

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ์—์„œ๋Š” ์„ธ ๊ฐœ์˜ octet ์ธ์ž๋ฅผ ๋ฐ›๋Š” ๋‘ ๊ฐœ์˜ operation์ด ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์„ธ ์ธ์ž ๋ชจ๋‘์— [Clamp] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

[Exposed=Window]
interface GraphicsContext {
  undefined setColor(octet red, octet green, octet blue);
  undefined setColorClamped([Clamp] octet red, [Clamp] octet green, [Clamp] octet blue);
};

setColorClamped๋ฅผ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ Number ๊ฐ’๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ฉด, octet ํƒ€์ž…์˜ ๋ฒ”์œ„ [0, 255]๋กœ ๊ฐ’์„ ํด๋žจํ”„ํ•ฉ๋‹ˆ๋‹ค.

// GraphicsContext ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์Œ.
var context = getGraphicsContext();

// [Clamp]๊ฐ€ ์—†๋Š” ๋ฒ„์ „์€ ToUint8์„ ์‚ฌ์šฉํ•˜์—ฌ Number๋ฅผ octet์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
// ์ด๋Š” setColor(255, 255, 1)์„ ํ˜ธ์ถœํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
context.setColor(-1, 255, 257);

// ๋ฒ”์œ„ ์ดˆ๊ณผ ๊ฐ’์„ setColorClamped์— ์ „๋‹ฌ.
// ์ด๋Š” setColorClamped(0, 255, 255)๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
context.setColorClamped(-1, 255, 257);

3.3.4. [CrossOriginIsolated]

[CrossOriginIsolated] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ interface, partial interface, interface mixin, partial interface mixin, callback interface, namespace, partial namespace, interface member, interface mixin member, ๋˜๋Š” namespace member์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ํ™˜๊ฒฝ์ด cross-origin isolated capability ๊ฐ€ true์ผ ๋•Œ๋งŒ ๋…ธ์ถœ๋จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. [CrossOriginIsolated] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์— ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

[CrossOriginIsolated] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[CrossOriginIsolated] ๊ฐ€ ์˜ค๋ฒ„๋กœ๋“œ๋œ operation์— ๋‚˜ํƒ€๋‚˜๋ฉด, ๋ชจ๋“  ์˜ค๋ฒ„๋กœ๋“œ์— ๋ฐ˜๋“œ์‹œ ๋‚˜ํƒ€๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[CrossOriginIsolated] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๋‹ค์Œ ๊ฒฝ์šฐ ๋ชจ๋‘์— ๋ช…์‹œ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค:

์ฐธ๊ณ : ์ด๋Š” [CrossOriginIsolated] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ฉค๋ฒ„์— ์ถ”๊ฐ€ํ•ด๋„ ์ •์˜ ์ „์ฒด์— ์ด๋ฏธ [CrossOriginIsolated] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฉค๋ฒ„์˜ ๋…ธ์ถœ ๋ฒ”์œ„๊ฐ€ ์ถ”๊ฐ€๋กœ ์ œํ•œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

[CrossOriginIsolated] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์—†๋Š” interface๋Š” [CrossOriginIsolated]๋ฅผ ๋ช…์‹œํ•œ ๋‹ค๋ฅธ interface๋ฅผ ์ƒ์†ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ operation 1๊ฐœ์™€, cross-origin isolated ์ปจํ…์ŠคํŠธ์—์„œ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ operation 2๊ฐœ๋ฅผ ๊ฐ€์ง„ interface๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

[Exposed=Window]
interface ExampleFeature {
  // ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์„ฑ๊ณต
  Promise <Result> calculateNotSoSecretResult();

  // ์ด operation์€ ๋น„๊ฒฉ๋ฆฌ ์ปจํ…์ŠคํŠธ์— ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ ExampleFeature.prototype์— "calculateSecretResult" ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
  [CrossOriginIsolated] Promise<Result> calculateSecretResult();

  // ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด attribute๋„ ๋น„๊ฒฉ๋ฆฌ ์ปจํ…์ŠคํŠธ์— ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉฐ,
  // ExampleFeature.prototype์— "secretBoolean" ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
  [CrossOriginIsolated] readonly attribute boolean secretBoolean;
};

// HighResolutionTimer๋Š” ๋น„๊ฒฉ๋ฆฌ ์ปจํ…์ŠคํŠธ์— ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฉค๋ฒ„๋„ ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
// ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ Window์— "HighResolutionTimer" ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
[Exposed=Window, CrossOriginIsolated]
interface HighResolutionTimer {
  DOMHighResTimeStamp getHighResolutionTime();
};

// ์•„๋ž˜ interface mixin ๋ฉค๋ฒ„๋Š” ๋น„๊ฒฉ๋ฆฌ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋น„๊ฒฉ๋ฆฌ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ExampleFeature.prototype์— "snap" ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
[CrossOriginIsolated]
interface mixin Snapshotable {
  Promise<boolean> snap();
};
ExampleFeature includes Snapshotable;

// ๋ฐ˜๋ฉด, ์•„๋ž˜ interface mixin ๋ฉค๋ฒ„๋Š” ํ˜ธ์ŠคํŠธ interface์— [CrossOriginIsolated] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์—†์œผ๋ฉด ๋น„๊ฒฉ๋ฆฌ ์ปจํ…์ŠคํŠธ์—์„œ๋„ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
// ์ฆ‰, ๋น„๊ฒฉ๋ฆฌ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ExampleFeature.prototype์— "log" ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
interface mixin Loggable {
  Promise<boolean> log();
};
ExampleFeature includes Loggable;

3.3.5. [Default]

[Default] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ •๊ทœ operation์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น operation์ด ํ˜ธ์ถœ๋  ๋•Œ ์ ์ ˆํ•œ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

[Default] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Default] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ •๊ทœ operation ์™ธ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ํ•ด๋‹น operation์— ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋กœ, [Default] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” toJSON ์ •๊ทœ operation์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

[Exposed=Window]
interface Animal {
  attribute DOMString name;
  attribute unsigned short age;
  [Default] object toJSON();
};

[Exposed=Window]
interface Human : Animal {
  attribute Dog? pet;
  [Default] object toJSON();
};

[Exposed=Window]
interface Dog : Animal {
  attribute DOMString? breed;
};

JavaScript ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” Animal, Human, ๊ทธ๋ฆฌ๊ณ  ์ƒ์†์„ ํ†ตํ•ด Dog ๊ฐ์ฒด์—๋„ toJSON() ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค:

// Human ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์Œ.
var alice = getHuman();

// ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ์ฒด๋กœ ํ‰๊ฐ€๋จ ("pet"์€ Dog ์ธ์Šคํ„ด์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ–๊ณ  ์žˆ์Œ):
//
// {
//   name: "Alice",
//   age: 59,
//   pet: Dog
// }
alice.toJSON();

// ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ์ฒด๋กœ ํ‰๊ฐ€๋จ ("breed"๋Š” Dog ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ธฐ๋ณธ toJSON ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—†์Œ):
//
// {
//   name: "Tramp",
//   age: 6
// }
alice.pet.toJSON();

// ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด๋กœ ํ‰๊ฐ€๋จ:
// '{"name":"Alice","age":59,"pet":{"name":"Tramp","age":6}}'
JSON.stringify(alice);

3.3.6. [EnforceRange]

[EnforceRange] ํ™•์žฅ ์†์„ฑ์ด ์ž ์žฌ์ ์œผ๋กœ ๋„ ํ—ˆ์šฉ ์ •์ˆ˜ ํƒ€์ž…์— ๋‚˜ํƒ€๋‚˜๋ฉด, JavaScript Number๊ฐ€ IDL ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋  ๋•Œ, ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฐ’์€ ๋ชจ๋“ˆ๋กœ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํšจํ•œ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๋Œ€์‹  ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๋Š” ์ƒˆ IDL ํƒ€์ž…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค (ToInt32, ToUint32 ๋“ฑ). Number๋Š” ๋ฒ”์œ„์™€ ๋น„๊ตํ•˜์—ฌ ๊ฒ€์‚ฌ๋˜๊ธฐ ์ „์— 0์„ ํ–ฅํ•ด ๋ฐ˜์˜ฌ๋ฆผ๋ฉ๋‹ˆ๋‹ค.

[EnforceRange] ํ™•์žฅ ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

JavaScript ๊ฐ’์„ ๋‹ค์–‘ํ•œ IDL ์ •์ˆ˜ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ทœ์น™์€ ยง 3.2 JavaScript ํƒ€์ž… ๋งคํ•‘์—์„œ ์ฐธ์กฐํ•˜์‹œ๊ธฐ ๋ฐ”๋ผ๋ฉฐ, ์ด๋Š” [EnforceRange]์˜ ์‚ฌ์šฉ์— ์ˆ˜๋ฐ˜๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ์—์„œ๋Š” ์„ธ ๊ฐœ์˜ octet ์ธ์ž๋ฅผ ๋ฐ›๋Š” ๋‘ ๊ฐœ์˜ operation์ด ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์„ธ ์ธ์ž ๋ชจ๋‘์— [EnforceRange] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

[Exposed=Window]
interface GraphicsContext {
  undefined setColor(octet red, octet green, octet blue);
  undefined setColorEnforcedRange([EnforceRange] octet red, [EnforceRange] octet green, [EnforceRange] octet blue);
};

IDL์˜ JavaScript ๊ตฌํ˜„์—์„œ setColorEnforcedRange๋ฅผ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ Number ๊ฐ’๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜๋ฉด, octet ํƒ€์ž…์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฏ€๋กœ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

// GraphicsContext ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์Œ.
var context = getGraphicsContext();

// [EnforceRange]๊ฐ€ ์—†๋Š” ๋ฒ„์ „์€ ToUint8์„ ์‚ฌ์šฉํ•˜์—ฌ Number๋ฅผ octet์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
// ์ด๋Š” setColor(255, 255, 1)์„ ํ˜ธ์ถœํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
context.setColor(-1, 255, 257);

// setColorEnforcedRange๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Number๊ฐ€ 0 ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ˜์˜ฌ๋ฆผ๋ฉ๋‹ˆ๋‹ค.
// ์ด๋Š” setColor(0, 255, 255)๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
context.setColorEnforcedRange(-0.9, 255, 255.2);

// ์•„๋ž˜๋Š” ์˜ˆ์™ธ(TypeError)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋ฐ˜์˜ฌ๋ฆผ ํ›„์—๋„ ์ฒซ ๋ฒˆ์งธ์™€ ์„ธ ๋ฒˆ์งธ ์ธ์ž๊ฐ€ ๋ฒ”์œ„ ๋ฐ–์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
context.setColorEnforcedRange(-1, 255, 256);

3.3.7. [Exposed]

[Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ interface, partial interface, interface mixin, partial interface mixin, callback interface, namespace, partial namespace, ๋˜๋Š” ๊ฐœ๋ณ„ interface member, interface mixin member, ๋˜๋Š” namespace member์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ํŠน์ • ๊ธ€๋กœ๋ฒŒ ์ธํ„ฐํŽ˜์ด์Šค ์ง‘ํ•ฉ์— ๋…ธ์ถœ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

[Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์‹๋ณ„์ž, ์‹๋ณ„์ž ๋ฆฌ์ŠคํŠธ ๋˜๋Š” ์™€์ผ๋“œ์นด๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ๋œ ๊ฐ ์‹๋ณ„์ž๋Š” ์–ด๋–ค interface์˜ ๊ธ€๋กœ๋ฒŒ ์ด๋ฆ„์ด์–ด์•ผ ํ•˜๋ฉฐ, ์ค‘๋ณต๋˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ(own exposure set) ์€ ์‹๋ณ„์ž๋“ค์˜ ์ง‘ํ•ฉ์ด๊ฑฐ๋‚˜, ํŠน์ˆ˜ ๊ฐ’ *์ž…๋‹ˆ๋‹ค. ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

[Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์‹๋ณ„์ž I๋ฅผ ๊ฐ€์งˆ ๋•Œ

์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์€ ์ง‘ํ•ฉ ยซ I ยป ์ž…๋‹ˆ๋‹ค.

[Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์‹๋ณ„์ž ๋ฆฌ์ŠคํŠธ I๋ฅผ ๊ฐ€์งˆ ๋•Œ

์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์€ ์ง‘ํ•ฉ I ์ž…๋‹ˆ๋‹ค.

[Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์™€์ผ๋“œ์นด๋“œ๋ฅผ ๊ฐ€์งˆ ๋•Œ

์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์€ * ์ž…๋‹ˆ๋‹ค.

[Exposed=*]๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. API๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋…ธ์ถœํ•˜์ง€ ์•Š์„ ๋•Œ๋งŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. API๊ฐ€ ์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ ์ œํ•œ๋˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ธ€๋กœ๋ฒŒ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ฆฌ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค.

๋…ธ์ถœ ์ง‘ํ•ฉ ๊ต์ง‘ํ•ฉ์€ ๊ตฌ์„ฑ ์š”์†Œ C์™€ interface-or-null H์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค:

  1. ๋‹จ์–ธ: C๋Š” interface member, interface mixin member, namespace member, partial interface, partial interface mixin, partial namespace, ๋˜๋Š” interface mixin์ด๋‹ค.

  2. ๋‹จ์–ธ: H๋Š” interface ๋˜๋Š” null์ด๋‹ค.

  3. H๊ฐ€ null์ด๋ฉด, C์˜ ์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. C์˜ ์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์ด *์ด๋ฉด, H์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. H์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์ด *์ด๋ฉด, C์˜ ์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. C์˜ ์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ๊ณผ H์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์˜ ๊ต์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ C์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ(exposure set)์„ ์–ป์œผ๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:
  1. ๋‹จ์–ธ: C๋Š” interface, callback interface, namespace, interface member, interface mixin member, ๋˜๋Š” namespace member์ด๋‹ค.

  2. H๋ฅผ C๊ฐ€ interface mixin member์ผ ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. C๊ฐ€ interface member, interface mixin member, ๋˜๋Š” namespace member๋ผ๋ฉด:

    1. [Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ C์— ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฉด, ๋…ธ์ถœ ์ง‘ํ•ฉ ๊ต์ง‘ํ•ฉ์„ C์™€ H๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. C๋ฅผ interface, partial interface, interface mixin, partial interface mixin, namespace, ๋˜๋Š” partial namespace์˜ C๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. C๊ฐ€ partial interface, partial interface mixin, ๋˜๋Š” partial namespace์ผ ๊ฒฝ์šฐ:

    1. [Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ C์— ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฉด, ๋…ธ์ถœ ์ง‘ํ•ฉ ๊ต์ง‘ํ•ฉ์„ C์™€ H๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. C๋ฅผ ์›๋ž˜ interface, interface mixin, ๋˜๋Š” namespace ์ •์˜์˜ C๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. C๊ฐ€ interface mixin์ผ ๊ฒฝ์šฐ:

    1. ๋‹จ์–ธ: H๋Š” null์ด ์•„๋‹ˆ๋‹ค.

    2. [Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ C์— ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฉด, ๋…ธ์ถœ ์ง‘ํ•ฉ ๊ต์ง‘ํ•ฉ์„ C์™€ H๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    3. C๋ฅผ H๋กœ ์„ค์ •ํ•œ๋‹ค.

  6. ๋‹จ์–ธ: C๋Š” interface, callback interface, ๋˜๋Š” namespace์ด๋‹ค.

  7. ๋‹จ์–ธ: [Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ C์— ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค.

  8. C์˜ ์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

[Exposed] ๊ฐ€ ์˜ค๋ฒ„๋กœ๋“œ๋œ operation์— ๋‚˜ํƒ€๋‚˜๋ฉด, ๋ชจ๋“  ์˜ค๋ฒ„๋กœ๋“œ์— ๋™์ผํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” interface member, interface mixin member, ๋˜๋Š” namespace member์—, ๊ทธ๋ฆฌ๊ณ  partial interface, partial interface mixin, ๋˜๋Š” partial namespace ๊ทธ ๋ฉค๋ฒ„๊ฐ€ ์„ ์–ธ๋œ ์ •์˜ ๋ชจ๋‘์— ๋ช…์‹œ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : [Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ partial interface, partial interface mixin, ๋˜๋Š” partial namespace์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ์ •์˜์˜ ๊ฐ ๋ฉค๋ฒ„์— ์–ด๋…ธํ…Œ์ด์…˜ํ•˜๋Š” ์•ฝ์‹ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค.

[Exposed] ๊ฐ€ partial interface ๋˜๋Š” partial namespace์— ๋‚˜ํƒ€๋‚˜๋ฉด, partial์˜ ์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์€ partial์˜ ์›๋ž˜ interface ๋˜๋Š” namespace์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Exposed] ๊ฐ€ interface member ๋˜๋Š” namespace member์— ๋‚˜ํƒ€๋‚˜๋ฉด, member์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์€ ํ•ด๋‹น interface ๋˜๋Š” namespace์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Exposed] ๊ฐ€ partial interface mixin๊ณผ ๊ทธ ์›๋ž˜ interface mixin ๋ชจ๋‘์— ๋‚˜ํƒ€๋‚˜๋ฉด, partial interface mixin์˜ ์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์€ interface mixin์˜ ์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Exposed] ๊ฐ€ interface mixin member์™€ interface mixin ๋ชจ๋‘์— ๋‚˜ํƒ€๋‚˜๋ฉด, interface mixin member์˜ ์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์€ interface mixin์˜ ์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

interface X๊ฐ€ ๋‹ค๋ฅธ interface Y๋ฅผ ์ƒ์†ํ•˜๋ฉด, X์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์€ Y์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : interface mixin์€ ์—ฌ๋Ÿฌ interface์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ทธ ๋ฉค๋ฒ„์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” interface์— ๋”ฐ๋ผ ๊ฒฐ์ •๋œ๋‹ค. interface mixin member, partial interface mixin, ๋˜๋Š” interface mixin์— [Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์žˆ์œผ๋ฉด, ํ•ด๋‹น interface mixin member์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์€ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ž์‹ ์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ๊ณผ ํ˜ธ์ŠคํŠธ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์˜ ๊ต์ง‘ํ•ฉ์ด ๋œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ˜ธ์ŠคํŠธ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์ด ๋œ๋‹ค.

interface, callback interface, namespace, ๋˜๋Š” member construct๋Š” ์ฃผ์–ด์ง„ realm realm์—์„œ ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ๋…ธ์ถœ๋จ(exposed) ์ƒํƒœ์ž…๋‹ˆ๋‹ค:
  1. construct์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์ด *๊ฐ€ ์•„๋‹ˆ๊ณ , realm.[[GlobalObject]]๊ฐ€ construct์˜ ๋…ธ์ถœ ์ง‘ํ•ฉ์— ํฌํ•จ๋œ interface๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. realm์˜ ์„ค์ • ๊ฐ์ฒด๊ฐ€ ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๊ณ , construct๊ฐ€ [SecureContext]์—์„œ ์กฐ๊ฑด๋ถ€ ๋…ธ์ถœ๋จ ์ƒํƒœ๋ผ๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. realm์˜ ์„ค์ • ๊ฐ์ฒด์˜ cross-origin isolated capability๊ฐ€ false์ด๊ณ , construct๊ฐ€ [CrossOriginIsolated]์—์„œ ์กฐ๊ฑด๋ถ€ ๋…ธ์ถœ๋จ ์ƒํƒœ๋ผ๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

interface, callback interface, namespace, ๋˜๋Š” member construct๊ฐ€ ์ฃผ์–ด์ง„ ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ exposure condition์—์„œ ์กฐ๊ฑด๋ถ€ ๋…ธ์ถœ๋จ(conditionally exposed) ์ƒํƒœ์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ๋‹จ๊ณ„:
  1. ๋‹จ์–ธ: construct๋Š” interface, callback interface, namespace, interface member, interface mixin member, ๋˜๋Š” namespace member์ด๋‹ค.

  2. H๋ฅผ construct๊ฐ€ interface mixin member์ผ ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. construct๊ฐ€ interface member, interface mixin member, ๋˜๋Š” namespace member๋ผ๋ฉด:

    1. exposure condition ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ construct์— ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด construct๋ฅผ interface, partial interface, interface mixin, partial interface mixin, namespace, ๋˜๋Š” partial namespace์˜ construct๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. construct๊ฐ€ partial interface, partial interface mixin, ๋˜๋Š” partial namespace์ผ ๊ฒฝ์šฐ:

    1. exposure condition ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ construct์— ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด construct๋ฅผ ์›๋ž˜ interface, interface mixin, ๋˜๋Š” namespace ์ •์˜์˜ construct๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. construct๊ฐ€ interface mixin์ผ ๊ฒฝ์šฐ:

    1. exposure condition ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ construct์— ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด construct๋ฅผ H๋กœ ์„ค์ •ํ•œ๋‹ค.

  6. ๋‹จ์–ธ: construct๋Š” interface, callback interface, ๋˜๋Š” namespace์ด๋‹ค.

  7. exposure condition ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ construct์— ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  8. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฐธ๊ณ : JavaScript ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์˜ ๊ด€๋ จ ์„ค์ • ๊ฐ์ฒด๊ฐ€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ ๋˜๋Š” cross-origin isolated capability ์—ฌ๋ถ€๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์ดˆ๊ธฐ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์ด๋ฃจ์–ด์ง€๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์š”๊ตฌ์‚ฌํ•ญ์€ ยงโ€ฏ3.7 ์ธํ„ฐํŽ˜์ด์Šค, ยงโ€ฏ3.7.5 ์ƒ์ˆ˜, ยงโ€ฏ3.7.6 ์†์„ฑ, ยงโ€ฏ3.7.7 ์—ฐ์‚ฐ ๋ฐ [Exposed] ์‚ฌ์šฉ ๊ทœ์น™์„ ์ฐธ์กฐํ•˜์„ธ์š”.

[Exposed]๋Š” interface, callback interface, namespace, ๋˜๋Š” ๊ฐœ๋ณ„ interface member, mixin, namespace member๊ฐ€ ์›Œ์ปค, Worklet, Window, ๋˜๋Š” ์ด๋“ค์˜ ์กฐํ•ฉ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

[Exposed=Window, Global=Window]
interface Window {
  // ...
};

// SharedWorkerGlobalScope์™€ DedicatedWorkerGlobalScope ๋ชจ๋‘์—์„œ ๋™์ผํ•œ ์‹๋ณ„์ž Worker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด,
// [Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์—์„œ ๋‘˜ ๋‹ค ํ•œ ๋ฒˆ์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
[Exposed=Worker, Global=Worker]
interface SharedWorkerGlobalScope : WorkerGlobalScope {
  // ...
};

[Exposed=Worker, Global=Worker]
interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
  // ...
};

// Dimensions๋Š” ์›Œ์ปค์™€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ชจ๋‘์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
[Exposed=(Window,Worker)]
interface Dimensions {
  constructor(double width, double height);
  readonly attribute double width;
  readonly attribute double height;
};

// WorkerNavigator๋Š” ์›Œ์ปค์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ์›Œ์ปค์˜ ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„์—์„œ WorkerNavigator๋ฅผ ํ‰๊ฐ€ํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ณ ,
// ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ๋Š” ReferenceError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
[Exposed=Worker]
interface WorkerNavigator {
  // ...
};

// Node๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ์›Œ์ปค์˜ ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„์—์„œ Node๋ฅผ ํ‰๊ฐ€ํ•˜๋ฉด ReferenceError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
[Exposed=Window]
interface Node {
  // ...
};

// MathUtils๋Š” ์›Œ์ปค์™€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ชจ๋‘์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
[Exposed=(Window,Worker)]
namespace MathUtils {
  double someComplicatedFunction(double x, double y);
};

// WorkerUtils๋Š” ์›Œ์ปค์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ์›Œ์ปค์˜ ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„์—์„œ WorkerUtils๋ฅผ ํ‰๊ฐ€ํ•˜๋ฉด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ณ ,
// ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ๋Š” ReferenceError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
[Exposed=Worker]
namespace WorkerUtils {
  undefined setPriority(double x);
};

// NodeUtils๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ์›Œ์ปค์˜ ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„์—์„œ NodeUtils๋ฅผ ํ‰๊ฐ€ํ•˜๋ฉด ReferenceError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
[Exposed=Window]
namespace NodeUtils {
  DOMString getAllText(Node node);
};

3.3.8. [Global]

[Global] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ interface์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ realm์˜ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

[Global] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๋˜ํ•œ ํ•ด๋‹น interface์˜ ๊ธ€๋กœ๋ฒŒ ์ด๋ฆ„(global names)์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

[Global] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์‹๋ณ„์ž(identifier)๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ

ยซ ์ฃผ์–ด์ง„ ์‹๋ณ„์ž ยป

[Global] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์‹๋ณ„์ž ๋ฆฌ์ŠคํŠธ(identifier list)๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ

์‹๋ณ„์ž ๋ฆฌ์ŠคํŠธ

[Global] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์œ„์˜ ํ˜•ํƒœ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ํ•ด๋‹น interface์˜ ๊ธ€๋กœ๋ฒŒ ์ด๋ฆ„(global names)์€ [Exposed] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ด๋ฆ„์ด ์—ฌ๋Ÿฌ ๊ธ€๋กœ๋ฒŒ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ณต์œ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ [Exposed]๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๊ธ€๋กœ๋ฒŒ์— ์‰ฝ๊ฒŒ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "Worker"๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ด€๋ จ ๊ธ€๋กœ๋ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ธ€๋กœ๋ฒŒ interface์˜ ๊ฒฝ์šฐ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ๊ตฌ์กฐ์™€ interface member์— ํ•ด๋‹นํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์— ์–ด๋–ป๊ฒŒ ๋ฐ˜์˜๋˜๋Š”์ง€๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ:

  1. ๋ชจ๋“  ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ(named properties)๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ์ƒ์˜ ๊ฐ์ฒด(์ฆ‰, named properties object)์— ๋…ธ์ถœ๋˜๋ฉฐ, ๊ฐ์ฒด ์ž์ฒด์—๋Š” ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  2. interface member๋“ค์€ interface์—์„œ ๊ฐ์ฒด ์ž์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋Œ€์‘๋˜๋ฉฐ, interface prototype objects์—๋Š” ๋Œ€์‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  realm์€ ๊ธ€๋กœ๋ฒŒ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ(is global prototype chain mutable) ๋ถˆ๋ฆฌ์–ธ์„ ๊ฐ€์ง€๋ฉฐ, realm์ด ์ƒ์„ฑ๋  ๋•Œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ’์€ realm์˜ ์ˆ˜๋ช… ๋™์•ˆ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

์ด๋Š” ShadowRealm ๊ธ€๋กœ๋ฒŒ์ด mutable ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ(named properties)๋ฅผ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ ๊ฐ์ฒด์— ๋ฐฐ์น˜ํ•˜๋Š” ์ด์œ ๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ bareword ํ• ๋‹น์ด ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ shadowํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

interface member์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ์ฒด ์ž์ฒด์— ๋ฐฐ์น˜ํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ feature detection ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:

var indexedDB = window.indexedDB || window.webkitIndexedDB ||
                window.mozIndexedDB || window.msIndexedDB;

var requestAnimationFrame = window.requestAnimationFrame ||
                            window.mozRequestAnimationFrame || ...;

JavaScript์—์„œ ๋ณ€์ˆ˜ ์„ ์–ธ์ด ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์—, ์œ„ ์ฝ”๋“œ๋Š” window.indexedDB ๋ฐ window.requestAnimationFrame์ด undefined๋กœ ํ‰๊ฐ€๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” shadowing ๋ณ€์ˆ˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ• ๋‹น ์ด์ „์— ์ด๋ฏธ ์ƒ์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

[Global] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ interface์— ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ:

[Global]์ด partial interface ์ •์˜์— ์ง€์ •๋œ ๊ฒฝ์šฐ, ํ•ด๋‹น partial interface ์ •์˜๋Š” named property getter๋ฅผ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Global] ํ™•์žฅ ์†์„ฑ์€ ๋™์ผํ•œ realm์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฐ์ฒด๊ฐ€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด๋Š” named properties object๊ฐ€ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ์œ„์น˜ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐ์ฒด์˜ named properties๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด์—์„œ ๋ชจ๋‘ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

interface์— [Global] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์„ ์–ธ๋œ ๊ฒฝ์šฐ, ํ•ด๋‹น interface ์ „์ฒด์— ๊ฑธ์ณ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„ member๊ฐ€ ๋‘˜ ์ด์ƒ ์กด์žฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ•˜๋‚˜์˜ stringifier๋‚˜ ํ•˜๋‚˜์˜ iterable ์„ ์–ธ, async iterable ์„ ์–ธ, maplike ์„ ์–ธ, setlike ์„ ์–ธ๋„ ๋‘˜ ์ด์ƒ ์กด์žฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : interface์˜ ๋ชจ๋“  member๋Š” ํ•ด๋‹น interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์— ๋ชจ๋‘ ํ‰ํƒ„ํ™”๋˜์–ด ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์š”๊ตฌ์‚ฌํ•ญ์€ ยงโ€ฏ3.7.4 ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ์ฒด(named properties object)์—์„œ [Global] ์‚ฌ์šฉ ์‹œ ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ ๊ด€๋ จ ๊ทœ์น™, ยงโ€ฏ3.7.5 ์ƒ์ˆ˜, ยงโ€ฏ3.7.6 ์†์„ฑ, ยงโ€ฏ3.7.7 ์—ฐ์‚ฐ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ์˜ ์œ„์น˜์— ๊ด€ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Window interface๋Š” frame์„ Window ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Window ๊ฐ์ฒด๋Š” JavaScript ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด ์—ญํ• ๋„ ํ•˜๋ฏ€๋กœ, ๋ณ€์ˆ˜ ์„ ์–ธ์ด๋‚˜ ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ํ• ๋‹น์€ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. attribute์— ๋Œ€ํ•ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ๊ธฐ์กด ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋Œ€์ฒด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

[Exposed=Window, Global=Window]
interface Window {
  getter any (DOMString name);
  attribute DOMString name;
  // ...
};

์•„๋ž˜ HTML ๋ฌธ์„œ๋Š” Window ๊ฐ์ฒด์˜ ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ shadow๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, attribute์™€ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜ ์„ ์–ธ์ด ๊ธฐ์กด ํ”„๋กœํผํ‹ฐ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

<!DOCTYPE html>
<title>Variable declarations and assignments on Window</title>
<iframe name=abc></iframe>
<!-- Shadowing named properties -->
<script>
  window.abc;    // iframe์˜ Window ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜.
  abc = 1;       // ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ shadowํ•จ.
  window.abc;    // 1์„ ๋ฐ˜ํ™˜.
</script>

<!-- IDL attribute ํ”„๋กœํผํ‹ฐ ๋ณด์กด -->
<script>
  Window.prototype.def = 2;         // ํ”„๋กœํ† ํƒ€์ž…์— ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€.
  window.hasOwnProperty("length");  // true ๋ฐ˜ํ™˜.
  length;                           // 1 ๋ฐ˜ํ™˜.
  def;                              // 2 ๋ฐ˜ํ™˜.
</script>
<script>
  var length;                       // ๋ณ€์ˆ˜ ์„ ์–ธ์€ ๊ธฐ์กด ํ”„๋กœํผํ‹ฐ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Œ.
  length;                           // 1 ๋ฐ˜ํ™˜.
  var def;                          // ๋ณ€์ˆ˜ ์„ ์–ธ์€ shadow ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑ.
  def;                              // undefined ๋ฐ˜ํ™˜.
</script>

3.3.9. [NewObject]

[NewObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ •๊ทœ ๋˜๋Š” static operation์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น operation์„ ํ˜ธ์ถœํ•  ๋•Œ ํ•ญ์ƒ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

[NewObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[NewObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ •๊ทœ ๋˜๋Š” static operation ์ค‘, ๋ฐ˜ํ™˜ ํƒ€์ž…์ด interface ํƒ€์ž… ๋˜๋Š” promise ํƒ€์ž…์ธ ๊ฒƒ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” createElement() operation(Document interface์˜ ๋ฉ”์„œ๋“œ)์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์‹œ ํ•ญ์ƒ ์ƒˆ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [DOM]

[Exposed=Window]
interface Document : Node {
  [NewObject] Element createElement(DOMString localName);
  // ...
};

3.3.10. [PutForwards]

[PutForwards] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ ์ •๊ทœ attribute ์„ ์–ธ์—, ํ•ด๋‹น ํƒ€์ž…์ด interface ํƒ€์ž…์ผ ๋•Œ ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น attribute์— ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ ํŠน์ • ๋™์ž‘์„ ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ• ๋‹น์ด ๊ทธ attribute๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด์˜ ํŠน์ • attribute(ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ธ์ž์— ๋ช…์‹œ๋œ)์— "์ „๋‹ฌ"๋ฉ๋‹ˆ๋‹ค.

[PutForwards] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค:

์ด ๊ฒฝ์šฐ, J์— attribute B๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, ํ•ด๋‹น ์‹๋ณ„์ž๋Š” N ์ž…๋‹ˆ๋‹ค. I๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์˜ A์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด, ๋Œ€์‹  A๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด์˜ B attribute์— ๊ฐ’์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

[PutForwards]-๊ฐ€ ๋ถ™์€ attribute๋Š” ์ฒด์ธ(chained)์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, [PutForwards] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๋ถ™์€ attribute๊ฐ€ ๋‹ค์‹œ ๊ฐ™์€ ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๊ฐ€์ง„ attribute๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ์ „๋‹ฌ๋œ ํ• ๋‹น ์ฒด์ธ์— ์‚ฌ์ดํด์ด ์žˆ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์ดํด์€ ์ „๋‹ฌ๋œ ํ• ๋‹น์„ ๋”ฐ๋ผ๊ฐ€๋‹ค ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค์˜ attribute๊ฐ€ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚˜๋ฉด ๋ฐœ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[PutForwards] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๋ถ™์€ attribute๋Š” [LegacyLenientSetter] ๋˜๋Š” [Replaceable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ํ•จ๊ป˜ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[PutForwards] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ฝ๊ธฐ ์ „์šฉ attribute๊ฐ€ ์•„๋‹Œ ๊ณณ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[PutForwards] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” static attribute์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[PutForwards] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” namespace์— ์„ ์–ธ๋œ attribute์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[PutForwards]์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ์†์„ฑ(Attributes) ์ ˆ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์ด๋ฆ„(Name)๊ณผ ์‚ฌ๋žŒ(Person) interface๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Person interface์˜ name attribute์— [PutForwards] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ•ด๋‹น attribute์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด Person ๊ฐ์ฒด์˜ full attribute์— ๊ฐ’์ด ํ• ๋‹น๋จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค:

[Exposed=Window]
interface Name {
  attribute DOMString full;
  attribute DOMString family;
  attribute DOMString given;
};

[Exposed=Window]
interface Person {
  [PutForwards=full] readonly attribute Name name;
  attribute unsigned short age;
};

JavaScript ๋ฐ”์ธ๋”ฉ์—์„œ๋Š” name ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

var p = getPerson();           // Person ์ธ์Šคํ„ด์Šค ํš๋“.

p.name = 'John Citizen';       // ์ด ๋ฌธ์žฅ...
p.name.full = 'John Citizen';  // ...์ด ๋ฌธ์žฅ๊ณผ ๋™์ผํ•œ ๋™์ž‘.

3.3.11. [Replaceable]

[Replaceable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ ์ •๊ทœ attribute์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น ํ”Œ๋žซํผ ๊ฐ์ฒด์—์„œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ํ• ๋‹น๋œ ๊ฐ’์œผ๋กœ ๋™์ผํ•œ ์ด๋ฆ„์˜ own property๊ฐ€ ๊ฐ์ฒด์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœํผํ‹ฐ๋Š” interface prototype object์— ์žˆ๋Š” accessor property๋ฅผ shadowํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

[Replaceable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Replaceable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๋ถ™์€ attribute๋Š” [LegacyLenientSetter] ๋˜๋Š” [PutForwards] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ํ•จ๊ป˜ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[Replaceable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด ์•„๋‹Œ attribute์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[Replaceable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” static attribute์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[Replaceable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” namespace์— ์„ ์–ธ๋œ attribute์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ตฌ์ฒด์  ์š”๊ตฌ์‚ฌํ•ญ์€ ยงโ€ฏ3.7.6 ์†์„ฑ์—์„œ [Replaceable] ์‚ฌ์šฉ ๊ทœ์น™์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” operation๊ณผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๋Š” ์นด์šดํ„ฐ์˜ ๊ฐ’์„ ๋…ธ์ถœํ•˜๋Š” attribute๋ฅผ ๊ฐ€์ง„ interface๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

[Exposed=Window]
interface Counter {
  [Replaceable] readonly attribute unsigned long value;
  undefined increment();
};

ํ”Œ๋žซํผ ๊ฐ์ฒด์—์„œ value ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด, ํ•ด๋‹น attribute์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ shadowํ•ฉ๋‹ˆ๋‹ค:

var counter = getCounter();                              // Counter ์ธ์Šคํ„ด์Šค ํš๋“.
counter.value;                                           // 0 ๋ฐ˜ํ™˜.

counter.hasOwnProperty("value");                         // false ๋ฐ˜ํ™˜.
Object.getPrototypeOf(counter).hasOwnProperty("value");  // true ๋ฐ˜ํ™˜.

counter.increment();
counter.increment();
counter.value;                                           // 2 ๋ฐ˜ํ™˜.

counter.value = 'a';                                     // Counter::value์™€๋Š” ๋ฌด๊ด€ํ•œ ๊ฐ’์œผ๋กœ shadow.
                                                         // 

counter.hasOwnProperty("value");                         // true ๋ฐ˜ํ™˜.

counter.increment();
counter.value;                                           // 'a' ๋ฐ˜ํ™˜.

delete counter.value;                                    // ์›๋ž˜ ํ”„๋กœํผํ‹ฐ ๋ณต์›.
counter.value;                                           // 3 ๋ฐ˜ํ™˜.

3.3.12. [SameObject]

[SameObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ attribute์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด์˜ attribute ๊ฐ’์„ ์–ป์„ ๋•Œ ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

[SameObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[SameObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ฝ๊ธฐ ์ „์šฉ attribute ์ค‘, ํƒ€์ž…์ด interface ํƒ€์ž… ๋˜๋Š” object์ผ ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋กœ, ์ด ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” implementation attribute(Document interface์˜ ์†์„ฑ)์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น Document ๊ฐ์ฒด์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [DOM]

[Exposed=Window]
interface Document : Node {
  [SameObject] readonly attribute DOMImplementation implementation;
  // ...
};

3.3.13. [SecureContext]

[SecureContext] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ interface, partial interface, interface mixin, partial interface mixin, callback interface, namespace, partial namespace, interface member, interface mixin member, ๋˜๋Š” namespace member์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ํ™˜๊ฒฝ์ด ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ(secure context)์ผ ๋•Œ๋งŒ ๋…ธ์ถœ๋จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. [SecureContext] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์— ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

[SecureContext] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[SecureContext] ๊ฐ€ ์˜ค๋ฒ„๋กœ๋“œ๋œ operation์— ๋‚˜ํƒ€๋‚˜๋ฉด, ๋ชจ๋“  ์˜ค๋ฒ„๋กœ๋“œ์— ๋ฐ˜๋“œ์‹œ ๋‚˜ํƒ€๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[SecureContext] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๋‹ค์Œ ๊ฒฝ์šฐ ๋ชจ๋‘์— ๋ช…์‹œ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค:

์ฐธ๊ณ : [SecureContext] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ฉค๋ฒ„์— ์ถ”๊ฐ€ํ•ด๋„ ์ •์˜ ์ „์ฒด์— ์ด๋ฏธ [SecureContext] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฉค๋ฒ„์˜ ๋…ธ์ถœ ๋ฒ”์œ„๊ฐ€ ์ถ”๊ฐ€๋กœ ์ œํ•œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

[SecureContext] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์—†๋Š” interface๋Š” [SecureContext]๋ฅผ ๋ช…์‹œํ•œ ๋‹ค๋ฅธ interface๋ฅผ ์ƒ์†ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

[SecureContext] ๋Š” [CrossOriginIsolated]์—์„œ ์กฐ๊ฑด๋ถ€ ๋…ธ์ถœ๋จ ์ƒํƒœ์ธ ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ๋ช…์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (๋ชจ๋“  cross-origin isolated ํ™˜๊ฒฝ์€ ํ•ญ์ƒ ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์ด๋ฏ€๋กœ ์ค‘๋ณต์ž…๋‹ˆ๋‹ค.)

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ operation 1๊ฐœ์™€, ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์—์„œ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ operation 2๊ฐœ๋ฅผ ๊ฐ€์ง„ interface๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

[Exposed=Window]
interface ExampleFeature {
  // ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์„ฑ๊ณต
  Promise <Result> calculateNotSoSecretResult();

  // ์ด operation์€ ๋น„๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์— ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ ExampleFeature.prototype์— "calculateSecretResult" ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
  [SecureContext] Promise<Result> calculateSecretResult();

  // ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด attribute๋„ ๋น„๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์— ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉฐ,
  // ExampleFeature.prototype์— "secretBoolean" ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
  [SecureContext] readonly attribute boolean secretBoolean;
};

// HeartbeatSensor๋Š” ๋น„๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์— ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฉค๋ฒ„๋„ ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
// ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ Window์— "HeartbeatSensor" ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
[Exposed=Window, SecureContext]
interface HeartbeatSensor {
  Promise<float> getHeartbeatsPerMinute();
};

// ์•„๋ž˜ interface mixin ๋ฉค๋ฒ„๋Š” ๋น„๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋น„๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ExampleFeature.prototype์— "snap" ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
[SecureContext]
interface mixin Snapshotable {
  Promise<boolean> snap();
};
ExampleFeature includes Snapshotable;

// ๋ฐ˜๋ฉด, ์•„๋ž˜ interface mixin ๋ฉค๋ฒ„๋Š” ํ˜ธ์ŠคํŠธ interface์— [SecureContext] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์—†์œผ๋ฉด ๋น„๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์—์„œ๋„ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
// ์ฆ‰, ๋น„๋ณด์•ˆ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ExampleFeature.prototype์— "log" ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
interface mixin Loggable {
  Promise<boolean> log();
};
ExampleFeature includes Loggable;

3.3.14. [Unscopable]

[Unscopable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ •๊ทœ attribute ๋˜๋Š” ์ •๊ทœ operation์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๊ฐ€ ํ•ด๋‹น ๋ฉค๋ฒ„์˜ ํ”„๋กœํผํ‹ฐ๋ช…์„ ๊ฐ์ฒด ํ™˜๊ฒฝ ๋ ˆ์ฝ”๋“œ์˜ base object์— ํฌํ•จํ•˜์ง€ ์•Š๊ฒŒ ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ช…๊ณผ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ with ๋ฌธ์—์„œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ•ด์„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœํผํ‹ฐ๋ช…์„ interface prototype object์˜ %Symbol.unscopables% ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ํฌํ•จ์‹œ์ผœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

[Unscopable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Unscopable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ •๊ทœ attribute ๋˜๋Š” ์ •๊ทœ operation ์™ธ์˜ ๊ณณ์— ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

[Unscopable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” namespace์— ์„ ์–ธ๋œ attribute์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์€ ยงโ€ฏ3.7.3 ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—์„œ [Unscopable] ๊ด€๋ จ ๊ทœ์น™์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด IDL์„ ์ •์˜ํ•œ ๊ฒฝ์šฐ:

[Exposed=Window]
interface Thing {
  undefined f();
  [Unscopable] g();
};

f ํ”„๋กœํผํ‹ฐ๋Š” with ๋ฌธ์—์„œ ์‹๋ณ„์ž๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, g ํ”„๋กœํผํ‹ฐ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค:

var thing = getThing();  // Thing ์ธ์Šคํ„ด์Šค
with (thing) {
  f;                     // Function ๊ฐ์ฒด ๋ฐ˜ํ™˜.
  g;                     // ReferenceError ๋ฐœ์ƒ.
}

3.4. ๋ ˆ๊ฑฐ์‹œ ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

์ด ์ ˆ์—์„œ๋Š” ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ค‘, JavaScript ๋ฐ”์ธ๋”ฉ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ยงโ€ฏ3.3 ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, ์ด๋“ค ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๋ ˆ๊ฑฐ์‹œ Web ํ”Œ๋žซํผ ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ์œ„ํ•ด์„œ๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ช…์„ธ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ , ๋ ˆ๊ฑฐ์‹œ API์˜ ๋™์ž‘์„ ๋ช…์‹œํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

3.4.1. [LegacyFactoryFunction]

์ด ๊ธฐ๋Šฅ ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒ์„ฑ์ž operation์„ ์ •์˜ํ•˜์„ธ์š”.

[LegacyFactoryFunction] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ interface์— ๋‚˜ํƒ€๋‚˜๋ฉด, JavaScript ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์— ์ง€์ •๋œ ์ด๋ฆ„์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๊ทธ ๊ฐ’์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ interface์— ์—ฌ๋Ÿฌ [LegacyFactoryFunction] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[LegacyFactoryFunction] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” named argument list๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. "=" ๋’ค์— ์˜ค๋Š” identifier๊ฐ€ [LegacyFactoryFunction]์˜ ์‹๋ณ„์ž(identifier)์ž…๋‹ˆ๋‹ค. interface์— ๋‚˜ํƒ€๋‚œ ๊ฐ [LegacyFactoryFunction] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋งˆ๋‹ค, ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ธ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜์—ฌ interface ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์‹๋ณ„์ž๋Š” ๋‹ค๋ฅธ interface์˜ [LegacyFactoryFunction] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์‚ฌ์šฉ๋œ ๊ฒƒ๊ณผ ๊ฐ™์œผ๋ฉด ์•ˆ ๋˜๋ฉฐ, ์ด interface ๋˜๋Š” ๋‹ค๋ฅธ interface์˜ [LegacyWindowAlias] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์‚ฌ์šฉ๋œ ์‹๋ณ„์ž์™€ ๊ฐ™์•„๋„ ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ interface object๊ฐ€ ์žˆ๋Š” interface์˜ ์‹๋ณ„์ž์™€ ๊ฐ™์•„๋„ ์•ˆ ๋˜๊ณ , reserved identifier๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[LegacyFactoryFunction] ์™€ [Global] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๊ฐ™์€ interface์— ๋™์‹œ์— ๋ช…์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ ˆ๊ฑฐ์‹œ factory ํ•จ์ˆ˜์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ยงโ€ฏ3.7.2 Legacy factory functions์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ IDL์€ [LegacyFactoryFunction] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” interface๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

[Exposed=Window,
 LegacyFactoryFunction=Audio(DOMString src)]
interface HTMLAudioElement : HTMLMediaElement {
  // ...
};

์ด interface๋ฅผ ์ง€์›ํ•˜๋Š” JavaScript ๊ตฌํ˜„์—์„œ๋Š” HTMLAudioElement ๊ฐ์ฒด๋ฅผ Audio ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

typeof Audio;                   // 'function' ๋ฐ˜ํ™˜.

var a2 = new Audio('a.flac');   // ์ธ์ž 1๊ฐœ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด HTMLAudioElement ์ƒ์„ฑ.
                                // 

๋ ˆ๊ฑฐ์‹œ ๋™์ž‘์œผ๋กœ, ์ด๋Ÿฌํ•œ factory ํ•จ์ˆ˜๋Š” prototype ํ”„๋กœํผํ‹ฐ๊ฐ€ ์›๋ž˜ interface์˜ prototype๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

console.assert(Audio.prototype === HTMLAudioElement.prototype);

3.4.2. [LegacyLenientSetter]

[LegacyLenientSetter] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ ์ •๊ทœ attribute์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น attribute์˜ accessor property์— no-op setter๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด strict mode์—์„œ ์ž˜๋ชป๋œ ํ”„๋กœํผํ‹ฐ ํ• ๋‹น์ด ์˜ˆ์™ธ ์—†์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ํŽ˜์ด์ง€์—์„œ๋Š” ์ €์ž๊ฐ€ IDL attribute๋ฅผ polyfillํ•˜๋ ค๊ณ  ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์œผ๋‚˜, ์‹ค์ œ๋กœ๋Š” ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. strict mode์—์„œ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ํŽ˜์ด์ง€๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, [LegacyLenientSetter] ๊ฐ€ ์—†์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ shipํ•  ์ˆ˜ ์—†๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

[LegacyLenientSetter] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ์ •๊ทœ attribute ์™ธ์˜ ๊ณณ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[LegacyLenientSetter] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๋ถ™์€ attribute๋Š” [PutForwards] ๋˜๋Š” [Replaceable] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ํ•จ๊ป˜ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[LegacyLenientSetter] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” namespace์— ์„ ์–ธ๋œ attribute์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[LegacyLenientSetter]์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ์†์„ฑ(Attributes) ์ ˆ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋‹ค์Œ IDL์€ [LegacyLenientSetter] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” interface๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

[Exposed=Window]
interface Example {
  [LegacyLenientSetter] readonly attribute DOMString x;
  readonly attribute DOMString y;
};

์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•˜๋Š” JavaScript ๊ตฌํ˜„์—์„œ๋Š” x์— ๋Œ€์‘ํ•˜๋Š” accessor property์— setter๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, strict mode์—์„œ๋„ ์•„๋ฌด ๋™์ž‘์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

"use strict";

var example = getExample();  // Example ์ธ์Šคํ„ด์Šค ํš๋“.

// strict mode์—์„œ๋„ setter๋Š” no-op์ด๋ฏ€๋กœ ์˜ˆ์™ธ ์—†์Œ.
example.x = 1;

// strict mode์—์„œ setter ์—†์œผ๋ฏ€๋กœ TypeError ๋ฐœ์ƒ.
example.y = 1;

3.4.3. [LegacyLenientThis]

[LegacyLenientThis] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ •๊ทœ attribute์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น attribute์˜ getter๋‚˜ setter๋ฅผ this ๊ฐ’์ด ํ•ด๋‹น attribute๊ฐ€ ์„ ์–ธ๋œ interface๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋กœ ํ˜ธ์ถœํ•˜๋ฉด, ์•„๋ฌด ๋™์ž‘๋„ ํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

[LegacyLenientThis] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. static attribute์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[LegacyLenientThis] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” namespace์— ์„ ์–ธ๋œ attribute์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[LegacyLenientThis]์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ์†์„ฑ(Attributes) ์ ˆ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋‹ค์Œ IDL์€ [LegacyLenientThis] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” interface๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

[Exposed=Window]
interface Example {
  [LegacyLenientThis] attribute DOMString x;
  attribute DOMString y;
};

์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•˜๋Š” JavaScript ๊ตฌํ˜„์—์„œ๋Š” x์— ๋Œ€์‘ํ•˜๋Š” accessor property์˜ getter์™€ setter๋ฅผ Example ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด๋กœ๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var example = getExample();  // Example ์ธ์Šคํ„ด์Šค ํš๋“.
var obj = { };

// ์ •์ƒ ๋™์ž‘.
example.x;

// this ๊ฐ’์ด Example ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๊ณ  [LegacyLenientThis]๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ฌด์‹œ๋จ.
Object.getOwnPropertyDescriptor(Example.prototype, "x").get.call(obj);

// Example.prototype๋„ Example ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋ฌด์‹œ๋จ.
Example.prototype.x;

// Example.prototype์ด Example ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ TypeError ๋ฐœ์ƒ.
Example.prototype.y;

3.4.4. [LegacyNamespace]

์ด ๊ธฐ๋Šฅ ๋Œ€์‹ , ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์„ ํŠน์ • ์ ‘๋‘์‚ฌ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹๋ณ„์ž์— ์  ์—†์ด ์ž‘์„ฑํ•˜์„ธ์š”.

[LegacyNamespace] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ interface์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๊ฐ€ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ , ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ธ์ž๋กœ ์ง€์ •๋œ namespace์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์ƒ์„ฑ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

[LegacyNamespace] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, ํ•ด๋‹น ์‹๋ณ„์ž๋Š” namespace ์ •์˜์˜ ์‹๋ณ„์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[LegacyNamespace] ์™€ [LegacyNoInterfaceObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๊ฐ™์€ interface์— ๋™์‹œ์— ๋ช…์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

interface๊ฐ€ namespace์— ์–ด๋–ป๊ฒŒ ๋…ธ์ถœ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ยงโ€ฏ3.13.1 ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” namespace์™€ [LegacyNamespace]์œผ๋กœ ์ •์˜๋œ interface๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
namespace Foo { };

[LegacyNamespace=Foo]
interface Bar {
  constructor();
};

์œ„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•˜๋Š” JavaScript ๊ตฌํ˜„์—์„œ๋Š”, Bar ์ƒ์„ฑ์ž๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

var instance = new Foo.Bar();

3.4.5. [LegacyNoInterfaceObject]

[LegacyNoInterfaceObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ interface์— ๋‚˜ํƒ€๋‚˜๋ฉด, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ JavaScript ๋ฐ”์ธ๋”ฉ์—์„œ interface object๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

[LegacyNoInterfaceObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[LegacyNoInterfaceObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ํ•ด๋‹น interface์— ์ƒ์„ฑ์ž๋‚˜ static operation์ด ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[LegacyNoInterfaceObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๋ช…์‹œ๋˜์ง€ ์•Š์€ interface๋Š”, [LegacyNoInterfaceObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๋ช…์‹œ๋œ interface๋ฅผ ์ƒ์†ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ์ฒด์  ์š”๊ตฌ์‚ฌํ•ญ์€ ยงโ€ฏ3.7 ์ธํ„ฐํŽ˜์ด์Šค์—์„œ [LegacyNoInterfaceObject] ์‚ฌ์šฉ ๊ทœ์น™์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ํ•˜๋‚˜๋Š” JavaScript ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์— ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๊ฐ€ ๋…ธ์ถœ๋˜๋Š” interface, ํ•˜๋‚˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” interface๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

[Exposed=Window]
interface Storage {
  undefined addEntry(unsigned long key, any value);
};

[Exposed=Window,
 LegacyNoInterfaceObject]
interface Query {
  any lookupEntry(unsigned long key);
};

์œ„ IDL์˜ JavaScript ๊ตฌํ˜„์—์„œ๋Š” Storage์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Query์˜ ํ”„๋กœํ† ํƒ€์ž…์€ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

typeof Storage;                        // "object" ๋ฐ˜ํ™˜

// Storage.addEntry์— alert() ํŠธ๋ ˆ์ด์‹ฑ ์ถ”๊ฐ€
var fn = Storage.prototype.addEntry;
Storage.prototype.addEntry = function(key, value) {
  alert('Calling addEntry()');
  return fn.call(this, key, value);
};

typeof Query;                          // "undefined" ๋ฐ˜ํ™˜

var fn = Query.prototype.lookupEntry;  // ์˜ˆ์™ธ ๋ฐœ์ƒ, Query๋Š” ์ •์˜๋˜์ง€ ์•Š์Œ

3.4.6. [LegacyNullToEmptyString]

[LegacyNullToEmptyString] ํ™•์žฅ ์†์„ฑ์ด DOMString ๋˜๋Š” USVString ํƒ€์ž…์— ๋‚˜ํƒ€๋‚˜๋ฉด, JavaScript null์ด IDL ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋  ๋•Œ ๊ธฐ๋ณธ ์ฒ˜๋ฆฌ์™€ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•˜๋Š” ์ƒˆ IDL ํƒ€์ž…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ธ "null"๋กœ ๋ฌธ์ž์—ดํ™”๋˜๋Š” ๋Œ€์‹  ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

[LegacyNullToEmptyString] ํ™•์žฅ ์†์„ฑ์€ DOMString ๋˜๋Š” USVString์ด ์•„๋‹Œ ํƒ€์ž…๊ณผ ์—ฐ๊ฒฐ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ํ™•์žฅ ์†์„ฑ ์ค‘ ํƒ€์ž…์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ๊ฒƒ๋“ค๊ณผ ๋‹ฌ๋ฆฌ, [LegacyNullToEmptyString]์€ DOMString?์™€ ๊ฐ™์€ ๋„ ํ—ˆ์šฉ ํƒ€์ž…์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. null์ด ์ด๋ฏธ ํ•ด๋‹น ํƒ€์ž…์˜ ์œ ํšจํ•œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

[LegacyNullToEmptyString]์˜ ์‚ฌ์šฉ์— ์ˆ˜๋ฐ˜๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์€ ยง 3.2.10 DOMString์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ํ•œ attribute์˜ ํƒ€์ž…๊ณผ ํ•œ operation์˜ ์ธ์ž ํƒ€์ž…์— ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๋ถ™์€ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:
[Exposed=Window]
interface Dog {
  attribute DOMString name;
  attribute [LegacyNullToEmptyString] DOMString owner;

  boolean isMemberOfBreed([LegacyNullToEmptyString] DOMString breedName);
};

์ด Dog interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” JavaScript์—์„œ๋Š”, owner ํ”„๋กœํผํ‹ฐ์— null์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜, isMemberOfBreed ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ null์„ ์ „๋‹ฌํ•˜๋ฉด "null" ๋Œ€์‹  ๋นˆ ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค:

var d = getDog();         // Dog ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด d

d.name = null;            // .name ํ”„๋กœํผํ‹ฐ์— "null"์ด ํ• ๋‹น๋จ.

d.owner = null;           // .owner ํ”„๋กœํผํ‹ฐ์— ""์ด ํ• ๋‹น๋จ.

d.isMemberOfBreed(null);  // isMemberOfBreed ํ•จ์ˆ˜์— ""์ด ์ „๋‹ฌ๋จ.

3.4.7. [LegacyOverrideBuiltIns]

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

[LegacyOverrideBuiltIns] ํ™•์žฅ ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๋‚˜ํƒ€๋‚˜์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ์†์„ฑ getter๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ [Global] ํ™•์žฅ ์†์„ฑ์œผ๋กœ๋„ ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ํ™•์žฅ ์†์„ฑ์ด ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์— ์ง€์ •๋œ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋Š” ๋ฐ˜๋“œ์‹œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์—์„œ ๋ช…๋ช…๋œ ์†์„ฑ getter๋ฅผ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[LegacyOverrideBuiltIns] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ partial interface ์ •์˜์— ๋ช…์‹œ๋˜๋ฉด, ํ•ด๋‹น partial interface๊ฐ€ ์•„๋‹Œ interface ์ „์ฒด์— ๋ช…์‹œ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์ฒด์  ์š”๊ตฌ์‚ฌํ•ญ์€ ยงโ€ฏ3.9 ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด์™€ ยงโ€ฏ3.9.3 [[DefineOwnProperty]]์—์„œ [LegacyOverrideBuiltIns] ์‚ฌ์šฉ ๊ทœ์น™์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ํ•˜๋‚˜๋Š” named property getter๊ฐ€ ์žˆ๋Š” interface, ํ•˜๋‚˜๋Š” ์—†๋Š” interface๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

[Exposed=Window]
interface StringMap {
  readonly attribute unsigned long length;
  getter DOMString lookup(DOMString key);
};

[Exposed=Window,
 LegacyOverrideBuiltIns]
interface StringMap2 {
  readonly attribute unsigned long length;
  getter DOMString lookup(DOMString key);
};

์œ„ ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•˜๋Š” JavaScript ๊ตฌํ˜„์—์„œ๋Š”, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์—์„œ ํŠน์ • ํ”„๋กœํผํ‹ฐ๋ฅผ ์–ป์œผ๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค:

// StringMap ์ธ์Šคํ„ด์Šค๋ฅผ ํš๋“ํ•ฉ๋‹ˆ๋‹ค. "abc", "length", "toString"์ด ์ง€์›๋˜๋Š” ํ”„๋กœํผํ‹ฐ๋ช…์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
var map1 = getStringMap();

// named property getter๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
map1.abc;

// ๊ฐ์ฒด์˜ "length" ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ, length attribute์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.
map1.length;

// ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์—์„œ "toString" ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
map1.toString;

// StringMap2 ์ธ์Šคํ„ด์Šค๋ฅผ ํš๋“ํ•ฉ๋‹ˆ๋‹ค. ์—ญ์‹œ "abc", "length", "toString"์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.
var map2 = getStringMap2();

// named property getter๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
map2.abc;

// "length" ํ”„๋กœํผํ‹ฐ๊ฐ€ length attribute์— ๋Œ€์‘ํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์—ญ์‹œ named property getter๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
map2.length;

// "toString"์ด map2์˜ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์— ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์—ญ์‹œ named property getter๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
map2.toString;

3.4.8. [LegacyTreatNonObjectAsNull]

[LegacyTreatNonObjectAsNull] ํ™•์žฅ ์†์„ฑ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๋‚˜ํƒ€๋‚˜๋ฉด, ์ด๋Š” ํƒ€์ž…์ด ๋„ ํ—ˆ์šฉ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ธ ์†์„ฑ์— ํ• ๋‹น๋œ ๋ชจ๋“  ๊ฐ’์ด ๋” ๋А์Šจํ•˜๊ฒŒ ๋ณ€ํ™˜๋จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฐ’์ด ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด null๋กœ ๋ณ€ํ™˜๋˜๊ณ , ๊ฐ’์ด ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜ธ์ถœ๋˜์–ด๋„ ์•„๋ฌด ์ž‘์—…๋„ ํ•˜์ง€ ์•Š๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

ยง 3.2.20 ๋„ ํ—ˆ์šฉ ํƒ€์ž… โ€” T?, ยง 3.2.19 ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž… ๋ฐ ยง 3.12 ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ๋‹ค์Œ ์‚ฌ์šฉ์— ์ˆ˜๋ฐ˜๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค: [LegacyTreatNonObjectAsNull] ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ IDL ์กฐ๊ฐ์€ ํ•˜๋‚˜์˜ ์†์„ฑ์„ ๊ฐ€์ง€๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋ฉฐ, ๊ทธ ํƒ€์ž…์€ [LegacyTreatNonObjectAsNull]๋กœ ์ฃผ์„์ด ์ง€์ •๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ํƒ€์ž…์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ด๋ฉฐ ํ™•์žฅ ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค:

callback OccurrenceHandler = undefined (DOMString details);

[LegacyTreatNonObjectAsNull]
callback ErrorHandler = undefined (DOMString details);

[Exposed=Window]
interface Manager {
  attribute OccurrenceHandler? handler1;
  attribute ErrorHandler? handler2;
};

JavaScript์—์„œ, ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐ’(Number ๋“ฑ)์ด๋‚˜ ํ˜ธ์ถœ ๊ฐ€๋Šฅ(callable)์ด ์•„๋‹Œ ๊ฐ’์„ handler1์— ํ• ๋‹นํ•˜๋ฉด handler2์— ํ• ๋‹นํ•  ๋•Œ์™€ ๋™์ž‘์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค:

var manager = getManager();  // Manager ์ธ์Šคํ„ด์Šค ํš๋“

manager.handler1 = function() { };
manager.handler1;            // ํ•จ์ˆ˜ ๋ฐ˜ํ™˜

try {
  manager.handler1 = 123;    // TypeError ๋ฐœ์ƒ
} catch (e) { }

try {
  manager.handler1 = {};     // TypeError ๋ฐœ์ƒ
} catch (e) { }

manager.handler2 = function() { };
manager.handler2;            // ํ•จ์ˆ˜ ๋ฐ˜ํ™˜

manager.handler2 = 123;
manager.handler2;            // null ๋ฐ˜ํ™˜

manager.handler2 = {};
manager.handler2;            // ๊ฐ์ฒด ๋ฐ˜ํ™˜

3.4.9. [LegacyUnenumerableNamedProperties]

[LegacyUnenumerableNamedProperties] ํ™•์žฅ ์†์„ฑ์ด ์ธํ„ฐํŽ˜์ด์Šค์— ๋‚˜ํƒ€๋‚˜๊ณ  ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช…๋ช…๋œ ์†์„ฑ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๋ช…๋ช…๋œ ์†์„ฑ์ด ์—ด๊ฑฐ ๋ถˆ๊ฐ€๋Šฅํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

[LegacyUnenumerableNamedProperties] ํ™•์žฅ ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๋‚˜ํƒ€๋‚˜์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ์†์„ฑ getter๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

[LegacyUnenumerableNamedProperties] ํ™•์žฅ ์†์„ฑ์ด ์ธํ„ฐํŽ˜์ด์Šค์— ์ง€์ •๋œ ๊ฒฝ์šฐ, ์ด๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํŒŒ์ƒ๋œ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์— ์ ์šฉ๋˜๋ฉฐ ๊ทธ ์–ด๋А ์ธํ„ฐํŽ˜์ด์Šค์—๋„ ์ง€์ •๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์€ ยง 3.9.1 [[GetOwnProperty]]์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ๋‹ค์Œ ์‚ฌ์šฉ์— ์ˆ˜๋ฐ˜๋ฉ๋‹ˆ๋‹ค. [LegacyUnenumerableNamedProperties] ์ž…๋‹ˆ๋‹ค.

3.4.10. [LegacyUnforgeable]

[LegacyUnforgeable] ํ™•์žฅ ์†์„ฑ์ด ์ผ๋ฐ˜ ์†์„ฑ ๋˜๋Š” ๋น„-์ •์  ์—ฐ์‚ฐ์— ๋‚˜ํƒ€๋‚˜๋ฉด, ์ด๋Š” ํ•ด๋‹น ์†์„ฑ ๋˜๋Š” ์—ฐ์‚ฐ์ด JavaScript ์†์„ฑ์œผ๋กœ ๋ฐ˜์˜๋˜๋ฉฐ ๊ทธ ๋™์ž‘์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ณ  ๊ฐ์ฒด์—์„œ ์†์„ฑ ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ•ญ์ƒ ํ•ด๋‹น ์†์„ฑ์˜ ์†์„ฑ ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐฉ์‹์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํŠนํžˆ, ํ•ด๋‹น ์†์„ฑ์€ ๊ตฌ์„ฑ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ”„๋กœํ† ํƒ€์ž…์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด ์ž์ฒด์˜ ๊ณ ์œ  ์†์„ฑ์œผ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ๋˜๋Š” ์—ฐ์‚ฐ์€ ์ฃผ์–ด์ง„ ์ธํ„ฐํŽ˜์ด์Šค A์—์„œ ์œ„์กฐ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์†์„ฑ ๋˜๋Š” ์—ฐ์‚ฐ์ด A์— ์„ ์–ธ๋˜์–ด ์žˆ๊ณ , [LegacyUnforgeable] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์ฃผ์„์ด ์ง€์ •๋œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

[LegacyUnforgeable] ํ™•์žฅ ์†์„ฑ์€ ๋ฐ˜๋“œ์‹œ ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[LegacyUnforgeable] ํ™•์žฅ ์†์„ฑ์€ ์ผ๋ฐ˜ ์†์„ฑ ๋˜๋Š” ๋น„-์ •์  ์—ฐ์‚ฐ ์ด์™ธ์—๋Š” ๋‚˜ํƒ€๋‚˜์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—ฐ์‚ฐ์— ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ์—ฐ์‚ฐ์—๋„ ๋‚˜ํƒ€๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[LegacyUnforgeable] ํ™•์žฅ ์†์„ฑ์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ์†์„ฑ์—๋Š” ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์†์„ฑ ๋˜๋Š” ์—ฐ์‚ฐ X๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค A์—์„œ ์œ„์กฐ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , A๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค B์˜ ์ƒ์†๋œ ์ธํ„ฐํŽ˜์ด์Šค ์ค‘ ํ•˜๋‚˜๋ผ๋ฉด, B์—๋Š” ์ผ๋ฐ˜ ์†์„ฑ ๋˜๋Š” ๋น„-์ •์  ์—ฐ์‚ฐ ์ค‘ X์™€ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„ ๊ฒƒ์ด ์žˆ์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

[Exposed=Window]
interface A1 {
  [LegacyUnforgeable] readonly attribute DOMString x;
};
[Exposed=Window]
interface B1 : A1 {
  undefined x();  // ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ; A1์˜ x์— ์˜ํ•ด shadow๋จ.
};

[Exposed=Window]
interface B2 : A1 { };
B2 includes M1;
interface mixin M1 {
  undefined x();  // ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ; B2์˜ x๊ฐ€ A1์˜ x์— ์˜ํ•ด shadow๋จ.
};

๊ตฌ์ฒด์  ์š”๊ตฌ์‚ฌํ•ญ์€ ยงโ€ฏ3.7.6 ์†์„ฑ, ยงโ€ฏ3.7.7 ์—ฐ์‚ฐ, ยงโ€ฏ3.8 ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด, ยงโ€ฏ3.9 ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด, ยงโ€ฏ3.9.3 [[DefineOwnProperty]]์—์„œ [LegacyUnforgeable] ์‚ฌ์šฉ ๊ทœ์น™์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋‹ค์Œ IDL ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๋‘ ๊ฐœ์˜ attribute๋ฅผ ๊ฐ€์ง„ interface๋ฅผ ์ •์˜ํ•˜๋ฉฐ, ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” [LegacyUnforgeable]๋กœ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

[Exposed=Window]
interface System {
  [LegacyUnforgeable] readonly attribute DOMString username;
  readonly attribute long long loginTime;
};

ํ•ด๋‹น interface๋ฅผ ์ง€์›ํ•˜๋Š” JavaScript ๊ตฌํ˜„์—์„œ๋Š” username attribute๊ฐ€ ๊ฐ์ฒด ์ž์ฒด์˜ non-configurable ํ”„๋กœํผํ‹ฐ๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค:

var system = getSystem();                      // System ์ธ์Šคํ„ด์Šค ํš๋“.

system.hasOwnProperty("username");             // true ๋ฐ˜ํ™˜
system.hasOwnProperty("loginTime");            // false ๋ฐ˜ํ™˜
System.prototype.hasOwnProperty("username");   // false ๋ฐ˜ํ™˜
System.prototype.hasOwnProperty("loginTime");  // true ๋ฐ˜ํ™˜

try {
  // ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ non-configurable์ด๋ฏ€๋กœ ์‹คํŒจํ•จ.
  Object.defineProperty(system, "username", { value: "administrator" });
} catch (e) { }

// ์•„๋ž˜ defineProperty๋Š” ์„ฑ๊ณต (System.prototype.loginTime์€ configurable)
var forgedLoginTime = 5;
Object.defineProperty(System.prototype, "loginTime", { value: forgedLoginTime });

system.loginTime;  // forgedLoginTime ๋ฐ˜ํ™˜

3.4.11. [LegacyWindowAlias]

[LegacyWindowAlias] ํ™•์žฅ ์†์„ฑ์ด ์ธํ„ฐํŽ˜์ด์Šค์— ๋‚˜ํƒ€๋‚˜๋ฉด, ์ด๋Š” Window ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ค์Œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ์†์„ฑ์„ ๊ฐ–๊ฒŒ ๋จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ™•์žฅ ์†์„ฑ์— ์–ธ๊ธ‰๋œ ๊ฐ ์‹๋ณ„์ž์— ๋Œ€ํ•ด, ๊ทธ ๊ฐ’์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

[LegacyWindowAlias] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์‹๋ณ„์ž ๋˜๋Š” ์‹๋ณ„์ž ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. โ€œ=โ€ ์ดํ›„์— ๋‚˜์˜ค๋Š” ์‹๋ณ„์ž๋“ค์€ [LegacyWindowAlias]์˜ ์‹๋ณ„์ž(identifier)์ž…๋‹ˆ๋‹ค.

[LegacyWindowAlias]์˜ ์‹๋ณ„์ž๋“ค์€ ์ด interface ๋˜๋Š” ๋‹ค๋ฅธ interface์˜ [LegacyWindowAlias]์—์„œ ์‚ฌ์šฉ๋œ ๊ฒƒ๊ณผ ๊ฐ™์œผ๋ฉด ์•ˆ ๋˜๋ฉฐ, ์ด interface ๋˜๋Š” ๋‹ค๋ฅธ interface์˜ [LegacyFactoryFunction]์—์„œ ์‚ฌ์šฉ๋œ ์‹๋ณ„์ž์™€ ๊ฐ™์•„๋„ ์•ˆ ๋˜๊ณ , interface ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” interface์˜ ์‹๋ณ„์ž์™€ ๊ฐ™์•„๋„ ์•ˆ ๋˜๋ฉฐ, ์˜ˆ์•ฝ๋œ ์‹๋ณ„์ž๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[LegacyWindowAlias]์™€ [LegacyNoInterfaceObject] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ๊ฐ™์€ interface์— ๋™์‹œ์— ๋ช…์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[LegacyWindowAlias]์™€ [LegacyNamespace] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋„ ๊ฐ™์€ interface์— ๋ช…์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[LegacyWindowAlias] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” Window interface๊ฐ€ ๋…ธ์ถœ ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์ง€ ์•Š์€ interface์—๋Š” ๋ช…์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ•œ interface์— ํ•˜๋‚˜ ์ด์ƒ์˜ [LegacyWindowAlias] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ ˆ๊ฑฐ์‹œ window alias์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ยงโ€ฏ3.7 ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ IDL์€ [LegacyWindowAlias] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” interface๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

[Exposed=Window,
 LegacyWindowAlias=WebKitCSSMatrix]
interface DOMMatrix : DOMMatrixReadOnly {
  // ...
};

์ด interface๋ฅผ ์ง€์›ํ•˜๋Š” JavaScript ๊ตฌํ˜„์—์„œ๋Š” Window ๊ฐ์ฒด์— ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋‘ ๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋ณดํ†ต๋Œ€๋กœ interface ๊ฐ์ฒด๋ฅผ ๋…ธ์ถœํ•˜๊ณ , ํ•˜๋‚˜๋Š” ๋ ˆ๊ฑฐ์‹œ ์ด๋ฆ„์œผ๋กœ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

WebKitCSSMatrix === DOMMatrix;     // true ๋ฐ˜ํ™˜

var m = new WebKitCSSMatrix();     // DOMMatrix๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ
                                   // 

m.constructor === DOMMatrix;       // true ๋ฐ˜ํ™˜
m.constructor === WebKitCSSMatrix; // true ๋ฐ˜ํ™˜
{}.toString.call(m);               // '[object DOMMatrix]' ๋ฐ˜ํ™˜

3.5. ๋ณด์•ˆ(Security)

์•„๋ž˜ ์ ˆ๋“ค์— ์ •์˜๋œ ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฃผ์–ด์ง„ ๊ฐ์ฒด์— ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒ€์‚ฌ๋Š” ์ฃผ์–ด์ง„ operation ํ˜ธ์ถœ์ด๋‚˜ attribute ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ฒ€์‚ฌ๋Š” ๋‹ค์Œ ์„ธ ์ž…๋ ฅ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

  1. operation ํ˜ธ์ถœ์ด๋‚˜ attribute ์ ‘๊ทผ์ด ์ˆ˜ํ–‰๋˜๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด

  2. ํ•ด๋‹น operation ๋˜๋Š” attribute์˜ ์‹๋ณ„์ž

  3. ํ•จ์ˆ˜ ๊ฐ์ฒด(function object)์˜ ํƒ€์ž… โ€” "method"(IDL operation์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ), "getter"/"setter"(IDL attribute์˜ getter/setter ํ•จ์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ)

์ฐธ๊ณ : HTML ํ‘œ์ค€์—์„œ๋Š” ๋ณด์•ˆ ๊ฒ€์‚ฌ ์ˆ˜ํ–‰ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. [HTML]

3.6. ์˜ค๋ฒ„๋กœ๋“œ ํ•ด์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํ•ด๊ฒฐ๋˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด, ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ์€ ์œ ํšจ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ, S์™€ JavaScript ๊ฐ’ ๋ชฉ๋ก args์ž…๋‹ˆ๋‹ค. ์ถœ๋ ฅ์€ ์—ฐ์‚ฐ ๋˜๋Š” S์˜ ํ•ญ๋ชฉ ์ค‘ ํ•˜๋‚˜์˜ ํ™•์žฅ ์†์„ฑ๊ณผ IDL ๊ฐ’ ๋ชฉ๋ก ๋˜๋Š” ํŠน์ˆ˜ ๊ฐ’ โ€œmissingโ€์œผ๋กœ ๊ตฌ์„ฑ๋œ ์Œ์ž…๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

  1. maxarg๋ฅผ S์˜ ํ•ญ๋ชฉ ์ค‘ ๊ฐ€์žฅ ๊ธด ํƒ€์ž… ๋ชฉ๋ก์˜ ๊ธธ์ด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. n์„ args์˜ ํฌ๊ธฐ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. argcount๋ฅผ min(maxarg, n)์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  4. ํƒ€์ž… ๋ชฉ๋ก์˜ ๊ธธ์ด๊ฐ€ argcount๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  5. S๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด, TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

  6. d๋ฅผ โˆ’1๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  7. method๋ฅผ undefined๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  8. S์— ๋‘˜ ์ด์ƒ์˜ ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉด, d๋ฅผ S์˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ๊ตฌ๋ณ„ ์ธ์ˆ˜ ์ธ๋ฑ์Šค๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. values๋ฅผ ๋นˆ ๋ชฉ๋ก์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ฉฐ, ๊ฐ ํ•ญ๋ชฉ์€ IDL ๊ฐ’ ๋˜๋Š” ํŠน์ˆ˜ ๊ฐ’ โ€œmissingโ€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  10. i๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  11. i < d์ธ ๋™์•ˆ:

    1. V๋ฅผ args[i]๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. type์„ S์˜ ์ž„์˜์˜ ํ•ญ๋ชฉ์˜ ํƒ€์ž… ๋ชฉ๋ก์—์„œ ์ธ๋ฑ์Šค i์— ์žˆ๋Š” ํƒ€์ž…์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

      ์ฐธ๊ณ : ์ด ์‹œ์ ์—์„œ S์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์€ ์ธ๋ฑ์Šค i์—์„œ ๋™์ผํ•œ ํƒ€์ž…๊ณผ ์„ ํƒ์„ฑ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

    3. optionality๋ฅผ S์˜ ์ž„์˜์˜ ํ•ญ๋ชฉ์˜ ์„ ํƒ์„ฑ ๊ฐ’ ๋ชฉ๋ก์—์„œ ์ธ๋ฑ์Šค i์— ์žˆ๋Š” ๊ฐ’์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    4. optionality๊ฐ€ โ€œoptionalโ€์ด๊ณ  V๊ฐ€ undefined์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

      1. ์ธ๋ฑ์Šค i์˜ ์ธ์ˆ˜๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฉด, ํ•ด๋‹น ๊ธฐ๋ณธ๊ฐ’์„ values์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ํŠน์ˆ˜ ๊ฐ’ โ€œmissingโ€์„ values์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    5. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, V๋ฅผ IDL ํƒ€์ž… type์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ values์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    6. i๋ฅผ i + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  12. i = d์ด๋ฉด:

    1. V๋ฅผ args[i]๋กœ ๋‘ก๋‹ˆ๋‹ค.

      ์ฐธ๊ณ : ์ด๋Š” ์–ด๋–ค ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์„ ํƒ๋˜๋Š”์ง€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค.

    2. V๊ฐ€ undefined์ด๊ณ , S์— ์„ ํƒ์„ฑ ๊ฐ’ ๋ชฉ๋ก์˜ ์ธ๋ฑ์Šค i์— โ€œoptionalโ€์ด ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด, ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : V๊ฐ€ null ๋˜๋Š” undefined์ด๊ณ , S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : V๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด์ด๊ณ , S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    5. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : V๊ฐ€ Object์ด๊ณ , V์— [[ArrayBufferData]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์žˆ์œผ๋ฉฐ, S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    6. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : V๊ฐ€ Object์ด๊ณ , V์— [[DataView]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์žˆ์œผ๋ฉฐ, S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    7. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : V๊ฐ€ Object์ด๊ณ , V์— [[TypedArrayName]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ์žˆ์œผ๋ฉฐ, S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    8. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : IsCallable(V)๊ฐ€ true์ด๊ณ , S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    9. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : V๊ฐ€ Object์ด๊ณ  S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์ด ๋ชจ๋‘ ์ฐธ์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ,

      ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„,

      1. method๋ฅผ ? GetMethod(V, %Symbol.asyncIterator%)๋กœ ๋‘ก๋‹ˆ๋‹ค.

      2. method๊ฐ€ undefined์ด๋ฉด, method๋ฅผ ? GetMethod(V, %Symbol.iterator%)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      method๊ฐ€ undefined๊ฐ€ ์•„๋‹ˆ๋ฉด, ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    10. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : V๊ฐ€ Object์ด๊ณ  S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„,

      1. method๋ฅผ ? GetMethod(V, %Symbol.iterator%)๋กœ ๋‘ก๋‹ˆ๋‹ค.

      method๊ฐ€ undefined๊ฐ€ ์•„๋‹ˆ๋ฉด, ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    11. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : V๊ฐ€ Object์ด๊ณ  S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    12. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : V๊ฐ€ Boolean์ด๊ณ  S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    13. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : V๊ฐ€ Number์ด๊ณ  S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    14. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : V๊ฐ€ BigInt์ด๊ณ  S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    15. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    16. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    17. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    18. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— ๋‹ค์Œ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด,

      ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    19. ๊ทธ๋ ‡์ง€ ์•Š๊ณ : S์— ํƒ€์ž… ๋ชฉ๋ก์˜ ์œ„์น˜ i์— any๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉด, ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ S์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    20. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด: TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

  13. callable์„ S์˜ ์œ ์ผํ•œ ํ•ญ๋ชฉ์˜ ์—ฐ์‚ฐ ๋˜๋Š” ํ™•์žฅ ์†์„ฑ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  14. i = d์ด๊ณ  method๊ฐ€ undefined๊ฐ€ ์•„๋‹ˆ๋ฉด:

    1. V๋ฅผ args[i]๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. T๋ฅผ S์— ๋‚จ์€ ํ•ญ๋ชฉ์˜ ํƒ€์ž… ๋ชฉ๋ก์—์„œ ์ธ๋ฑ์Šค i์— ์žˆ๋Š” ํƒ€์ž…์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    3. ๋‹จ์–ธ: T๋Š” ์‹œํ€€์Šค ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

    4. V์™€ method๋กœ๋ถ€ํ„ฐ ํƒ€์ž… T์˜ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋ฅผ values์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    5. i๋ฅผ i + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  15. i < argcount์ธ ๋™์•ˆ:

    1. V๋ฅผ args[i]๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. type์„ S์— ๋‚จ์€ ํ•ญ๋ชฉ์˜ ํƒ€์ž… ๋ชฉ๋ก์—์„œ ์ธ๋ฑ์Šค i์— ์žˆ๋Š” ํƒ€์ž…์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    3. optionality๋ฅผ S์— ๋‚จ์€ ํ•ญ๋ชฉ์˜ ์„ ํƒ์„ฑ ๊ฐ’ ๋ชฉ๋ก์—์„œ ์ธ๋ฑ์Šค i์— ์žˆ๋Š” ๊ฐ’์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    4. optionality๊ฐ€ โ€œoptionalโ€์ด๊ณ  V๊ฐ€ undefined์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

      1. ์ธ๋ฑ์Šค i์˜ ์ธ์ˆ˜๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฉด, ํ•ด๋‹น ๊ธฐ๋ณธ๊ฐ’์„ values์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ํŠน์ˆ˜ ๊ฐ’ โ€œmissingโ€์„ values์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    5. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, V๋ฅผ IDL ํƒ€์ž… type์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ values์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    6. i๋ฅผ i + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  16. i๊ฐ€ callable์ด ๋ฐ›๋„๋ก ์„ ์–ธ๋œ ์ธ์ˆ˜์˜ ์ˆ˜๋ณด๋‹ค ์ž‘์€ ๋™์•ˆ:

    1. callable์˜ ์ธ๋ฑ์Šค i์— ์žˆ๋Š” ์ธ์ˆ˜๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฉด, ํ•ด๋‹น ๊ธฐ๋ณธ๊ฐ’์„ values์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , callable์˜ ์ธ๋ฑ์Šค i์— ์žˆ๋Š” ์ธ์ˆ˜๊ฐ€ ๊ฐ€๋ณ€ ์ธ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉด, ํŠน์ˆ˜ ๊ฐ’ โ€œmissingโ€์„ values์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    3. i๋ฅผ i + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  17. <callable, values> ์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

๋จผ์ €, ์œ ํšจํ•œ ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์€ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ JavaScript ์ธ์ž ๊ฐœ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค:

์˜ฌ๋ฐ”๋ฅธ ์ธ์ž ๊ฐœ์ˆ˜์˜ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์„ ์–ป์€ ํ›„์—๋Š”, JavaScript ๊ฐ’๋“ค์„ ์™ผ์ชฝ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„๋กœ๋“œ ์ œ์•ฝ์˜ ์„ฑ์งˆ ๋•๋ถ„์—, ์ด ์‹œ์ ์— ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ๋‚จ์•„ ์žˆ๋‹ค๋ฉด, ์ธ์ž ๋ฆฌ์ŠคํŠธ ์ค‘ ํ•œ ์œ„์น˜์—์„œ ์ตœ์ข…์ ์œผ๋กœ ์–ด๋–ค ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์„ ํƒํ• ์ง€ ๊ตฌ๋ถ„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ์œ„์น˜๊ฐ€ ๊ตฌ๋ถ„ ์ธ์ž ์ธ๋ฑ์Šค(distinguishing argument index)์ž…๋‹ˆ๋‹ค.

๋จผ์ € ๊ตฌ๋ถ„ ์ธ์ž ์™ผ์ชฝ์˜ ์ธ์ž๋“ค์„ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.(๊ตฌ๋ถ„ ์ธ์ž ์ธ๋ฑ์Šค ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ์ธ์ž๋Š” ๋ชจ๋“  ์˜ค๋ฒ„๋กœ๋“œ์—์„œ ๊ฐ™์€ ํƒ€์ž…์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.) ๊ทธ ๋‹ค์Œ, ๊ตฌ๋ถ„ ์ธ์ž ์ธ๋ฑ์Šค์— ์ „๋‹ฌ๋œ JavaScript ๊ฐ’์˜ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์–ด๋–ค IDL ํƒ€์ž…์— ๋Œ€์‘๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ตœ์ข…์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ „๋‹ฌ๋œ ๊ฐ’์ด undefined์ด๊ณ  ํ•ด๋‹น ์œ„์น˜๊ฐ€ optional ์ธ์ž๋ผ๋ฉด, ํ•ด๋‹น ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ „๋‹ฌ๋œ ๊ฐ’ ํƒ€์ž…์— ๋งž๋Š” ์œ ํšจํ•œ ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด TypeError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ, ๊ตฌ๋ถ„ ์ธ์ž ์ธ๋ฑ์Šค์˜ ๊ฐ’ ๊ฒ€์‚ฌ์—๋Š” ๋ถ€์ž‘์šฉ์ด ์—†์œผ๋ฉฐ, ์˜ค๋ฒ„๋กœ๋“œ ํ•ด์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์œ ์ผํ•œ ๋ถ€์ž‘์šฉ์€ JavaScript ๊ฐ’์„ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ์™ธ์ ์œผ๋กœ, ์–ด๋–ค ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ๊ตฌ๋ถ„ ์ธ์ž ์ธ๋ฑ์Šค์— async sequence ํƒ€์ž…, sequence ํƒ€์ž…, ๋˜๋Š” frozen array ํƒ€์ž…์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” %Symbol.asyncIterator% / %Symbol.iterator% ํ”„๋กœํผํ‹ฐ๋ฅผ ์–ป์–ด ์ ํ•ฉํ•œ ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉฐ, ๊ตฌ๋ถ„ ์ธ์ž์— ๋Œ€ํ•œ ๋ณ€ํ™˜์€ ๋”ฐ๋กœ ์ˆ˜ํ–‰ํ•œ ๋’ค ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๊ณ„์† ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.)

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

optional ์ธ์ž์˜ JavaScript ๊ฐ’์„ ํ•ด๋‹น IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, undefined๋Š” optional ์ธ์ž์˜ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ทธ ๊ฐ’์œผ๋กœ, ์—†์œผ๋ฉด ํŠน์ˆ˜๊ฐ’ โ€œmissingโ€์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๊ฐ€๋ณ€ ์ธ์ž(variadic argument)์— ํ•ด๋‹นํ•˜๋Š” optional ์ธ์ž์—์„œ๋Š” undefined๊ฐ€ โ€œmissingโ€์œผ๋กœ ํŠน๋ณ„ํ•˜๊ฒŒ ์ทจ๊ธ‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. undefined ๊ฐ’์€ ๊ฐ€๋ณ€ ์ธ์ž ํƒ€์ž…์œผ๋กœ, optional์ด ์•„๋‹Œ ์ธ์ž์™€ ๋™์ผํ•˜๊ฒŒ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

3.7. ์ธํ„ฐํŽ˜์ด์Šค

์ฃผ์–ด์ง„ realm์—์„œ ๋…ธ์ถœ๋˜๋ฉฐ [LegacyNoInterfaceObject] ๋˜๋Š” [LegacyNamespace] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด, ํ•ด๋‹น realm์˜ ์ „์—ญ ๊ฐ์ฒด์— ๋Œ€์‘ํ•˜๋Š” ์†์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์†์„ฑ์˜ ์ด๋ฆ„์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‹๋ณ„์ž์ด๋ฉฐ, ๊ทธ ๊ฐ’์€ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋ผ๊ณ  ํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์˜ ํŠน์„ฑ์€ ยง 3.7.1 ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

[LegacyWindowAlias] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ๋…ธ์ถœ๋œ ์ธํ„ฐํŽ˜์ด์Šค์— ์ง€์ •๋˜์–ด ์žˆ์œผ๋ฉด, [LegacyWindowAlias]์˜ ๊ฐ ์‹๋ณ„์ž๋“ค์— ํฌํ•จ๋œ ๊ฐ ์‹๋ณ„์ž์— ๋Œ€ํ•ด, Window ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์€ ์ฃผ์–ด์ง„ ์‹๋ณ„์ž์ด๊ณ , ๊ฐ’์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋…ธ์ถœ๋œ ์ธํ„ฐํŽ˜์ด์Šค์— [LegacyFactoryFunction] ํ™•์žฅ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์€ [LegacyFactoryFunction]์˜ ์‹๋ณ„์ž์ด๊ณ , ๊ฐ’์€ ๋ ˆ๊ฑฐ์‹œ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜(legacy factory function)์ด๋ฉฐ, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜์˜ ํŠน์„ฑ์€ ยงโ€ฏ3.7.2 ๋ ˆ๊ฑฐ์‹œ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ ˆ์—์„œ ์ •์˜๋œ ๋ช‡๋ช‡ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”์„œ๋“œ๋Š” ์ดˆ๊ธฐ์— ๊ตฌํ˜„ ๊ฐ์ฒด ์ฒดํฌ(implementation check)๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ, ์˜ฌ๋ฐ”๋ฅธ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœ๋˜๋Š”์ง€์™€ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์—์„œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

jsValue๋ฅผ interface ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด, name ์‹๋ณ„์ž์™€ type ํƒ€์ž…์œผ๋กœ ๊ตฌํ˜„ ๊ฐ์ฒด ์ฒดํฌ(implementation-check an object)ํ•˜๋Š” ์ ˆ์ฐจ:

  1. object๋ฅผ ? ToObject(jsValue)๋กœ ํ•œ๋‹ค.

  2. object๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด(platform object)๋ผ๋ฉด, ๋ณด์•ˆ ๊ฒ€์‚ฌ(perform a security check)๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•œ๋‹ค:

    • ํ”Œ๋žซํผ ๊ฐ์ฒด object

    • ์‹๋ณ„์ž name

    • ํƒ€์ž… type

  3. object๊ฐ€ interface๋ฅผ ๊ตฌํ˜„(implement)ํ•˜์ง€ ์•Š์œผ๋ฉด throw TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

  4. object๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•„์ง ๋ชจ๋“  ๊ณณ์—์„œ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3.7.1. ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด

์ฃผ์–ด์ง„ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ฐ์ฒด(built-in function object)์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๋Š” ์ƒ์ˆ˜ ๋ฐ static ์—ฐ์‚ฐ์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ยงโ€ฏ3.7.5 ์ƒ์ˆ˜์™€ ยงโ€ฏ3.7.7 ์—ฐ์‚ฐ์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ƒ์„ฑ์ž ์—ฐ์‚ฐ(constructor operation)์œผ๋กœ ์„ ์–ธ๋œ ๊ฒฝ์šฐ, ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์ž(constructor)๋กœ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋ฅผ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ƒ์„ฑ์ž ์—ฐ์‚ฐ์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑ์ž๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ผ๋Š” ์—ฐ๊ด€ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ์ •๊ทœ attribute ๋ฐ ์ •๊ทœ ์—ฐ์‚ฐ์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ยงโ€ฏ3.7.3 ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด(function object)์ด๋ฏ€๋กœ, typeof ์—ฐ์‚ฐ์ž๋ฅผ ์ ์šฉํ•˜๋ฉด "function"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ƒ์„ฑ์ž ์žฌ์ •์˜ ๋‹จ๊ณ„(overridden constructor steps)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๊ฐ€ ํ˜ธ์ถœ๋˜๊ฑฐ๋‚˜ ์ƒ์„ฑ๋  ๋•Œ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋Ÿฌํ•œ ๋‹จ๊ณ„๋ฅผ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ฃผ์–ด์ง„ ์ธํ„ฐํŽ˜์ด์Šค I์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด, id ์‹๋ณ„์ž์™€ realm์—์„œ์˜ ์ƒ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ(create an interface object)๋œ๋‹ค:

  1. steps๋ฅผ I์˜ ์žฌ์ •์˜๋œ ์ƒ์„ฑ์ž ๋‹จ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๊ทธ ๊ฐ’์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋“ค๋กœ ๋‘”๋‹ค:

    1. I๊ฐ€ ์ƒ์„ฑ์ž ์—ฐ์‚ฐ์ž๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

    2. NewTarget ์ด undefined๋ผ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

    3. args๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ์ธ์ˆ˜๋“ค๋กœ ๋‘”๋‹ค.

    4. n์„ args์˜ ํฌ๊ธฐ๋กœ ๋‘”๋‹ค.

    5. id๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค I์˜ ์‹๋ณ„์ž(identifier)๋กœ ๋‘”๋‹ค.

    6. ์ƒ์„ฑ์ž์— ๋Œ€ํ•ด ํšจ๊ณผ์ ์ธ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋ผ. ์‹๋ณ„์ž id์™€ ์ธํ„ฐํŽ˜์ด์Šค I, ์ธ์ˆ˜ ๊ฐœ์ˆ˜ n์„ ์ด์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ S๋กœ ๋‘”๋‹ค.

    7. <constructor, values>๋ฅผ ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— S์™€ args๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์–ป์€ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    8. object๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ ๊ฐ์ฒด๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค. I, realm, ๊ทธ๋ฆฌ๊ณ  NewTarget์„ ์ธ์ž๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

    9. constructor์˜ ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋ฅผ object๋ฅผ this๋กœ, values๋ฅผ ์ธ์ž๊ฐ’์œผ๋กœ ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    10. O๋ฅผ object๋ฅผ JavaScript ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

    11. ๋‹จ์–ธ: O๋Š” I๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋‹ค.

    12. ๋‹จ์–ธ: O.[[Realm]]์€ realm์ด๋‹ค.

    13. O๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. constructorProto๋ฅผ realm.[[Intrinsics]].[[%Function.prototype%]] ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

  3. I๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค P๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์•˜๋‹ค๋ฉด, constructorProto๋ฅผ realm์—์„œ P์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. unforgeables๋ฅผ OrdinaryObjectCreate(null)์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  5. I์˜ ์œ„์กฐ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ •๊ทœ ์—ฐ์‚ฐ์„ unforgeables์—, realm์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ •์˜ํ•œ๋‹ค.

  6. I์˜ ์œ„์กฐ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ •๊ทœ ์†์„ฑ์„ unforgeables์—, realm์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ •์˜ํ•œ๋‹ค.

  7. F.[[Unforgeables]]๋ฅผ unforgeables๋กœ ์„ค์ •ํ•œ๋‹ค.

    ์ฐธ๊ณ : ์ด ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ์ž ์ฝ”๋“œ์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ์˜ค์ง ์ธํ„ฐํŽ˜์ด์Šค์˜ ์œ„์กฐ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฉค๋ฒ„๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๊ฐ€ ์†์„ฑ getter, ์†์„ฑ setter, ์—ฐ์‚ฐ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋™์ผํ•œ JavaScript ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค.

  8. length๋ฅผ 0์œผ๋กœ ๋‘”๋‹ค.

  9. I๊ฐ€ ์ƒ์„ฑ์ž ์—ฐ์‚ฐ์ž๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด,

    1. ์ƒ์„ฑ์ž์— ๋Œ€ํ•ด ํšจ๊ณผ์ ์ธ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋ผ. ์‹๋ณ„์ž id, ์ธํ„ฐํŽ˜์ด์Šค I, ์ธ์ˆ˜ ๊ฐœ์ˆ˜ 0์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ S๋กœ ๋‘”๋‹ค.

    2. length๋ฅผ S์˜ ์—”ํŠธ๋ฆฌ๋“ค ์ค‘ ๊ฐ€์žฅ ์งง์€ ์ธ์ˆ˜ ๋ชฉ๋ก์˜ ๊ธธ์ด๋กœ ์„ค์ •ํ•œ๋‹ค.

  10. F๋ฅผ CreateBuiltinFunction(steps, length, id, ยซ [[Unforgeables]] ยป, realm, constructorProto) ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  11. proto๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด ์ƒ์„ฑ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค I์™€ realm์„ ์‚ฌ์šฉํ•œ๋‹ค.

  12. ! DefinePropertyOrThrow(F, "prototype", PropertyDescriptor{[[Value]]: proto, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false})๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  13. ์ƒ์ˆ˜ ์ •์˜๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค I์™€ F, realm์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค.

  14. ์ •์  ์†์„ฑ ์ •์˜๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค I, F, realm์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค.

  15. ์ •์  ์—ฐ์‚ฐ ์ •์˜๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค I, F, realm์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค.

  16. F๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.7.2. ๋ ˆ๊ฑฐ์‹œ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜

์–ด๋–ค ๋ ˆ๊ฑฐ์‹œ ํŒฉํ„ฐ๋ฆฌ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ [LegacyFactoryFunction] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์ธํ•ด ์กด์žฌํ•˜๋ฉฐ ์ฃผ์–ด์ง„ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„ ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๊ฐ์ฒด๋Š” ๋‹ค์Œ [LegacyFactoryFunction] ํ™•์žฅ ์†์„ฑ์ด ๋‚˜ํƒ€๋‚˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๋ ˆ๊ฑฐ์‹œ ํŒฉํ„ฐ๋ฆฌ ํ•จ์ˆ˜ ์ค‘ ์‹๋ณ„์ž๊ฐ€ id์ด๊ณ  ์ฃผ์–ด์ง„ ์ธํ„ฐํŽ˜์ด์Šค I์— ๋Œ€ํ•ด Realm realm์— ์žˆ๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  1. steps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‘ก๋‹ˆ๋‹ค:

    1. NewTarget ๊ฐ€ undefined์ธ ๊ฒฝ์šฐ, ๋ฐœ์ƒ์‹œํ‚ฌ ์˜ˆ์™ธ๋Š” TypeError์ž…๋‹ˆ๋‹ค.

    2. args๋ฅผ ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋กœ ๋‘ก๋‹ˆ๋‹ค.

    3. n์„ ํฌ๊ธฐ์ธ args์˜ ๊ฐ’์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    4. ์œ ํšจ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ ˆ๊ฑฐ์‹œ ํŒฉํ„ฐ๋ฆฌ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์‹๋ณ„์ž id๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค I์— ์žˆ๊ณ  ์ธ์ˆ˜ ์ˆ˜๊ฐ€ n์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ๋ฅผ S๋กœ ๋‘ก๋‹ˆ๋‹ค.

    5. <constructor, values>๋ฅผ ๋‹ค์Œ ์ „๋‹ฌ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. S์™€ args๋ฅผ ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    6. object๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ I๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด๋•Œ realm๊ณผ NewTarget์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    7. constructor์˜ ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. object๋ฅผ this๋กœ, values๋ฅผ ์ธ์ˆ˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    8. O๋ฅผ object๋ฅผ JavaScript ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    9. ๋‹จ์–ธ: O๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์ด I์ธ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

    10. ๋‹จ์–ธ: O.[[Realm]]์€ realm์ž…๋‹ˆ๋‹ค.

    11. O๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ์œ ํšจ ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ ˆ๊ฑฐ์‹œ ํŒฉํ„ฐ๋ฆฌ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์‹๋ณ„์ž id๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค I์— ์žˆ๊ณ  ์ธ์ˆ˜ ์ˆ˜๊ฐ€ 0์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ๋ฅผ S๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. length๋ฅผ S์˜ ํ•ญ๋ชฉ ์ค‘ ๊ฐ€์žฅ ์งง์€ ์ธ์ˆ˜ ๋ชฉ๋ก์˜ ๊ธธ์ด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. F๋ฅผ CreateBuiltinFunction(steps, length, id, ยซ ยป, realm)์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. proto๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค I์˜ realm ๋‚ด ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

  6. ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค: ! DefinePropertyOrThrow(F, "prototype", PropertyDescriptor{[[Value]]: proto, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}).

  7. F๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.7.3. ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด

์ •์˜๋œ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ [LegacyNoInterfaceObject] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์Šต๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค interface์™€ Realm realm์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  1. proto๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. interface๊ฐ€ [Global] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ณ , interface๊ฐ€ ๋ช…๋ช…๋œ ์†์„ฑ์„ ์ง€์›ํ•˜๋ฉด, proto๋ฅผ interface์™€ realm์— ๋Œ€ํ•ด ๋ช…๋ช…๋œ ์†์„ฑ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , interface๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ƒ์†ํ•˜๋„๋ก ์„ ์–ธ๋œ ๊ฒฝ์šฐ, proto๋ฅผ realm์— ์žˆ๋Š” ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ์ƒ์†๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , interface๊ฐ€ DOMException ์ธํ„ฐํŽ˜์ด์Šค์ธ ๊ฒฝ์šฐ, proto๋ฅผ realm.[[Intrinsics]].[[%Error.prototype%]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, proto๋ฅผ realm.[[Intrinsics]].[[%Object.prototype%]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. ๋‹จ์–ธ: proto๋Š” Object์ž…๋‹ˆ๋‹ค.

  7. interfaceProtoObj๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  8. realm์˜ ์ „์—ญ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๊ฐ€ true์ด๋ฉด:

    1. interfaceProtoObj๋ฅผ OrdinaryObjectCreate(proto)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , interface๊ฐ€ [Global] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ฑฐ๋‚˜, interface๊ฐ€ [Global] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒ์†๋œ ์ธํ„ฐํŽ˜์ด์Šค ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด:

    1. interfaceProtoObj๋ฅผ MakeBasicObject(ยซ [[Prototype]], [[Extensible]] ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. interfaceProtoObj.[[Prototype]]์„ proto๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. ๋ถˆ๋ณ€ ํ”„๋กœํ† ํƒ€์ž… ํŠน์ˆ˜ ๊ฐ์ฒด์— ๊ณ ์œ ํ•œ interfaceProtoObj์˜ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์Œ์— ์ง€์ •๋œ ์ •์˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ECMA-262 ๋ถˆ๋ณ€ ํ”„๋กœํ† ํƒ€์ž… ํŠน์ˆ˜ ๊ฐ์ฒด.

  10. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, interfaceProtoObj๋ฅผ OrdinaryObjectCreate(proto)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  11. interface์— [Unscopable] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋œ ๋ฉค๋ฒ„๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

    1. unscopableObject๋ฅผ OrdinaryObjectCreate(null)๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. interface์˜ [Unscopable] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋œ ๊ฐ ๋…ธ์ถœ๋œ ๋ฉค๋ฒ„ member์— ๋Œ€ํ•ด:

      1. id๋ฅผ member์˜ ์‹๋ณ„์ž๋กœ ๋‘ก๋‹ˆ๋‹ค.

      2. ! CreateDataPropertyOrThrow(unscopableObject, id, true)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    3. desc๋ฅผ PropertyDescriptor{[[Value]]: unscopableObject, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true}๋กœ ๋‘ก๋‹ˆ๋‹ค.

    4. ! DefinePropertyOrThrow(interfaceProtoObj, %Symbol.unscopables%, desc)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  12. interface๊ฐ€ [Global] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด:

    1. ์ฃผ์–ด์ง„ realm์— ๋Œ€ํ•ด interfaceProtoObj์— interface์˜ ์ผ๋ฐ˜ ์†์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

    2. ์ฃผ์–ด์ง„ realm์— ๋Œ€ํ•ด interfaceProtoObj์— interface์˜ ์ผ๋ฐ˜ ์—ฐ์‚ฐ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

    3. ์ฃผ์–ด์ง„ realm์— ๋Œ€ํ•ด interfaceProtoObj์— interface์˜ ๋ฐ˜๋ณต ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

    4. ์ฃผ์–ด์ง„ realm์— ๋Œ€ํ•ด interfaceProtoObj์— interface์˜ ๋น„๋™๊ธฐ ๋ฐ˜๋ณต ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  13. ์ฃผ์–ด์ง„ realm์— ๋Œ€ํ•ด interfaceProtoObj์— interface์˜ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  14. [LegacyNoInterfaceObject] ํ™•์žฅ ์†์„ฑ์ด interface์— ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด:

    1. constructor๋ฅผ realm์— ์žˆ๋Š” interface์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. desc๋ฅผ PropertyDescriptor{[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true, [[Value]]: constructor}๋กœ ๋‘ก๋‹ˆ๋‹ค.

    3. ! DefinePropertyOrThrow(interfaceProtoObj, "constructor", desc)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  15. interfaceProtoObj๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ๋‹ค์Œ์—์„œ ์„ ์–ธ์ ์œผ๋กœ ์†์„ฑ์„ ์–ป์Šต๋‹ˆ๋‹ค:

๋Œ€์‹  ์ด๋Ÿฌํ•œ ์†์„ฑ์„ ๋ช…๋ นํ˜•์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

[LegacyNoInterfaceObject] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ IDL์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

[Exposed=Window,
 LegacyNoInterfaceObject]
interface Foo {
};

partial interface Window {
  attribute Foo foo;
};

์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. (window.Foo๋กœ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ Foo ์ธ์Šคํ„ด์Šค๋Š” [[GetPrototypeOf]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” Object.getPrototypeOf(window.foo)์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ํด๋ž˜์Šค ๋ฌธ์ž์—ด์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ •๊ทœํ™”๋œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

3.7.4. ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ์ฒด

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธ๋œ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด [Global] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜๊ณ  ๋ช…๋ช…๋œ ์†์„ฑ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ๋ช…๋ช…๋œ ์†์„ฑ ๊ฐ์ฒด๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ์ด ๊ฐ์ฒด์—์„œ ๋ช…๋ช…๋œ ์†์„ฑ์ด ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ์ธํ„ฐํŽ˜์ด์Šค interface์™€ realm realm์—์„œ ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ(create a named properties object)๋œ๋‹ค:
  1. proto๋ฅผ null๋กœ ํ•œ๋‹ค.

  2. interface๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋ฉด, proto๋ฅผ ์ƒ์†๋œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ํ•ด๋‹น realm์—์„œ์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋กœ ํ•œ๋‹ค.

  3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด proto๋ฅผ realm.[[Intrinsics]].[[%Object.prototype%]]๋กœ ํ•œ๋‹ค.

  4. obj๋ฅผ MakeBasicObject(ยซ [[Prototype]], [[Extensible]] ยป)๋กœ ํ•œ๋‹ค.

  5. obj.[[GetOwnProperty]]๋ฅผ ยงโ€ฏ3.7.4.1 [[GetOwnProperty]]์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ์„ค์ •ํ•œ๋‹ค.

  6. obj.[[DefineOwnProperty]]๋ฅผ ยงโ€ฏ3.7.4.2 [[DefineOwnProperty]]์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ์„ค์ •ํ•œ๋‹ค.

  7. obj.[[Delete]]๋ฅผ ยงโ€ฏ3.7.4.3 [[Delete]]์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ์„ค์ •ํ•œ๋‹ค.

  8. obj.[[SetPrototypeOf]]๋ฅผ ยงโ€ฏ3.7.4.4 [[SetPrototypeOf]]์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ์„ค์ •ํ•œ๋‹ค.

  9. obj.[[PreventExtensions]]๋ฅผ ยงโ€ฏ3.7.4.5 [[PreventExtensions]]์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ์„ค์ •ํ•œ๋‹ค.

  10. obj.[[Prototype]]์— proto๋ฅผ ์„ค์ •ํ•œ๋‹ค.

  11. obj๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฐธ๊ณ : ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ์ฒด์˜ [[OwnPropertyKeys]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” OrdinaryOwnPropertyKeys๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๋Š” โ€œ์‹ค์ œโ€ own property๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ด ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ์—์„œ๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค ๋ฌธ์ž์—ด(class string)์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‹๋ณ„์ž์™€ ๋ฌธ์ž์—ด "Properties"๋ฅผ ์—ฐ๊ฒฐํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

3.7.4.1. [[GetOwnProperty]]

๋ช…๋ช…๋œ ์†์„ฑ ๊ฐ์ฒด O์˜ [[GetOwnProperty]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๊ฐ€ ์†์„ฑ ํ‚ค P๋กœ ํ˜ธ์ถœ๋˜๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. A๋ฅผ ๋ช…๋ช…๋œ ์†์„ฑ ๊ฐ์ฒด O์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. object๋ฅผ O.[[Realm]]์˜ ์ „์—ญ ๊ฐ์ฒด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. ๋‹จ์–ธ: object๋Š” A๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  4. ์†์„ฑ ์ด๋ฆ„ P์™€ ๊ฐ์ฒด object๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ช…๋œ ์†์„ฑ ๊ฐ€์‹œ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ true์ด๋ฉด:

    1. operation์„ ๋ช…๋ช…๋œ ์†์„ฑ getter๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ์—ฐ์‚ฐ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. value๋ฅผ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋กœ ๋‘ก๋‹ˆ๋‹ค.

    3. operation์ด ์‹๋ณ„์ž ์—†์ด ์ •์˜๋˜์—ˆ๋‹ค๋ฉด, value๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๋ช…์— ๋‚˜์—ด๋œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ช…๋ช…๋œ ์†์„ฑ์˜ ๊ฐ’์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ P๋ฅผ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, operation์€ ์‹๋ณ„์ž์™€ ํ•จ๊ป˜ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. value๋ฅผ operation์˜ ์„ค๋ช…์— ๋‚˜์—ด๋œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•˜๋ฉฐ, P๋ฅผ ์œ ์ผํ•œ ์ธ์ˆ˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    5. desc๋ฅผ ํ•„๋“œ๊ฐ€ ์—†๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์†์„ฑ ์„ค๋ช…์ž๋กœ ๋‘ก๋‹ˆ๋‹ค.

    6. desc.[[Value]]๋ฅผ value๋ฅผ JavaScript ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    7. A๊ฐ€ [LegacyUnenumerableNamedProperties] ํ™•์žฅ ์†์„ฑ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด, desc.[[Enumerable]]์„ false๋กœ ์„ค์ •ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    8. desc.[[Writable]]์„ true๋กœ ์„ค์ •ํ•˜๊ณ  desc.[[Configurable]]์„ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    9. desc๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. OrdinaryGetOwnProperty(O, P)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.7.4.2. [[DefineOwnProperty]]

์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ์ฒด์˜ [[DefineOwnProperty]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค:

  1. false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.7.4.3. [[Delete]]

์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ์ฒด์˜ [[Delete]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค:

  1. false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.7.4.4. [[SetPrototypeOf]]

์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ์ฒด O์˜ [[SetPrototypeOf]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๊ฐ€ JavaScript ๊ฐ’ V๋กœ ํ˜ธ์ถœ๋  ๋•Œ, ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค:

  1. ๋งŒ์•ฝ O์˜ ์—ฐ๊ด€ realm์˜ ๊ธ€๋กœ๋ฒŒ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด mutable๋ผ๋ฉด, ? OrdinarySetPrototypeOf(O, V)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. ? SetImmutablePrototype(O, V)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.7.4.5. [[PreventExtensions]]

์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ์ฒด์˜ [[PreventExtensions]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค:

  1. false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฐธ๊ณ : ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด [[PreventExtensions]]๊ฐ€ ์‹คํŒจํ•˜๋ฉด์„œ ์ด๋ฆ„์žˆ๋Š” ํ”„๋กœํผํ‹ฐ ๊ฐ์ฒด๊ฐ€ ํ™•์žฅ ๊ฐ€๋Šฅ(extensible)ํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

3.7.5. ์ƒ์ˆ˜

์ƒ์ˆ˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด, ๋ ˆ๊ฑฐ์‹œ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด, ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ [Global] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋œ ๊ฒฝ์šฐ, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‹จ์ผ ๊ฐ์ฒด์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค: ์ธํ„ฐํŽ˜์ด์Šค, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค definition์„ target์— ๋Œ€ํ•ด, realm realm์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:
  1. ๊ฐ๊ฐ์˜ ์ƒ์ˆ˜ const์— ๋Œ€ํ•ด, ๋ฉค๋ฒ„๊ฐ€ definition์— ์†ํ•œ ๊ฒฝ์šฐ:

    1. const๊ฐ€ realm์—์„œ ๋…ธ์ถœ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

    2. value๋ฅผ IDL ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. desc๋ฅผ PropertyDescriptor{[[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false, [[Value]]: value}๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. id๋ฅผ const์˜ ์‹๋ณ„์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. ! DefinePropertyOrThrow(target, id, desc)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

3.7.6. ์†์„ฑ

์ •์  ์†์„ฑ์€ ๋‹ค์Œ์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด. ์ผ๋ฐ˜ ์†์„ฑ์€ ๋‹ค์Œ์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด, ์†์„ฑ์ด ์œ„์กฐ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ [Global] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๋ฉฐ, ์ด ๊ฒฝ์šฐ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์†์„ฑ ์ •์˜ํ•˜๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค definition์„ target์— realm realm๊ณผ ํ•จ๊ป˜ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”:
  1. attributes๋ฅผ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉ๋ก์€ ์ผ๋ฐ˜ ์†์„ฑ ์ค‘ definition์˜ ๋ฉค๋ฒ„์ธ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

  2. ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. attributes์—์„œ ์†์„ฑ ์ค‘ ์œ„์กฐ ๋ถˆ๊ฐ€์ธ ๊ฒƒ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  3. ์†์„ฑ ์ •์˜ํ•˜๊ธฐ: attributes๋ฅผ definition์˜ ์†์„ฑ์œผ๋กœ target์— realm์„ ์‚ฌ์šฉํ•ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ •์  ์†์„ฑ ์ •์˜ํ•˜๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค definition์„ target์—, realm realm๊ณผ ํ•จ๊ป˜ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”:
  1. attributes๋ฅผ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉ๋ก์€ ์ •์  ์†์„ฑ ์ค‘ ๋ฉค๋ฒ„์ธ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

  2. ์†์„ฑ ์ •์˜ํ•˜๊ธฐ: attributes๋ฅผ definition์˜ ์†์„ฑ์œผ๋กœ target์— realm์„ ์‚ฌ์šฉํ•ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์œ„์กฐ ๋ถˆ๊ฐ€ ์ผ๋ฐ˜ ์†์„ฑ ์ •์˜ํ•˜๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค definition ์„ target์—, realm realm๊ณผ ํ•จ๊ป˜ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”:
  1. attributes๋ฅผ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉ๋ก์€ ์œ„์กฐ ๋ถˆ๊ฐ€ ์ผ๋ฐ˜ ์†์„ฑ ์ค‘ ๋ฉค๋ฒ„์ธ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

  2. ์†์„ฑ ์ •์˜ํ•˜๊ธฐ: attributes๋ฅผ definition์˜ ์†์„ฑ์œผ๋กœ target์— realm์„ ์‚ฌ์šฉํ•ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ์ •์˜ํ•˜๊ธฐ attributes๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค definition์˜ ์†์„ฑ์œผ๋กœ target์— realm realm์„ ์‚ฌ์šฉํ•ด ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”:
  1. ๊ฐ๊ฐ์˜ ์†์„ฑ attr์— ๋Œ€ํ•ด attributes์—์„œ:

    1. ๋งŒ์•ฝ attr๊ฐ€ realm์—์„œ ๋…ธ์ถœ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, continueํ•ฉ๋‹ˆ๋‹ค.

    2. getter๋ฅผ ์†์„ฑ getter๋ฅผ ์ƒ์„ฑํ•ด์„œ attr, definition, realm์„ ์ธ์ž๋กœ ํ•˜์—ฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. setter๋ฅผ ์†์„ฑ setter๋ฅผ ์ƒ์„ฑํ•ด์„œ attr, definition, realm์„ ์ธ์ž๋กœ ํ•˜์—ฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      ์ฐธ๊ณ : ์†์„ฑ setter ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ attr๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์ผ ๊ฒฝ์šฐ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    4. configurable๋ฅผ attr๊ฐ€ ์œ„์กฐ ๋ถˆ๊ฐ€์ด๋ฉด false๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. desc๋ฅผ PropertyDescriptor{[[Getter]]: getter, [[Setter]]: setter, [[Enumerable]]: true, [[Configurable]]: configurable}๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    6. id๋ฅผ attr์˜ ์‹๋ณ„์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    7. ! DefinePropertyOrThrow(target, id, desc)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    8. ๋งŒ์•ฝ attr์˜ ํƒ€์ž…์ด observable array type์ด๊ณ  ํƒ€์ž… ์ธ์ž๊ฐ€ T๋ผ๋ฉด, target์˜ backing observable array exotic object๋ฅผ observable array exotic object ์ƒ์„ฑํ•˜๊ธฐ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ž๋Š” realm, T, attr์˜ ์ธ๋ฑ์Šค ๊ฐ’ ์„ค์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ธ๋ฑ์Šค ๊ฐ’ ์‚ญ์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

์†์„ฑ getter๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์†์„ฑ attribute, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค target, realm realm์„ ์ธ์ž๋กœ ํ•ฉ๋‹ˆ๋‹ค:

  1. steps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์˜ ์—ฐ์†์œผ๋กœ ๋‘”๋‹ค:

    1. ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์„ ์‹œ๋„ํ•œ๋‹ค:

      1. idlObject๋ฅผ null๋กœ ๋‘”๋‹ค.

      2. target์ด ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ , attribute๊ฐ€ ์ผ๋ฐ˜ ์†์„ฑ์ด๋ผ๋ฉด:

        1. jsValue๋ฅผ this ๊ฐ’(๋‹จ, null ๋˜๋Š” undefined๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด) ์•„๋‹ˆ๋ฉด realm์˜ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๋กœ ๋‘”๋‹ค. (์ดํ›„ ๋‹จ๊ณ„์—์„œ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๊ฐ€ target์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  [LegacyLenientThis] ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด TypeError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.)

        2. jsValue๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๋ฉด, ๋ณด์•ˆ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. jsValue, attribute์˜ ์‹๋ณ„์ž, "getter"๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

        3. jsValue๊ฐ€ target์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด:

          1. attribute์— [LegacyLenientThis] ํ™•์žฅ ์†์„ฑ์ด ์ง€์ •๋˜์–ด ์žˆ์œผ๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

          2. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

        4. attribute์˜ ํƒ€์ž…์ด observable array ํƒ€์ž…๋ผ๋ฉด, jsValue์˜ backing observable array exotic object๋ฅผ attribute์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

        5. idlObject๋ฅผ jsValue์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” IDL interface ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. R์„ attribute์˜ getter ๋‹จ๊ณ„๋ฅผ idlObject๋ฅผ this๋กœ ํ•˜์—ฌ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

      4. ๋ณ€ํ™˜(converting) ๊ฒฐ๊ณผ์ธ R์„ attribute์— ์„ ์–ธ๋œ ํƒ€์ž…์˜ JavaScript ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์™ธ E๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด:

    1. attribute์˜ ํƒ€์ž…์ด promise ํƒ€์ž…์ด๋ฉด, ! Call(%Promise.reject%, %Promise%, ยซEยป)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. ๊ทธ ์™ธ์—๋Š”, ์ด ๋‹จ๊ณ„๋“ค์„ ์ข…๋ฃŒํ•˜๊ณ  ์˜ˆ์™ธ๊ฐ€ ์ „ํŒŒ๋˜๋„๋ก ํ•œ๋‹ค.

  2. name์„ "get " ๋ฌธ์ž์—ด์„ attribute์˜ ์‹๋ณ„์ž ์•ž์— ๋ถ™์ธ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

  3. F๋ฅผ CreateBuiltinFunction(steps, 0, name, ยซ ยป, realm)์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  4. F๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์†์„ฑ setter ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์†์„ฑ attribute, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค target, ๊ทธ๋ฆฌ๊ณ  realm realm์ด ์ฃผ์–ด์กŒ์„ ๋•Œ:

  1. ๋งŒ์•ฝ target์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ผ๋ฉด:

    1. ๋‹จ์–ธ: attribute๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ค.

    2. undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. ๋งŒ์•ฝ attribute๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์ด๊ณ  [LegacyLenientSetter], [PutForwards] ๋˜๋Š” [Replaceable] ํ™•์žฅ ์†์„ฑ์ด ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์†์„ฑ setter ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

  3. ๋‹จ์–ธ: attribute์˜ ํƒ€์ž…์€ promise ํƒ€์ž…์ด ์•„๋‹ˆ๋‹ค.

  4. steps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์˜ ์—ฐ์†์œผ๋กœ ๋‘”๋‹ค:

    1. V๋ฅผ undefined๋กœ ๋‘”๋‹ค.

    2. ๋งŒ์•ฝ ์ธ์ž๊ฐ€ ์ „๋‹ฌ๋˜์—ˆ๋‹ค๋ฉด, V๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ „๋‹ฌ๋œ ์ธ์ž์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. id๋ฅผ attribute์˜ ์‹๋ณ„์ž๋กœ ๋‘”๋‹ค.

    4. idlObject๋ฅผ null๋กœ ๋‘”๋‹ค.

    5. attribute๊ฐ€ ์ผ๋ฐ˜ ์†์„ฑ์ด๋ฉด:

      1. jsValue๋ฅผ this ๊ฐ’(๋‹จ, null ๋˜๋Š” undefined๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด) ์•„๋‹ˆ๋ฉด realm์˜ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๋กœ ๋‘”๋‹ค. (์ดํ›„ ๋‹จ๊ณ„์—์„œ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๊ฐ€ target์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  [LegacyLenientThis] ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด TypeError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.)

      2. jsValue๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๋ฉด, ๋ณด์•ˆ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. jsValue, id, "setter"๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

      3. validThis๋ฅผ jsValue๊ฐ€ target์„ ๊ตฌํ˜„ํ•˜๋ฉด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋กœ ๋‘”๋‹ค.

      4. validThis๊ฐ€ false์ด๊ณ  attribute์— [LegacyLenientThis] ํ™•์žฅ ์†์„ฑ์ด ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

      5. attribute๊ฐ€ [Replaceable] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด:

        1. ? CreateDataPropertyOrThrow(jsValue, id, V).

        2. undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      6. validThis๊ฐ€ false์ด๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      7. attribute๊ฐ€ [LegacyLenientSetter] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด, undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      8. attribute๊ฐ€ [PutForwards] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด:

        1. Q๋ฅผ ? Get(jsValue, id)๋กœ ๋‘”๋‹ค.

        2. Q๊ฐ€ Object๊ฐ€ ์•„๋‹ˆ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

        3. forwardId๋ฅผ [PutForwards] ํ™•์žฅ ์†์„ฑ์˜ ์‹๋ณ„์ž ์ธ์ž๋กœ ๋‘”๋‹ค.

        4. ? Set(Q, forwardId, V, false)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

        5. undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      9. idlObject๋ฅผ jsValue์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” IDL interface ํƒ€์ž… ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      10. attribute์˜ ํƒ€์ž…์ด ํƒ€์ž… ์ธ์ž T๋ฅผ ๊ฐ€์ง„ observable array ํƒ€์ž…์ด๋ฉด:

        1. newValues๋ฅผ ๋ณ€ํ™˜(converting)ํ•œ, V๋ฅผ sequence<T> ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

        2. oa๋ฅผ idlObject์˜ attribute์— ํ•ด๋‹นํ•˜๋Š” backing observable array exotic object๋กœ ๋‘”๋‹ค.

        3. Set the length๋ฅผ oa.[[ProxyHandler]]์— ๋Œ€ํ•ด 0์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

        4. i๋ฅผ 0์œผ๋กœ ๋‘”๋‹ค.

        5. i < newValues์˜ ํฌ๊ธฐ์ธ ๋™์•ˆ:

          1. oa.[[ProxyHandler]].[[SetAlgorithm]]์ด ์ œ๊ณตํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„๋ฅผ newValues[i]์™€ i๋ฅผ ์ธ์ž๋กœ ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ๋‹ค.

          2. Append newValues[i]๋ฅผ oa.[[ProxyHandler]].[[BackingList]]์— ์ถ”๊ฐ€ํ•œ๋‹ค.

        6. undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    6. idlValue๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ์ •ํ•œ๋‹ค:

      attribute์˜ ํƒ€์ž…์ด ์—ด๊ฑฐํ˜•์ธ ๊ฒฝ์šฐ
      1. S๋ฅผ ? ToString(V)๋กœ ๋‘”๋‹ค.

      2. S๊ฐ€ ์—ด๊ฑฐํ˜• ๊ฐ’๋“ค ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      3. ๊ทธ ์™ธ์—๋Š”, idlValue๋ฅผ S์™€ ๋™์ผํ•œ ์—ด๊ฑฐํ˜• ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

      ๊ทธ ์™ธ
      idlValue๋ฅผ ๋ณ€ํ™˜(converting)ํ•œ V๋ฅผ attribute์˜ ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.
    7. setter ๋‹จ๊ณ„๋ฅผ attribute์— ๋Œ€ํ•ด, idlObject๋ฅผ this, idlValue๋ฅผ ์ฃผ์–ด์ง„ ๊ฐ’์œผ๋กœ ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    8. undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. name์„ "set " ๋ฌธ์ž์—ด์„ id ์•ž์— ๋ถ™์ธ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

  6. F๋ฅผ CreateBuiltinFunction(steps, 1, name, ยซ ยป, realm)์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  7. F๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฐธ๊ณ : IDL ์†์„ฑ์—๋Š” ๋‹จ์ผ ํ”„๋กœํผํ‹ฐ๋งŒ ์žˆ์ง€๋งŒ, ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ getter์™€ setter๋Š” ํ•ด๋‹น IDL ์†์„ฑ์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ ‘๊ทผ๋œ ๊ฐ์ฒด์˜ this ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์œผ๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค๋ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ ์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—„๊ฒฉ ๋ชจ๋“œ(strict mode)์ธ์ง€์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์—„๊ฒฉ ๋ชจ๋“œ์—์„œ๋Š” ํ•ด๋‹น ํ• ๋‹น์ด TypeError ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ์—„๊ฒฉ ๋ชจ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด ํ• ๋‹น ์‹œ๋„๊ฐ€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

3.7.7. ์—ฐ์‚ฐ(Operations)

๊ฐ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ •์˜๋œ, ๋…ธ์ถœ๋œ ์—ฐ์‚ฐ์˜ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋งˆ๋‹ค ํ•ด๋‹นํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ •์  ์—ฐ์‚ฐ์€ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์—ฐ์‚ฐ์€ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, ์—ฐ์‚ฐ์ด ์œ„์กฐ ๋ถˆ๊ฐ€์ด๊ฑฐ๋‚˜, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ [Global] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋œ ๊ฒฝ์šฐ์—๋Š”, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์—ฐ์‚ฐ ์ •์˜ํ•˜๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค definition์„ target์—, realm realm๊ณผ ํ•จ๊ป˜ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”:
  1. operations๋ฅผ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉ๋ก์€ ์ผ๋ฐ˜ ์—ฐ์‚ฐ ์ค‘ ๋ฉค๋ฒ„์ธ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

  2. ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. operations์—์„œ ์—ฐ์‚ฐ ์ค‘ ์œ„์กฐ ๋ถˆ๊ฐ€์ธ ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  3. ์—ฐ์‚ฐ ์ •์˜ํ•˜๊ธฐ: operations๋ฅผ definition์˜ ์—ฐ์‚ฐ์œผ๋กœ target์— realm์„ ์‚ฌ์šฉํ•ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ •์  ์—ฐ์‚ฐ ์ •์˜ํ•˜๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค definition์„ target์—, realm realm๊ณผ ํ•จ๊ป˜ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”:
  1. operations๋ฅผ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉ๋ก์€ ์ •์  ์—ฐ์‚ฐ ์ค‘ ๋ฉค๋ฒ„์ธ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

  2. ์—ฐ์‚ฐ ์ •์˜ํ•˜๊ธฐ: operations๋ฅผ definition์˜ ์—ฐ์‚ฐ์œผ๋กœ target์— realm์„ ์‚ฌ์šฉํ•ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์œ„์กฐ ๋ถˆ๊ฐ€ ์ผ๋ฐ˜ ์—ฐ์‚ฐ ์ •์˜ํ•˜๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค definition ์„ target์—, realm realm๊ณผ ํ•จ๊ป˜ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”:
  1. operations๋ฅผ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชฉ๋ก์€ ์œ„์กฐ ๋ถˆ๊ฐ€ ์ผ๋ฐ˜ ์—ฐ์‚ฐ ์ค‘ ๋ฉค๋ฒ„์ธ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

  2. ์—ฐ์‚ฐ ์ •์˜ํ•˜๊ธฐ: operations๋ฅผ definition์˜ ์—ฐ์‚ฐ์œผ๋กœ target์— realm์„ ์‚ฌ์šฉํ•ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ์‚ฐ ์ •์˜ํ•˜๊ธฐ operations๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค definition์˜ ์—ฐ์‚ฐ์œผ๋กœ target์— realm realm์„ ์‚ฌ์šฉํ•ด ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”:
  1. ๊ฐ๊ฐ์˜ ์—ฐ์‚ฐ op์— ๋Œ€ํ•ด operations์—์„œ:

    1. ๋งŒ์•ฝ op๊ฐ€ realm์—์„œ ๋…ธ์ถœ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, continueํ•ฉ๋‹ˆ๋‹ค.

    2. method๋ฅผ ์—ฐ์‚ฐ ํ•จ์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐ์˜ ๊ฒฐ๊ณผ๋กœ op, definition, realm์„ ์ธ์ž๋กœ ํ•˜์—ฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. modifiable๋ฅผ op๊ฐ€ ์œ„์กฐ ๋ถˆ๊ฐ€์ด๋ฉด false๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. desc๋ฅผ PropertyDescriptor{[[Value]]: method, [[Writable]]: modifiable, [[Enumerable]]: true, [[Configurable]]: modifiable}๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. id๋ฅผ op์˜ ์‹๋ณ„์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    6. ! DefinePropertyOrThrow(target, id, desc)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ์‚ฐ ํ•จ์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐ ์—ฐ์‚ฐ op, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค target, realm realm์ด ์ฃผ์–ด์กŒ์„ ๋•Œ:
  1. id๋ฅผ op์˜ ์‹๋ณ„์ž๋กœ ๋‘”๋‹ค.

  2. args๋ฅผ ํ•จ์ˆ˜ ์ธ์ž๊ฐ’์œผ๋กœ ๋ฐ›์•˜์„ ๋•Œ steps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„์˜ ์—ฐ์†์œผ๋กœ ๋‘”๋‹ค:

    1. ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์„ ์‹œ๋„ํ•œ๋‹ค:

      1. idlObject๋ฅผ null๋กœ ๋‘”๋‹ค.

      2. target์ด ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ , op๊ฐ€ ์ •์  ์—ฐ์‚ฐ์ด ์•„๋‹ˆ๋ผ๋ฉด:

        1. jsValue๊ฐ€ this ๊ฐ’์ด๋ผ๋ฉด, ์ด ๊ฐ’์ด null ๋˜๋Š” undefined๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด realm์˜ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๋กœ ํ•œ๋‹ค. (์ดํ›„ ๋ช‡ ๋‹จ๊ณ„์—์„œ, ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๊ฐ€ target์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด TypeError ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.)

        2. jsValue๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๋ฉด, ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. jsValue, id, "method"๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

        3. jsValue๊ฐ€ target ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

        4. idlObject๋ฅผ jsValue์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” IDL interface ํƒ€์ž… ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. n์„ args์˜ ํฌ๊ธฐ๋กœ ๋‘”๋‹ค.

      4. ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค. ์ •๊ทœ ์—ฐ์‚ฐ(op์ด ์ •๊ทœ ์—ฐ์‚ฐ์ธ ๊ฒฝ์šฐ) ๋˜๋Š” ์ •์  ์—ฐ์‚ฐ(op์ด ์ •์  ์—ฐ์‚ฐ์ธ ๊ฒฝ์šฐ)์— ๋Œ€ํ•ด, ์‹๋ณ„์ž id์™€ target ๋ฐ ์ธ์ˆ˜ ๊ฐœ์ˆ˜ n๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ S๋กœ ๋‘”๋‹ค.

      5. <operation, values>๋ฅผ S์™€ args๋ฅผ ์˜ค๋ฒ„๋กœ๋“œ ๊ฒฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ „๋‹ฌํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

      6. R์„ null๋กœ ๋‘”๋‹ค.

      7. operation์ด [Default] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด:

        1. ๋‹จ์–ธ: operation์€ default ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค.

        2. R์„ operation์˜ default ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋ฅผ idlObject๋ฅผ this, values๋ฅผ ์ธ์ˆ˜๊ฐ’์œผ๋กœ ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      8. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, operation์˜ ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋ฅผ idlObject๋ฅผ this, values๋ฅผ ์ธ์ˆ˜๊ฐ’์œผ๋กœ ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ R๋กœ ์„ค์ •ํ•œ๋‹ค.

      9. R์„ JavaScript ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

        R์€ op์ด ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•œ IDL ๊ฐ’์ž„์„ ๊ฐ€์ •ํ•œ๋‹ค. [whatwg/webidl Issue #674]

    ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์™ธ E๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด:

    1. op์˜ ๋ฐ˜ํ™˜ ํƒ€์ž… ์ด promise ํƒ€์ž…์ธ ๊ฒฝ์šฐ, ! Call(%Promise.reject%, %Promise%, ยซEยป)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, ์ด ๋‹จ๊ณ„๋“ค์„ ์ข…๋ฃŒํ•˜๊ณ  ์˜ˆ์™ธ๊ฐ€ ์ „ํŒŒ๋˜๋„๋ก ํ•œ๋‹ค.

  3. ์˜ค๋ฒ„๋กœ๋“œ ์ง‘ํ•ฉ์„ ๊ณ„์‚ฐํ•œ๋‹ค. ์ •๊ทœ ์—ฐ์‚ฐ(op์ด ์ •๊ทœ ์—ฐ์‚ฐ์ธ ๊ฒฝ์šฐ) ๋˜๋Š” ์ •์  ์—ฐ์‚ฐ(op์ด ์ •์  ์—ฐ์‚ฐ์ธ ๊ฒฝ์šฐ)์— ๋Œ€ํ•ด ์‹๋ณ„์ž id, target, ์ธ์ˆ˜ ๊ฐœ์ˆ˜ 0์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ S๋กœ ๋‘”๋‹ค.

  4. length๋ฅผ S์˜ ์—”ํŠธ๋ฆฌ๋“ค ์ค‘ ๊ฐ€์žฅ ์งง์€ ์ธ์ˆ˜ ๋ชฉ๋ก์˜ ๊ธธ์ด๋กœ ๋‘”๋‹ค.

  5. F๋ฅผ CreateBuiltinFunction(steps, length, id, ยซ ยป, realm)์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  6. F๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.7.7.1. ๊ธฐ๋ณธ ์—ฐ์‚ฐ

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

์‹๋ณ„์ž ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„ ๋ฐ˜ํ™˜ ํƒ€์ž…
"toJSON" ๊ธฐ๋ณธ toJSON ๋‹จ๊ณ„ object

์ผ๋ฐ˜ ์—ฐ์‚ฐ์ด ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค๋ฉด, [Default] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

3.7.7.1.1. ๊ธฐ๋ณธ toJSON ์—ฐ์‚ฐ

๊ธฐ๋ณธ toJSON ๋‹จ๊ณ„๋Š” ์ธํ„ฐํŽ˜์ด์Šค I์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

  1. map์„ ์ƒˆ๋กœ์šด ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋งต์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. stack์„ ์ƒ์† ์Šคํƒ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ธํ„ฐํŽ˜์ด์Šค I์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ์ƒ์† ์Šคํƒ์˜ ์†์„ฑ ๊ฐ’ ์ˆ˜์ง‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ this, stack, map๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  4. result๋ฅผ OrdinaryObjectCreate(%Object.prototype%)์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ๊ฐ key โ†’ value์— ๋Œ€ํ•ด map์—์„œ:

    1. k๋ฅผ key ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. v๋ฅผ value ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. ! CreateDataPropertyOrThrow(result, k, v)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  6. result๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์† ์Šคํƒ์˜ ์†์„ฑ ๊ฐ’ ์ˆ˜์ง‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€, ํ”Œ๋žซํผ ๊ฐ์ฒด object, ์Šคํƒ stack, ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋งต map์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

  1. I๋ฅผ stack์—์„œ popํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ์†์„ฑ ๊ฐ’ ์ˆ˜์ง‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ object, I, map๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  3. ๋งŒ์•ฝ stack์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด, ์ƒ์† ์Šคํƒ์˜ ์†์„ฑ ๊ฐ’ ์ˆ˜์ง‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ object, stack, map๊ณผ ํ•จ๊ป˜ ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ ๊ฐ’ ์ˆ˜์ง‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ”Œ๋žซํผ ๊ฐ์ฒด object, ์ธํ„ฐํŽ˜์ด์Šค I, ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋งต map์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

  1. ๋งŒ์•ฝ I์— [Default] ํ™•์žฅ ์†์„ฑ์ด ๋ถ™์€ toJSON ์—ฐ์‚ฐ์ด ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๊ฐ ๋…ธ์ถœ๋œ ์ผ๋ฐ˜ ์†์„ฑ attr์— ๋Œ€ํ•ด, ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„๊ฐ€ I์ธ ๊ฒƒ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ:

    1. id๋ฅผ attr์˜ ์‹๋ณ„์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. value๋ฅผ getter ๋‹จ๊ณ„๋ฅผ attr์— ๋Œ€ํ•ด object๋ฅผ this๋กœ ์‚ฌ์šฉํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. ๋งŒ์•ฝ value๊ฐ€ JSON ํƒ€์ž…์ด๋ผ๋ฉด, map์— ์„ค์ •ํ•˜์—ฌ map[id]์— value๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์† ์Šคํƒ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ธํ„ฐํŽ˜์ด์Šค I์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

  1. stack์„ ์ƒˆ๋กœ์šด ์Šคํƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. stack์— pushํ•˜์—ฌ I๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.

  3. while I๊ฐ€ ์ƒ์†ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์„ ๋•Œ,

    1. I๋ฅผ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. stack์— pushํ•˜์—ฌ I๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.

  4. stack์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

toJSON ์—ฐ์‚ฐ์— [Default] ํ™•์žฅ ์†์„ฑ์ด ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ฐ˜ ์†์„ฑ๋งŒ ํฌํ•จ๋˜๋ฉฐ, ์ƒ์†๋œ ์ธํ„ฐํŽ˜์ด์Šค์— ํ•ด๋‹น ์—ฐ์‚ฐ์ด ์„ ์–ธ๋˜์—ˆ๋”๋ผ๋„ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ IDL fragment๋ฅผ ๋ณด์„ธ์š”:

[Exposed=Window]
interface A {
  [Default] object toJSON();
  attribute DOMString a;
};

[Exposed=Window]
interface B : A {
  attribute DOMString b;
};

[Exposed=Window]
interface C : B {
  [Default] object toJSON();
  attribute DOMString c;
};

์œ„์—์„œ ์ •์˜๋œ C ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์˜ toJSON() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ JSON ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค:

{
    "a": "...",
    "c": "..."
}

์œ„์—์„œ ์ •์˜๋œ A ๋˜๋Š” B ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์˜ toJSON() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด:

{
    "a": "..."
}

toJSON ์—ฐ์‚ฐ์€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ(๋˜๋Š” ๋ถ€๋ถ„ ์ธํ„ฐํŽ˜์ด์Šค)์—์„œ๋„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์›๋ž˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ IDL fragment๋ฅผ ๋ณด์„ธ์š”:

[Exposed=Window]
interface D {
  attribute DOMString d;
};

interface mixin M {
  [Default] object toJSON();
  attribute DOMString m;
};

D includes M;

์œ„์—์„œ ์ •์˜๋œ D ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์˜ toJSON() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด:

{
    "d": "...",
    "m": "..."
}

3.7.8. ๋ฌธ์ž์—ดํ™”์ž(Stringifiers)

์ธํ„ฐํŽ˜์ด์Šค์— ๋…ธ์ถœ๋œ ๋ฌธ์ž์—ดํ™”์ž(stringifier)๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง„ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.9. ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ

์ดํ„ฐ๋ ˆ์ด์…˜ ๋ฉ”์„œ๋“œ ์ •์˜ํ•˜๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค definition์„ target์—, realm realm๊ณผ ํ•จ๊ป˜ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”:
  1. ๋งŒ์•ฝ definition์— ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ getter๊ฐ€ ์žˆ๋‹ค๋ฉด:

    1. DefineMethodProperty(target, %Symbol.iterator%, %Array.prototype.values%, false)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. ๋งŒ์•ฝ definition์— ๊ฐ’ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด:

      1. ! CreateDataPropertyOrThrow(target, "entries", %Array.prototype.entries%)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      2. ! CreateDataPropertyOrThrow(target, "keys", %Array.prototype.keys%)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      3. ! CreateDataPropertyOrThrow(target, "values", %Array.prototype.values%)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      4. ! CreateDataPropertyOrThrow(target, "forEach", %Array.prototype.forEach%)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  definition์— ์Œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด:

    1. %Symbol.iterator% ๋ฐ entries ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค:

      1. steps๋ฅผ ๋‹ค์Œ ์ผ๋ จ์˜ ๋‹จ๊ณ„๋กœ ๋‘”๋‹ค:

        1. jsValue๋ฅผ ? ToObject(this ๊ฐ’)์œผ๋กœ ๋‘”๋‹ค.

        2. jsValue๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๋ฉด, ๋ณด์•ˆ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. jsValue, "%Symbol.iterator%", "method"๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

        3. jsValue๊ฐ€ definition์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

        4. definition์— ๋Œ€ํ•ด ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ๋ฐ˜๋ณต์ž ๊ฐ์ฒด(default iterator object)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. jsValue๋ฅผ target์œผ๋กœ, "key+value"๋ฅผ kind๋กœ, index๋Š” 0์œผ๋กœ ํ•œ๋‹ค.

      2. F๋ฅผ CreateBuiltinFunction(steps, 0, "entries", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

      3. DefineMethodProperty(target, %Symbol.iterator%, F, false)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

      4. ! CreateDataPropertyOrThrow(target, "entries", F)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    2. keys ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค:

      1. steps๋ฅผ ๋‹ค์Œ ์ผ๋ จ์˜ ๋‹จ๊ณ„๋กœ ๋‘”๋‹ค:

        1. jsValue๋ฅผ ? ToObject(this ๊ฐ’)์œผ๋กœ ๋‘”๋‹ค.

        2. jsValue๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๋ฉด, ๋ณด์•ˆ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. jsValue, "keys", "method"๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

        3. jsValue๊ฐ€ definition์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

        4. definition์— ๋Œ€ํ•ด ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ๋ฐ˜๋ณต์ž ๊ฐ์ฒด(default iterator object)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. jsValue๋ฅผ target์œผ๋กœ, "key"๋ฅผ kind๋กœ, index๋Š” 0์œผ๋กœ ํ•œ๋‹ค.

      2. F๋ฅผ CreateBuiltinFunction(steps, 0, "keys", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

      3. ! CreateDataPropertyOrThrow(target, "keys", F)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    3. values ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค:

      1. steps๋ฅผ ๋‹ค์Œ ์ผ๋ จ์˜ ๋‹จ๊ณ„๋กœ ๋‘”๋‹ค:

        1. jsValue๋ฅผ ? ToObject(this ๊ฐ’)์œผ๋กœ ๋‘”๋‹ค.

        2. jsValue๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๋ฉด, ๋ณด์•ˆ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. jsValue, "values", "method"๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

        3. jsValue๊ฐ€ definition์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

        4. definition์— ๋Œ€ํ•ด ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ๋ฐ˜๋ณต์ž ๊ฐ์ฒด(default iterator object)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. jsValue๋ฅผ target์œผ๋กœ, "value"๋ฅผ kind๋กœ, index๋Š” 0์œผ๋กœ ํ•œ๋‹ค.

      2. F๋ฅผ CreateBuiltinFunction(steps, 0, "values", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

      3. ! CreateDataPropertyOrThrow(target, "values", F)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    4. forEach ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค:

      1. ํ•จ์ˆ˜ ์ธ์ž๊ฐ’ callback ๋ฐ thisArg๋ฅผ ๋ฐ›์•˜์„ ๋•Œ steps๋ฅผ ๋‹ค์Œ ์ผ๋ จ์˜ ๋‹จ๊ณ„๋กœ ๋‘”๋‹ค:

        1. jsValue๋ฅผ ? ToObject(this ๊ฐ’)์œผ๋กœ ๋‘”๋‹ค.

        2. jsValue๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๋ฉด, ๋ณด์•ˆ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. jsValue, "forEach", "method"๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

        3. jsValue๊ฐ€ definition์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

        4. idlCallback๋ฅผ callback์„ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜(Function ํƒ€์ž…)ํ•œ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

        5. idlObject๋ฅผ jsValue์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” IDL interface ํƒ€์ž… ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

        6. pairs๋ฅผ idlObject์˜ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋Š” ๊ฐ’ ์Œ(value pairs to iterate over)์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋‘”๋‹ค.

        7. i๋ฅผ 0์œผ๋กœ ๋‘”๋‹ค.

        8. i < pairs์˜ ํฌ๊ธฐ์ผ ๋™์•ˆ:

          1. pair๋ฅผ pairs[i]๋กœ ๋‘”๋‹ค.

          2. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. idlCallback์— ยซ pair์˜ value, pair์˜ key, idlObject ยป ๋ฐ thisArg๋ฅผ ์ฝœ๋ฐฑ this ๊ฐ’์œผ๋กœ ํ•˜์—ฌ ํ˜ธ์ถœํ•œ๋‹ค.

          3. pairs๋ฅผ idlObject์˜ ํ˜„์žฌ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋Š” ๊ฐ’ ์Œ ๋ฆฌ์ŠคํŠธ๋กœ ๋‹ค์‹œ ์„ค์ •ํ•œ๋‹ค. (์ค‘๊ฐ„์— ๋ณ€๊ฒฝ๋  ์ˆ˜๋„ ์žˆ๋‹ค.)

          4. i๋ฅผ i + 1๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. F๋ฅผ CreateBuiltinFunction(steps, 1, "forEach", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

      3. ! CreateDataPropertyOrThrow(target, "forEach", F)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

3.7.9.1. ๊ธฐ๋ณธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด

๊ธฐ๋ณธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋Š” ์ง€์ •๋œ ์ธํ„ฐํŽ˜์ด์Šค, target, ์ดํ„ฐ๋ ˆ์ด์…˜ kind์— ๋Œ€ํ•ด [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์ธ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋Š” ์„ธ ๊ฐ€์ง€ ๋‚ด๋ถ€ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

์ฐธ๊ณ : ๊ธฐ๋ณธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋Š” ์Œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ’ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ํ˜„์žฌ ๊ฐ์ฒด์˜ ์ง€์›ํ•˜๋Š” ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋งŒ ์ดํ„ฐ๋ ˆ์ด์…˜ํ•˜๋„๋ก ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ํ‘œ์ค€ JavaScript Array ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๊ธฐ๋ณธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค ๋ฌธ์ž์—ด์„ ๊ฐ€์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค; Object.prototype.toString()์„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋ณธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์— ํ˜ธ์ถœํ•˜๋ฉด, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ํด๋ž˜์Šค ๋ฌธ์ž์—ด์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3.7.9.2. ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด

์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ์ง€์ •๋œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์Œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋ณธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

[[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์€ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—์„œ %Iterator.prototype%์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฒฐ๊ณผ๋Š” ๊ฐ’ ์Œ pair์™€ kind kind์— ๋Œ€ํ•ด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:
  1. kind ๊ฐ’์— ๋”ฐ๋ผ result๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:

    "key"
    1. idlKey๋ฅผ pair์˜ key๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. key๋ฅผ IDL to JS ๊ฐ’ ๋ณ€ํ™˜ํ•˜์—ฌ idlKey๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. result๋Š” key์ž…๋‹ˆ๋‹ค.

    "value"
    1. idlValue๋ฅผ pair์˜ value๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. value๋ฅผ IDL to JS ๊ฐ’ ๋ณ€ํ™˜ํ•˜์—ฌ idlValue๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. result๋Š” value์ž…๋‹ˆ๋‹ค.

    "key+value"
    1. idlKey๋ฅผ pair์˜ key๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. idlValue๋ฅผ pair์˜ value๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. key๋ฅผ IDL to JS ๊ฐ’ ๋ณ€ํ™˜ํ•˜์—ฌ idlKey๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. value๋ฅผ IDL to JS ๊ฐ’ ๋ณ€ํ™˜ํ•˜์—ฌ idlValue๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. array๋ฅผ ! ArrayCreate(2)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    6. ! CreateDataPropertyOrThrow(array, "0", key)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    7. ! CreateDataPropertyOrThrow(array, "1", value)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    8. result๋Š” array์ž…๋‹ˆ๋‹ค.

  2. CreateIteratorResultObject(result, false)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ์†์„ฑ์ด { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }์ธ next ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, ๊ทธ ๊ฐ’์€ ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ฐ์ฒด CreateBuiltinFunction(nextSteps, 0, "next", ยซ ยป)์ด์–ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ nextSteps๋Š” ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค:

  1. interface๋ฅผ ํ•ด๋‹น ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. thisValue๋ฅผ this ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. object๋ฅผ ? ToObject(thisValue)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. object๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด์ด๋ฉด, ๋ณด์•ˆ ๊ฒ€์‚ฌ ์ˆ˜ํ–‰์„ ๋‹ค์Œ ์ธ์ž๋กœ ํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

    • ํ”Œ๋žซํผ ๊ฐ์ฒด object,

    • ์‹๋ณ„์ž "next",

    • ํƒ€์ž… "method"

  5. object๊ฐ€ interface์˜ ๊ธฐ๋ณธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด, throw๋ฅผ ์‚ฌ์šฉํ•ด TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

  6. index๋ฅผ object์˜ index๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. kind๋ฅผ object์˜ kind๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  8. values๋ฅผ object์˜ target์˜ ์ดํ„ฐ๋ ˆ์ด์…˜ ํ•  ๊ฐ’ ์Œ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. len์„ values์˜ ๊ธธ์ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  10. index๊ฐ€ len๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด, CreateIteratorResultObject(undefined, true)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  11. pair๋ฅผ values์˜ index๋ฒˆ์งธ ์—”ํŠธ๋ฆฌ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  12. object์˜ index๋ฅผ index + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  13. ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฒฐ๊ณผ๋ฅผ pair, kind์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ง€์ •๋œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ํด๋ž˜์Šค ๋ฌธ์ž์—ด์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‹๋ณ„์ž์™€ ๋ฌธ์ž์—ด " Iterator"๋ฅผ ์—ฐ๊ฒฐํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

3.7.10. ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ด์…˜ ๋ฉ”์„œ๋“œ ์ •์˜ํ•˜๊ธฐ ์ธํ„ฐํŽ˜์ด์Šค definition ์„ target์—, realm realm๊ณผ ํ•จ๊ป˜ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”:
  1. definition์— ๋น„๋™๊ธฐ ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ์„ ์–ธ(๋‘ ์ข…๋ฅ˜ ๋ชจ๋‘ ํฌํ•จ)์ด ์—†๋‹ค๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. ๋‹จ์–ธ: definition์— ์ธ๋ฑ์Šค๋“œ ํ”„๋กœํผํ‹ฐ ๊ฒŒํ„ฐ ๋˜๋Š” iterable ์„ ์–ธ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

  3. definition์— pair ๋น„๋™๊ธฐ ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ์„ ์–ธ์ด ์žˆ๋‹ค๋ฉด, %Symbol.asyncIterator% ์™€ entries ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค:

    1. ํ•จ์ˆ˜ ์ธ์ž๊ฐ’ args๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, steps๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘”๋‹ค:

      1. jsValue๋ฅผ ? ToObject(this ๊ฐ’)์œผ๋กœ ๋‘”๋‹ค.

      2. jsValue๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๋ฉด, ๋ณด์•ˆ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. jsValue, "%Symbol.asyncIterator%", "method"๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

      3. jsValue๊ฐ€ definition์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

      4. idlObject๋ฅผ jsValue์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” IDL interface ํƒ€์ž… ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

      5. idlArgs๋ฅผ ๋น„๋™๊ธฐ ๋ฐ˜๋ณต์ž ๋ฉ”์„œ๋“œ์˜ ์ธ์ž ๋ณ€ํ™˜ ๊ฒฐ๊ณผ(args ์‚ฌ์šฉ)๋กœ ๋‘”๋‹ค.

      6. iterator๋ฅผ definition์— ๋Œ€ํ•ด ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ ๊ธฐ๋ณธ ๋น„๋™๊ธฐ ๋ฐ˜๋ณต์ž ๊ฐ์ฒด๋กœ ๋‘”๋‹ค. idlObject๋ฅผ target์œผ๋กœ, "key+value"๋ฅผ kind๋กœ, is finished๋Š” false๋กœ ๋‘”๋‹ค.

      7. definition์— ๋Œ€ํ•ด idlObject, iterator, idlArgs๋ฅผ ์ธ์ž๋กœ ํ•˜์—ฌ, ๋น„๋™๊ธฐ ๋ฐ˜๋ณต์ž ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด ์‹คํ–‰ํ•œ๋‹ค.

      8. iterator๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. F๋ฅผ CreateBuiltinFunction(steps, 0, "entries", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

    3. DefineMethodProperty(target, %Symbol.asyncIterator%, F, false)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    4. ! CreateDataPropertyOrThrow(target, "entries", F)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  4. definition์— pair ๋น„๋™๊ธฐ ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ์„ ์–ธ์ด ์žˆ๋‹ค๋ฉด, keys ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค:

    1. ํ•จ์ˆ˜ ์ธ์ž๊ฐ’ args๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, steps๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘”๋‹ค:

      1. jsValue๋ฅผ ? ToObject(this ๊ฐ’)์œผ๋กœ ๋‘”๋‹ค.

      2. jsValue๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๋ฉด, ๋ณด์•ˆ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. jsValue, "keys", "method"๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

      3. jsValue๊ฐ€ definition์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

      4. idlObject๋ฅผ jsValue์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” IDL interface ํƒ€์ž… ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

      5. idlArgs๋ฅผ ๋น„๋™๊ธฐ ๋ฐ˜๋ณต์ž ๋ฉ”์„œ๋“œ์˜ ์ธ์ž ๋ณ€ํ™˜ ๊ฒฐ๊ณผ(args ์‚ฌ์šฉ)๋กœ ๋‘”๋‹ค.

      6. iterator๋ฅผ definition์— ๋Œ€ํ•ด ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ ๊ธฐ๋ณธ ๋น„๋™๊ธฐ ๋ฐ˜๋ณต์ž ๊ฐ์ฒด๋กœ ๋‘”๋‹ค. idlObject๋ฅผ target์œผ๋กœ, "key"๋ฅผ kind๋กœ, is finished๋Š” false๋กœ ๋‘”๋‹ค.

      7. definition์— ๋Œ€ํ•ด idlObject, iterator, idlArgs๋ฅผ ์ธ์ž๋กœ ํ•˜์—ฌ, ๋น„๋™๊ธฐ ๋ฐ˜๋ณต์ž ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด ์‹คํ–‰ํ•œ๋‹ค.

      8. iterator๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. F๋ฅผ CreateBuiltinFunction(steps, 0, "keys, ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

    3. ! CreateDataPropertyOrThrow(target, "keys", F)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  5. values (๊ทธ๋ฆฌ๊ณ  ํ•„์š”์‹œ %Symbol.asyncIterator%) ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค:

    1. ํ•จ์ˆ˜ ์ธ์ž๊ฐ’ args๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, steps๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘”๋‹ค:

      1. jsValue๋ฅผ ? ToObject(this ๊ฐ’)์œผ๋กœ ๋‘”๋‹ค.

      2. jsValue๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ผ๋ฉด, ๋ณด์•ˆ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. jsValue, "values", "method"๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

      3. jsValue๊ฐ€ definition์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

      4. idlObject๋ฅผ jsValue์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” IDL interface ํƒ€์ž… ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

      5. idlArgs๋ฅผ ๋น„๋™๊ธฐ ๋ฐ˜๋ณต์ž ๋ฉ”์„œ๋“œ์˜ ์ธ์ž ๋ณ€ํ™˜ ๊ฒฐ๊ณผ(args ์‚ฌ์šฉ)๋กœ ๋‘”๋‹ค.

      6. iterator๋ฅผ definition์— ๋Œ€ํ•ด ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ ๊ธฐ๋ณธ ๋น„๋™๊ธฐ ๋ฐ˜๋ณต์ž ๊ฐ์ฒด๋กœ ๋‘”๋‹ค. idlObject๋ฅผ target์œผ๋กœ, "value"๋ฅผ kind๋กœ, is finished๋Š” false๋กœ ๋‘”๋‹ค.

      7. definition์— ๋Œ€ํ•ด idlObject, iterator, idlArgs๋ฅผ ์ธ์ž๋กœ ํ•˜์—ฌ, ๋น„๋™๊ธฐ ๋ฐ˜๋ณต์ž ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด ์‹คํ–‰ํ•œ๋‹ค.

      8. iterator๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. F๋ฅผ CreateBuiltinFunction(steps, 0, "values", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

    3. ! CreateDataPropertyOrThrow(target, "values", F)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    4. definition์— value ๋น„๋™๊ธฐ ๋ฐ˜๋ณต ๊ฐ€๋Šฅ ์„ ์–ธ์ด ์žˆ์œผ๋ฉด, ! DefineMethodProperty(target, %Symbol.asyncIterator%, F, false)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฉ”์„œ๋“œ ์ธ์ž ๋ณ€ํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€, ์ธํ„ฐํŽ˜์ด์Šค definition์ด ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์˜ ๋ชฉ๋ก args๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:
  1. idlArgs๋ฅผ ๋นˆ ๋ฆฌ์ŠคํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. argCount๋ฅผ definition์˜ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์˜ ์ธ์ž ๊ฐœ์ˆ˜๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์— ์ธ์ž ๋ฆฌ์ŠคํŠธ๊ฐ€ ์—†์œผ๋ฉด 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. i๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. i < argCount์ผ ๋™์•ˆ:

    1. ๋งŒ์•ฝ i โ‰ฅ args์˜ ํฌ๊ธฐ์ด๊ฑฐ๋‚˜, args[i]๊ฐ€ undefined์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

      1. ๋งŒ์•ฝ i๋ฒˆ์งธ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์˜ ์ธ์ž๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๊ทธ ๊ธฐ๋ณธ๊ฐ’์„ idlArgs์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, idlArgs์— "missing" ํŠน์ˆ˜ ๊ฐ’์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, idlArgs์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ECMAScript ๊ฐ’์„ ํ•ด๋‹น ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ args[i]๋ฅผ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์˜ ์ธ์ž ๋ฆฌ์ŠคํŠธ i๋ฒˆ์งธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    3. i๋ฅผ i + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. idlArgs๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

3.7.10.1. ๊ธฐ๋ณธ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด

๊ธฐ๋ณธ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋Š” ์ง€์ •๋œ ์ธํ„ฐํŽ˜์ด์Šค, target, ์ดํ„ฐ๋ ˆ์ด์…˜ kind์— ๋Œ€ํ•ด [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์ธ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

์ฐธ๊ณ : ๊ธฐ๋ณธ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค ๋ฌธ์ž์—ด์„ ๊ฐ€์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Object.prototype.toString()์„ ์ง€์ •๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋ณธ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์— ํ˜ธ์ถœํ•˜๋ฉด, ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ํด๋ž˜์Šค ๋ฌธ์ž์—ด์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3.7.10.2. ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด ๋Š” ์ง€์ •๋œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด, ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์„ ๊ฐ€์ง„ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋ณธ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์€ %AsyncIteratorPrototype%์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ์†์„ฑ์ด { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }์ธ next ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, ๊ทธ ๊ฐ’์€ ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ฐ์ฒด CreateBuiltinFunction(nextSteps, 0, "next", ยซ ยป)์ด์–ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ nextSteps๋Š” ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค:

  1. interface๋ฅผ ํ•ด๋‹น ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. thisValidationPromiseCapability๋ฅผ ! NewPromiseCapability(%Promise%)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. thisValue๋ฅผ this ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. object๋ฅผ Completion(ToObject(thisValue))๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. IfAbruptRejectPromise(object, thisValidationPromiseCapability)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  6. object๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด์ด๋ฉด ๋ณด์•ˆ ๊ฒ€์‚ฌ ์ˆ˜ํ–‰์„ ๋‹ค์Œ ์ธ์ž๋กœ ํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

    • ํ”Œ๋žซํผ ๊ฐ์ฒด object,

    • ์‹๋ณ„์ž "next",

    • ํƒ€์ž… "method"

    ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ e๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด:

    1. ! Call(thisValidationPromiseCapability.[[Reject]], undefined, ยซ e ยป)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. thisValidationPromiseCapability.[[Promise]]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  7. object๊ฐ€ interface์˜ ๊ธฐ๋ณธ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด:

    1. error๋ฅผ ์ƒˆ TypeError๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. ! Call(thisValidationPromiseCapability.[[Reject]], undefined, ยซ error ยป)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    3. thisValidationPromiseCapability.[[Promise]]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  8. nextSteps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

    1. nextPromiseCapability๋ฅผ ! NewPromiseCapability(%Promise%)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. object์˜ is finished๊ฐ€ true๋ผ๋ฉด:

      1. result๋ฅผ CreateIteratorResultObject(undefined, true)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. ! Call(nextPromiseCapability.[[Resolve]], undefined, ยซ result ยป)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      3. nextPromiseCapability.[[Promise]]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. kind๋ฅผ object์˜ kind๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. nextPromise๋ฅผ ๋‹ค์Œ ์ดํ„ฐ๋ ˆ์ด์…˜ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ object์˜ target๊ณผ object์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. fulfillSteps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. next๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:

      1. object์˜ ongoing promise ๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. next๊ฐ€ ์ดํ„ฐ๋ ˆ์ด์…˜ ์ข…๋ฃŒ๋ผ๋ฉด:

        1. object์˜ is finished๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        2. CreateIteratorResultObject(undefined, true)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

      3. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, interface์— ์Œ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ๋‹ค๋ฉด:

        1. ๋‹จ์–ธ: next๋Š” ๊ฐ’ ์Œ์ด๋‹ค.

        2. ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฒฐ๊ณผ๋ฅผ next, kind์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

      4. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

        1. ๋‹จ์–ธ: interface์— ๊ฐ’ ๋น„๋™๊ธฐ ์ดํ„ฐ๋Ÿฌ๋ธ” ์„ ์–ธ์ด ์žˆ๋‹ค.

        2. ๋‹จ์–ธ: next๋Š” ์„ ์–ธ์— ๋‚˜์˜ค๋Š” ํƒ€์ž…์˜ ๊ฐ’์ด๋‹ค.

        3. value๋ฅผ next ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        4. CreateIteratorResultObject(value, false)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    6. onFulfilled๋ฅผ CreateBuiltinFunction(fulfillSteps, 1, "", ยซ ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    7. rejectSteps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. reason์ด ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ:

      1. object์˜ ongoing promise ๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. object์˜ is finished๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      3. Throw reason์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    8. onRejected๋ฅผ CreateBuiltinFunction(rejectSteps, 1, "", ยซ ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    9. PerformPromiseThen(nextPromise, onFulfilled, onRejected, nextPromiseCapability)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    10. nextPromiseCapability.[[Promise]]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  9. ongoingPromise๋ฅผ object์˜ ongoing promise๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  10. ongoingPromise๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. afterOngoingPromiseCapability๋ฅผ ! NewPromiseCapability(%Promise%)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. onSettled๋ฅผ CreateBuiltinFunction(nextSteps, 0, "", ยซ ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. PerformPromiseThen(ongoingPromise, onSettled, onSettled, afterOngoingPromiseCapability)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    4. object์˜ ongoing promise๋ฅผ afterOngoingPromiseCapability.[[Promise]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  11. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

    1. object์˜ ongoing promise๋ฅผ nextSteps ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  12. object์˜ ongoing promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ return ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ์†์„ฑ์ด { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }์ธ return ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, ๊ทธ ๊ฐ’์€ ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ฐ์ฒด CreateBuiltinFunction(returnSteps, 1, "return", ยซ ยป)์ด์–ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ returnSteps๋Š” ํ•˜๋‚˜์˜ ์ธ์ˆ˜ value๋ฅผ ๋ฐ›๋Š” ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค:

  1. interface๋ฅผ ํ•ด๋‹น ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. returnPromiseCapability๋ฅผ ! NewPromiseCapability(%Promise%)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. thisValue๋ฅผ this ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. object๋ฅผ Completion(ToObject(thisValue))๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. IfAbruptRejectPromise(object, returnPromiseCapability)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  6. object๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด์ด๋ฉด ๋ณด์•ˆ ๊ฒ€์‚ฌ ์ˆ˜ํ–‰์„ ๋‹ค์Œ ์ธ์ž๋กœ ํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

    • ํ”Œ๋žซํผ ๊ฐ์ฒด object,

    • ์‹๋ณ„์ž "return",

    • ํƒ€์ž… "method"

    ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ e๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด:

    1. ! Call(returnPromiseCapability.[[Reject]], undefined, ยซ e ยป)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. returnPromiseCapability.[[Promise]]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  7. object๊ฐ€ interface์˜ ๊ธฐ๋ณธ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด:

    1. error๋ฅผ ์ƒˆ TypeError๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. ! Call(returnPromiseCapability.[[Reject]], undefined, ยซ error ยป)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    3. returnPromiseCapability.[[Promise]]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  8. returnSteps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

    1. returnPromiseCapability๋ฅผ ! NewPromiseCapability(%Promise%)๋กœ ๋‹ค์‹œ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. object์˜ is finished๊ฐ€ true๋ผ๋ฉด:

      1. result๋ฅผ CreateIteratorResultObject(value, true)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. ! Call(returnPromiseCapability.[[Resolve]], undefined, ยซ result ยป)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      3. returnPromiseCapability.[[Promise]]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. object์˜ is finished๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฆฌํ„ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ interface, object์˜ target, object, value๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  9. ongoingPromise๋ฅผ object์˜ ongoing promise๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  10. ongoingPromise๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. afterOngoingPromiseCapability๋ฅผ ! NewPromiseCapability(%Promise%)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. onSettled๋ฅผ CreateBuiltinFunction(returnSteps, 0, "", ยซ ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. PerformPromiseThen(ongoingPromise, onSettled, onSettled, afterOngoingPromiseCapability)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    4. object์˜ ongoing promise๋ฅผ afterOngoingPromiseCapability.[[Promise]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  11. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

    1. object์˜ ongoing promise๋ฅผ returnSteps ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  12. fulfillSteps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

    1. CreateIteratorResultObject(value, true)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  13. onFulfilled๋ฅผ CreateBuiltinFunction(fulfillSteps, 0, "", ยซ ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  14. PerformPromiseThen(object์˜ ongoing promise, onFulfilled, undefined, returnPromiseCapability)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  15. returnPromiseCapability.[[Promise]]๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ง€์ •๋œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์˜ ํด๋ž˜์Šค ๋ฌธ์ž์—ด์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‹๋ณ„์ž์™€ ๋ฌธ์ž์—ด " AsyncIterator"๋ฅผ ์—ฐ๊ฒฐํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

3.7.11. ๋งต๋ผ์ดํฌ ์„ ์–ธ

๋งŒ์•ฝ ์ธํ„ฐํŽ˜์ด์Šค A๊ฐ€ ๋งต๋ผ์ดํฌ ์„ ์–ธ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด, A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์— ์ถ”๊ฐ€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ถ”๊ฐ€ ํ”„๋กœํผํ‹ฐ๋“ค์€ ์•„๋ž˜ ํ•˜์œ„ ์„น์…˜์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

3.7.11.1. size

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” size ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.11.2. %Symbol.iterator%

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ์ด๋ฆ„์ด %Symbol.iterator% ์‹ฌ๋ฒŒ์ธ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, ์ด ํ”„๋กœํผํ‹ฐ๋Š” { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true } ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ๊ทธ ๊ฐ’์€ entries ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ธ ํ•จ์ˆ˜ ๊ฐ์ฒด์ด๋‹ค.

๋งต ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ƒ์„ฑํ•˜๊ธฐ ๋งต map๊ณผ kind (๊ฐ’: "key+value", "key", "value")๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:
  1. closure๋ฅผ ์ถ”์ƒ ํด๋กœ์ €(Abstract Closure)๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด map๊ณผ kind๋ฅผ ์บก์ฒ˜ํ•˜๋ฉฐ, ํ˜ธ์ถœ ์‹œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

    1. ๊ฐ key โ†’ value์— ๋Œ€ํ•ด map์—์„œ:

      1. key์™€ value๋ฅผ ๊ฐ๊ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

      2. kind๊ฐ€ "key"์ด๋ฉด result๋ฅผ key๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      3. ๊ทธ ์™ธ kind๊ฐ€ "value"์ด๋ฉด result๋ฅผ value๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      4. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ result๋ฅผ CreateArrayFromList(ยซ key, value ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      5. ? GeneratorYield(CreateIteratorResultObject(result, false))๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      ์ฐธ๊ณ : map์˜ ํฌ๊ธฐ์™€ ์—”ํŠธ๋ฆฌ ์ˆœ์„œ๋Š” Yield๋กœ ์ธํ•ด ์ด ์ถ”์ƒ ์—ฐ์‚ฐ์ด ์ผ์‹œ ์ค‘์ง€๋˜๋Š” ๋™์•ˆ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    2. undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. CreateIteratorFromClosure(closure, "%MapIteratorPrototype%", %MapIteratorPrototype%)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.7.11.3. entries

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” entries ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.11.4. keys

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” keys ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.11.5. values

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” values ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.11.6. forEach

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” forEach ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.11.7. get

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” get ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.11.8. has

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” has ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.11.9. set

๋งŒ์•ฝ A๊ฐ€ ์‹๋ณ„์ž "set"์„ ๊ฐ€์ง„ ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•˜๊ณ , A๊ฐ€ ์ฝ๊ธฐ-์“ฐ๊ธฐ ๋งต๋ผ์ดํฌ ์„ ์–ธ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด, A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” set ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ set ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ -0 ํ‚ค๋ฅผ +0์œผ๋กœ ๋งคํ•‘ํ•ด์•ผ ํ•˜๋ฉฐ, this๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

3.7.11.10. delete

๋งŒ์•ฝ A๊ฐ€ ์‹๋ณ„์ž "delete"๋ฅผ ๊ฐ€์ง„ ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•˜๊ณ , A๊ฐ€ ์ฝ๊ธฐ-์“ฐ๊ธฐ ๋งต๋ผ์ดํฌ ์„ ์–ธ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด, A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” delete ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ delete ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ -0 ํ‚ค๋ฅผ +0์œผ๋กœ ๋งคํ•‘ํ•ด์•ผ ํ•˜๋ฉฐ, ํ‚ค๊ฐ€ ์กด์žฌํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” boolean์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

3.7.11.11. clear

๋งŒ์•ฝ A๊ฐ€ ์‹๋ณ„์ž "clear"๋ฅผ ๊ฐ€์ง„ ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•˜๊ณ , A๊ฐ€ ์ฝ๊ธฐ-์“ฐ๊ธฐ ๋งต๋ผ์ดํฌ ์„ ์–ธ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด, A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” clear ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ clear ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ, ๋งต ์—”ํŠธ๋ฆฌ ๊ฐ์ฒด๋ฅผ (์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ ) ๋ณด์กดํ•ด์•ผ ํ•˜๋ฉฐ, undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

3.7.12. ์…‹๋ผ์ดํฌ ์„ ์–ธ

๋งŒ์•ฝ ์ธํ„ฐํŽ˜์ด์Šค A๊ฐ€ ์…‹๋ผ์ดํฌ ์„ ์–ธ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด, A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์— ์ถ”๊ฐ€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ถ”๊ฐ€ ํ”„๋กœํผํ‹ฐ๋“ค์€ ์•„๋ž˜ ํ•˜์œ„ ์„น์…˜์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

3.7.12.1. size

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” size ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.12.2. %Symbol.iterator%

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ์ด๋ฆ„์ด %Symbol.iterator% ์‹ฌ๋ฒŒ์ธ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, ์ด ํ”„๋กœํผํ‹ฐ๋Š” { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true } ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ๊ทธ ๊ฐ’์€ values ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ธ ํ•จ์ˆ˜ ๊ฐ์ฒด์ด๋‹ค.

์…‹ ์ดํ„ฐ๋ ˆ์ดํ„ฐ ์ƒ์„ฑํ•˜๊ธฐ ์…‹ set๊ณผ kind (๊ฐ’: "key+value" ๋˜๋Š” "value")๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:
  1. closure๋ฅผ ์ถ”์ƒ ํด๋กœ์ €(Abstract Closure)๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด set๊ณผ kind๋ฅผ ์บก์ฒ˜ํ•˜๋ฉฐ, ํ˜ธ์ถœ ์‹œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

    1. ๊ฐ entry์— ๋Œ€ํ•ด set์—์„œ:

      1. entry๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

      2. kind๊ฐ€ "value"์ด๋ฉด result๋ฅผ entry๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      3. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ result๋ฅผ CreateArrayFromList(ยซ entry, entry ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      4. ? GeneratorYield(CreateIteratorResultObject(result, false))๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      ์ฐธ๊ณ : set์˜ ํฌ๊ธฐ์™€ ์—”ํŠธ๋ฆฌ ์ˆœ์„œ๋Š” Yield๋กœ ์ธํ•ด ์ด ์ถ”์ƒ ์—ฐ์‚ฐ์ด ์ผ์‹œ ์ค‘์ง€๋œ ๋™์•ˆ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    2. undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. CreateIteratorFromClosure(closure, "%SetIteratorPrototype%", %SetIteratorPrototype%)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.7.12.3. entries

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” entries ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.12.4. keys

keys ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๋Š” A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์— ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ๊ทธ ๊ฐ’์€ values ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ธ ํ•จ์ˆ˜ ๊ฐ์ฒด์ด๋‹ค.

3.7.12.5. values

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” values ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.12.6. forEach

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” forEach ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.12.7. has

A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” has ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

3.7.12.8. add

๋งŒ์•ฝ A๊ฐ€ ์‹๋ณ„์ž "add"๋ฅผ ๊ฐ€์ง„ ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•˜๊ณ , A๊ฐ€ ์ฝ๊ธฐ-์“ฐ๊ธฐ ์…‹๋ผ์ดํฌ ์„ ์–ธ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด, A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” add ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ add ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ -0 ๊ฐ’์„ +0์œผ๋กœ ๋งคํ•‘ํ•ด์•ผ ํ•˜๋ฉฐ, ์„ค์ •๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

3.7.12.9. delete

๋งŒ์•ฝ A๊ฐ€ ์‹๋ณ„์ž "delete"๋ฅผ ๊ฐ€์ง„ ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•˜๊ณ , A๊ฐ€ ์ฝ๊ธฐ-์“ฐ๊ธฐ ์…‹๋ผ์ดํฌ ์„ ์–ธ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด, A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” delete ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ delete ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ -0 ๊ฐ’์„ +0์œผ๋กœ ๋งคํ•‘ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฐ’์ด ์กด์žฌํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” boolean์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

3.7.12.10. clear

๋งŒ์•ฝ A๊ฐ€ ์‹๋ณ„์ž "clear"๋ฅผ ๊ฐ€์ง„ ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•˜๊ณ , A๊ฐ€ ์ฝ๊ธฐ-์“ฐ๊ธฐ ์…‹๋ผ์ดํฌ ์„ ์–ธ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด, A์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” clear ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ clear ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ, ์„ธํŠธ ์—”ํŠธ๋ฆฌ ๊ฐ์ฒด๋ฅผ (์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ ) ๋ณด์กดํ•ด์•ผ ํ•˜๋ฉฐ, undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

3.8. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ value๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด์ž„์€ value๊ฐ€ ๊ฐ์ฒด(Object)์ด๊ณ , value๊ฐ€ [[PrimaryInterface]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ์ž…๋‹ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ value๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค interface๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ๊ฒƒ์€ value๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด์ด๊ณ , value.[[PrimaryInterface]]์˜ ํฌํ•จ๋œ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค ๋ชฉ๋ก์— interface๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ๋•Œ์ž…๋‹ˆ๋‹ค.

๋ช…์„ธ์„œ๋Š” "object๊ฐ€ interface ๊ฐ์ฒด์ด๋‹ค" ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ "object๊ฐ€ interface๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค"๋Š” ๊ฐœ๋…์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํ”Œ๋žซํผ ๊ฐ์ฒด๋Š” realm๊ณผ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๊ฐ์ฒด๋“ค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ด realm์€ ํ”Œ๋žซํผ ๊ฐ์ฒด์˜ [[Realm]] ์Šฌ๋กฏ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. Web IDL์„ ์‚ฌ์šฉํ•˜๋Š” ๋ช…์„ธ์„œ๋Š” ๊ฐ ํ”Œ๋žซํผ ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค realm(ํ˜น์€ ๊ทธ์— ๋Œ€์‘ํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด)์— ์†ํ•˜๋Š”์ง€ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ์•„๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ƒˆ ํ”Œ๋žซํผ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์€ realm์— ์—ฐ๊ด€์‹œํ‚ต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ: realm realm์—์„œ interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:
  1. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ interface, realm, undefined๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ: realm realm๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ newTarget์„ ์ „๋‹ฌ๋ฐ›์•„ interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:
  1. ๋‹จ์–ธ: interface๋Š” realm์— ๋…ธ์ถœ๋˜์–ด ์žˆ๋‹ค.

  2. newTarget์ด undefined์ด๋ฉด:

    1. prototype์„ realm์˜ interface์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

    1. ๋‹จ์–ธ: IsCallable(newTarget)๊ฐ€ true์ด๋‹ค.

    2. prototype์„ ? Get(newTarget, "prototype")์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. prototype์ด ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด:

      1. targetRealm์„ ? GetFunctionRealm(newTarget)์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. prototype์„ targetRealm์˜ interface์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. slots๋ฅผ ยซ [[Prototype]], [[Extensible]], [[Realm]], [[PrimaryInterface]] ยป๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. interface๊ฐ€ DOMException์ด๋ฉด, [[ErrorData]]๋ฅผ slots์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  6. instance๋ฅผ MakeBasicObject(slots)๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  7. instance.[[Realm]]์— realm์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  8. instance.[[PrimaryInterface]]์— interface๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  9. instance.[[Prototype]]์— prototype์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  10. interfaces๋ฅผ interface์˜ ํฌํ•จ๋œ ์ƒ์† ์ธํ„ฐํŽ˜์ด์Šค ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  11. ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค ancestor interface์— ๋Œ€ํ•ด interfaces์—์„œ:

    1. unforgeables๋ฅผ realm์˜ ancestor interface ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์˜ [[Unforgeables]] ์Šฌ๋กฏ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. keys๋ฅผ ! unforgeables.[[OwnPropertyKeys]]()์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. ๊ฐ key์— ๋Œ€ํ•ด keys์—์„œ:

      1. descriptor๋ฅผ ! unforgeables.[[GetOwnProperty]](key)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. ! DefinePropertyOrThrow(instance, key, descriptor)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  12. interface๊ฐ€ [Global] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด:

    1. ์ •๊ทœ ์—ฐ์‚ฐ ์ •์˜ํ•˜๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ interface, instance, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. ์ •๊ทœ ์†์„ฑ ์ •์˜ํ•˜๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ interface, instance, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    3. ์ดํ„ฐ๋ ˆ์ด์…˜ ๋ฉ”์„œ๋“œ ์ •์˜ํ•˜๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ interface, instance, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    4. ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ด์…˜ ๋ฉ”์„œ๋“œ ์ •์˜ํ•˜๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ interface, instance, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    5. ๊ธ€๋กœ๋ฒŒ ํ”„๋กœํผํ‹ฐ ์ฐธ์กฐ ์ •์˜ํ•˜๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ instance, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    6. instance.[[SetPrototypeOf]]๋ฅผ ยงโ€ฏ3.8.1 [[SetPrototypeOf]]์—์„œ ์ •์˜๋œ ๋Œ€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  13. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, interfaces์— ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๊ณ , ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ ์ง€์› ๋˜๋Š” ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ ์ง€์› ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด:

    1. instance.[[GetOwnProperty]]๋ฅผ ยงโ€ฏ3.9.1 [[GetOwnProperty]]์—์„œ ์ •์˜๋œ ๋Œ€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. instance.[[Set]]์„ ยงโ€ฏ3.9.2 [[Set]]์—์„œ ์ •์˜๋œ ๋Œ€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. instance.[[DefineOwnProperty]]๋ฅผ ยงโ€ฏ3.9.3 [[DefineOwnProperty]]์—์„œ ์ •์˜๋œ ๋Œ€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. instance.[[Delete]]๋ฅผ ยงโ€ฏ3.9.4 [[Delete]]์—์„œ ์ •์˜๋œ ๋Œ€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. instance.[[PreventExtensions]]๋ฅผ ยงโ€ฏ3.9.5 [[PreventExtensions]]์—์„œ ์ •์˜๋œ ๋Œ€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    6. instance.[[OwnPropertyKeys]]๋ฅผ ยงโ€ฏ3.9.6 [[OwnPropertyKeys]]์—์„œ ์ •์˜๋œ ๋Œ€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  14. instance๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€๋กœ๋ฒŒ ํ”„๋กœํผํ‹ฐ ์ฐธ์กฐ ์ •์˜ํ•˜๊ธฐ: target์— ๋Œ€ํ•ด realm realm์„ ์ „๋‹ฌ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:
  1. interfaces๋ฅผ ๋ชฉ๋ก์œผ๋กœ ํ•˜์—ฌ, realm์— ๋…ธ์ถœ๋œ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค.

  2. interfaces๋ฅผ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ interfaces์˜ ํ•ญ๋ชฉ A์™€ B์— ๋Œ€ํ•ด, A๊ฐ€ ์ƒ์†๋ฐ›์•˜๋‹ค๋ฉด, A์˜ ์ธ๋ฑ์Šค๊ฐ€ B๋ณด๋‹ค ๋†’๊ฒŒ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ฐ interface์— ๋Œ€ํ•ด interfaces์—์„œ:

    1. interface๊ฐ€ [LegacyNoInterfaceObject] ๋˜๋Š” [LegacyNamespace] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด:

      1. id๋ฅผ interface์˜ ์‹๋ณ„์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. interfaceObject๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ interface, id, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      3. DefineMethodProperty(target, id, interfaceObject, false)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      4. interface๊ฐ€ [LegacyWindowAlias] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ณ , target์ด Window ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด:

        1. ๊ฐ [LegacyWindowAlias]์˜ ์‹๋ณ„์ž๋“ค์— ํฌํ•จ๋œ ์‹๋ณ„์ž id์— ๋Œ€ํ•ด:

          1. DefineMethodProperty(target, id, interfaceObject, false)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. interface๊ฐ€ [LegacyFactoryFunction] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๋‹ค๋ฉด:

      1. ๊ฐ [LegacyFactoryFunction]์˜ ์‹๋ณ„์ž๋“ค์— ํฌํ•จ๋œ ์‹๋ณ„์ž id์— ๋Œ€ํ•ด:

        1. legacyFactoryFunction์„ ๋ ˆ๊ฑฐ์‹œ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ id, interface, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

        2. DefineMethodProperty(target, id, legacyFactoryFunction, false)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ฐ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค interface์— ๋Œ€ํ•ด, realm์— ๋…ธ์ถœ๋˜๊ณ , ์ƒ์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ:

    1. id๋ฅผ interface์˜ ์‹๋ณ„์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. interfaceObject๋ฅผ ๋ ˆ๊ฑฐ์‹œ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ interface, id, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. DefineMethodProperty(target, id, interfaceObject, false)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  5. ๊ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค namespace์— ๋Œ€ํ•ด, realm์— ๋…ธ์ถœ๋œ ๊ฒฝ์šฐ:

    1. id๋ฅผ namespace์˜ ์‹๋ณ„์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. namespaceObject๋ฅผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ namespace, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. DefineMethodProperty(target, id, namespaceObject, false)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ๊ฐ์ฒด๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ง‘ํ•ฉ์€ ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„œ๋กœ ๋‹ค๋ฅธ ํ”Œ๋žซํผ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๋”๋ผ๋„, [[PrimaryInterface]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์— ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ™์€ ์˜ค๋ฆฌ์ง„์˜ iframe์ด ์žˆ๊ณ , iframe์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฉ”์ธ ํŽ˜์ด์ง€์˜ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์š”์†Œ์— ํ˜ธ์ถœ๋˜์–ด๋„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์€ ๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ‰๊ฐ€์— ์ง์ ‘ ์ฐธ์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์ด ํฌํ•จ๋œ ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฏน์Šค์ธ์˜ ๊ฐ ๋ฉค๋ฒ„์— ๋Œ€ํ•ด ์ž์‹ ์˜ "๋ณต์‚ฌ๋ณธ"์„ ๊ฐ€์ง€๋ฉฐ, ํ•ด๋‹น operation function์€ ์ˆ˜์‹ ์ž๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฏน์Šค์ธ์„ ํฌํ•จํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ๊ฐ์ฒด์˜ ์ฃผ ์ธํ„ฐํŽ˜์ด์Šค(primary interface)๋Š” ๊ฐ์ฒด์˜ [[PrimaryInterface]] ๋‚ด๋ถ€ ์Šฌ๋กฏ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ํŒŒ์ƒ๋œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ๊ฐ์ฒด๊ฐ€ ์—ฐ๊ด€๋œ realm์€ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ ๊ฐ์ฒด์— ์—ฐ๊ด€๋œ realm์ด ๋ณ€๊ฒฝ๋˜๋ฉด, [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์€ ์ฆ‰์‹œ ํ•ด๋‹น ํ”Œ๋žซํผ ๊ฐ์ฒด์˜ ์ƒˆ realm์˜ ์ฃผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, [Global] ํ™•์žฅ ์†์„ฑ์„ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด๋Š” ๋‹ค์Œ์—์„œ ์„ ์–ธ์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค:

๋Œ€์‹  ๊ทธ ํ”„๋กœํผํ‹ฐ๋“ค์„ ๋ช…๋ นํ˜•์œผ๋กœ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3.8.1. [[SetPrototypeOf]]

[[SetPrototypeOf]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ”Œ๋žซํผ ๊ฐ์ฒด O์— ๋Œ€ํ•ด ํ˜ธ์ถœ๋˜๋ฉฐ, O๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค์— [Global] ํ™•์žฅ ์†์„ฑ์ด ์žˆ์œผ๋ฉฐ JavaScript ์–ธ์–ด ๊ฐ’ V๋กœ ํ˜ธ์ถœ๋˜๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. O์˜ ์—ฐ๊ด€๋œ realm์˜ ๊ธ€๋กœ๋ฒŒ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์ด true์ด๋ฉด, ? OrdinarySetPrototypeOf(O, V)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ? SetImmutablePrototype(O, V)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : Window ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ, WindowProxy ๊ฐ์ฒด์˜ ์กด์žฌ๋กœ ์ธํ•ด [[SetPrototypeOf]]๊ฐ€ Window ๊ฐ์ฒด์— ์ง์ ‘ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ๊ด€์ฐฐ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ๊ตฌํ˜„ ์—ฌ๋ถ€๋Š” ๊ด€์ฐฐ ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

3.9. ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด

๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ์™€ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ์— ํ•ด๋‹นํ•˜๋Š” ์ถ”๊ฐ€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ์ฒด์˜ ์‹ค์ œ own ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ, [[GetOwnProperty]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋˜์–ด ๊ฐ์ฒด์˜ own ํ”„๋กœํผํ‹ฐ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

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

ํŒŒ์ƒ๋œ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ •์˜๋œ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ getter๊ฐ€ ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ค‘ ๊ฐ€์žฅ ํŒŒ์ƒ๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋™์ž‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋กœ ์ธ๋ฑ์‹ฑํ•  ๋•Œ ํ•ด๋‹น getter๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ setter๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ€์žฅ ํŒŒ์ƒ๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ •์˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ˆ˜ ์—ฐ์‚ฐ ์ •์˜๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋“œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ O๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ค‘ ์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„๊ฐ€ ํ•ด๋‹น ์‹๋ณ„์ž๋กœ ์กด์žฌํ•˜๊ณ , ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉค๋ฒ„๊ฐ€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋“ค ์ค‘ ํ•˜๋‚˜์—์„œ ์œ„์กฐ ๋ถˆ๊ฐ€(unforgeable)์ผ ๊ฒฝ์šฐ, ํ•ด๋‹น ํ”Œ๋žซํผ ๊ฐ์ฒด O์˜ ์œ„์กฐ ๋ถˆ๊ฐ€ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ด ๋ฉ๋‹ˆ๋‹ค.

getter ์ง€์›์€ ยงโ€ฏ3.9.1 [[GetOwnProperty]]์—์„œ, setter ์ง€์›์€ ยงโ€ฏ3.9.3 [[DefineOwnProperty]] ๋ฐ ยงโ€ฏ3.9.2 [[Set]]์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด๋Š” ๋‹ค์Œ์—์„œ ์ •์˜๋œ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค:

3.9.1. [[GetOwnProperty]]

๋ชจ๋“  ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด O์˜ [[GetOwnProperty]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ P๋กœ ํ˜ธ์ถœ๋  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. ? LegacyPlatformObjectGetOwnProperty(O, P, false)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.9.2. [[Set]]

๋ชจ๋“  ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด O์˜ [[Set]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ P, ๊ฐ’ V, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ Receiver๋กœ ํ˜ธ์ถœ๋  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. O์™€ Receiver๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ผ๋ฉด:

    1. O๊ฐ€ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ setter๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , P๊ฐ€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ผ๋ฉด:

      1. ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ setter ํ˜ธ์ถœ์„ O์— P์™€ V๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      2. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. O๊ฐ€ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ setter๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , P๊ฐ€ ๋ฌธ์ž์—ด(String)์ด๋ผ๋ฉด:

      1. ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ setter ํ˜ธ์ถœ์„ O์— P์™€ V๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      2. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ownDesc๋ฅผ ? LegacyPlatformObjectGetOwnProperty(O, P, true)์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ? OrdinarySetWithOwnDescriptor(O, P, V, Receiver, ownDesc)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

3.9.3. [[DefineOwnProperty]]

๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด O์˜ [[DefineOwnProperty]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ํ”„๋กœํผํ‹ฐ ํ‚ค P์™€ ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ(Property Descriptor) Desc๋กœ ํ˜ธ์ถœ๋  ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. O๊ฐ€ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๊ณ  P๊ฐ€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ผ๋ฉด:

    1. IsDataDescriptor(Desc)์˜ ๊ฒฐ๊ณผ๊ฐ€ false๋ผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. O๊ฐ€ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ setter๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ setter ํ˜ธ์ถœ์„ O์— P์™€ Desc.[[Value]]๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    4. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. O๊ฐ€ ๋ช…๋ช…๋œ ์†์„ฑ์„ ์ง€์›ํ•˜๊ณ , O๊ฐ€ [Global] ํ™•์žฅ ์†์„ฑ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉฐ, P๊ฐ€ String์ด๊ณ , P๊ฐ€ O์˜ ์œ„์กฐ ๋ถˆ๊ฐ€๋Šฅํ•œ ์†์„ฑ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด:

    1. P๊ฐ€ ์ง€์›๋˜๋Š” ์†์„ฑ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด creating์„ true๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. O๊ฐ€ [LegacyOverrideBuiltIns] ํ™•์žฅ ์†์„ฑ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, O๊ฐ€ P๋ผ๋Š” ์ด๋ฆ„์˜ ๊ณ ์œ  ์†์„ฑ์„ ๊ฐ–์ง€ ์•Š์œผ๋ฉด:

      1. creating์ด false์ด๊ณ  O๊ฐ€ ๋ช…๋ช…๋œ ์†์„ฑ setter๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

      2. O๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋ช…๋ช…๋œ ์†์„ฑ setter๊ฐ€ ์žˆ์œผ๋ฉด:

        1. IsDataDescriptor(Desc)๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๊ฐ€ false์ด๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

        2. P์™€ Desc.[[Value]]๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ O์—์„œ ๋ช…๋ช…๋œ ์†์„ฑ setter๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

        3. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. ! OrdinaryDefineOwnProperty(O, P, Desc)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.9.4. [[Delete]]

๋ชจ๋“  ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด O์˜ [[Delete]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ์†์„ฑ ์ด๋ฆ„ P๋กœ ํ˜ธ์ถœ๋  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. O๊ฐ€ ์ธ๋ฑ์Šค ์†์„ฑ์„ ์ง€์›ํ•˜๊ณ  P๊ฐ€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์ด๋ฉด:

    1. index๋ฅผ ! ToUint32(P)๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. index๊ฐ€ ์ง€์›๋˜๋Š” ์†์„ฑ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹ˆ๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. O๊ฐ€ ๋ช…๋ช…๋œ ์†์„ฑ์„ ์ง€์›ํ•˜๊ณ , O๊ฐ€ [Global] ํ™•์žฅ ์†์„ฑ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์†์„ฑ ์ด๋ฆ„ P์™€ ๊ฐ์ฒด O๋กœ ๋ช…๋ช…๋œ ์†์„ฑ ๊ฐ€์‹œ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๊ฐ€ true์ด๋ฉด:

    1. O๊ฐ€ ๋ช…๋ช…๋œ ์†์„ฑ ์‚ญ์ œ์ž๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. operation์„ ๋ช…๋ช…๋œ ์†์„ฑ ์‚ญ์ œ์ž๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ์—ฐ์‚ฐ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    3. operation์ด ์‹๋ณ„์ž ์—†์ด ์ •์˜๋˜์—ˆ๋‹ค๋ฉด:

      1. ์ธํ„ฐํŽ˜์ด์Šค ์„ค๋ช…์— ๋‚˜์—ด๋œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ธฐ์กด ๋ช…๋ช…๋œ ์†์„ฑ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ P๋ฅผ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

      2. ๋‹จ๊ณ„์—์„œ ์‚ญ์ œ๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค๊ณ  ๋‚˜ํƒ€๋‚ด๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, operation์€ ์‹๋ณ„์ž์™€ ํ•จ๊ป˜ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

      1. operation์˜ ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋˜, O๋ฅผ this๋กœ, ยซ P ยป๋ฅผ ์ธ์ˆ˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

      2. operation์ด ๋ฐ˜ํ™˜ ํƒ€์ž…์„ boolean์œผ๋กœ ์„ ์–ธํ–ˆ๊ณ  ๋‹จ๊ณ„๊ฐ€ false๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    5. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. O์— ์ด๋ฆ„์ด P์ธ ๊ณ ์œ  ์†์„ฑ์ด ์žˆ์œผ๋ฉด:

    1. ์†์„ฑ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์œผ๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, O์—์„œ ํ•ด๋‹น ์†์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  4. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.9.5. [[PreventExtensions]]

๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด์˜ [[PreventExtensions]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด๊ฐ€ [[PreventExtensions]]๊ฐ€ ์‹คํŒจํ•˜๋„๋ก ๋งŒ๋“ค์–ด ๊ณ„์† ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

3.9.6. [[OwnPropertyKeys]]

์ด ๋ฌธ์„œ๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ (๋˜๋Š” ์˜ˆ์™ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”Œ๋žซํผ ๊ฐ์ฒด์— ๋Œ€ํ•ด) ์ „์ฒด ํ”„๋กœํผํ‹ฐ ์—ด๊ฑฐ ์ˆœ์„œ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด [[OwnPropertyKeys]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ ๊ฐ์ฒด O์˜ [[OwnPropertyKeys]] ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. keys๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ String๊ณผ Symbol ๊ฐ’์˜ ๋นˆ ๋ชฉ๋ก์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. O๊ฐ€ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋ฉด, ๊ฐ O์˜ ์ง€์›๋˜๋Š” ํ”„๋กœํผํ‹ฐ ์ธ๋ฑ์Šค index์— ๋Œ€ํ•ด, ์ˆซ์ž ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ append ! ToString(index)์„ keys์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  3. O๊ฐ€ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋ฉด, ๊ฐ O์˜ ์ง€์›๋˜๋Š” ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ P ์ค‘ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ ๊ฐ€์‹œ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ visibleํ•œ ๊ฒƒ์— ๋Œ€ํ•ด, append P๋ฅผ keys์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ฐ O์˜ own ํ”„๋กœํผํ‹ฐ ํ‚ค ์ค‘ String ํƒ€์ž… P์— ๋Œ€ํ•ด, ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ ์‹œ๊ฐ„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ append P๋ฅผ keys์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  5. ๊ฐ O์˜ own ํ”„๋กœํผํ‹ฐ ํ‚ค ์ค‘ Symbol ํƒ€์ž… P์— ๋Œ€ํ•ด, ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ ์‹œ๊ฐ„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ append P๋ฅผ keys์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  6. ๋‹จ์–ธ: keys์—๋Š” ์ค‘๋ณต ํ•ญ๋ชฉ์ด ์—†๋‹ค.

  7. keys๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.9.7. ์ถ”์ƒ ์—ฐ์‚ฐ

ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ P๊ฐ€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์ธ์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด, ๋‹ค์Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•œ๋‹ค:

  1. P๊ฐ€ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. index๋ฅผ CanonicalNumericIndexString(P)์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. index๊ฐ€ undefined์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. IsInteger(index)๊ฐ€ false์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. index๊ฐ€ โˆ’0์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. index < 0์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  7. index โ‰ฅ 232 โˆ’ 1์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐธ๊ณ : 232 โˆ’ 1์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ ๋ฐฐ์—ด ๊ธธ์ด์ž…๋‹ˆ๋‹ค.

  8. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ช…๋œ ์†์„ฑ ๊ฐ€์‹œ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฃผ์–ด์ง„ ๋ช…๋ช…๋œ ์†์„ฑ์ด ๊ฐ์ฒด์— ๋…ธ์ถœ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ช…๋ช…๋œ ์†์„ฑ์€ [LegacyOverrideBuiltIns] ํ™•์žฅ ์†์„ฑ์ด ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๊ฐ์ฒด์— ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์†์„ฑ ์ด๋ฆ„ P์™€ ๊ฐ์ฒด O๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

  1. P๊ฐ€ O์˜ ์ง€์›๋˜๋Š” ์†์„ฑ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. O์— ์ด๋ฆ„์ด P์ธ ๊ณ ์œ  ์†์„ฑ์ด ์žˆ์œผ๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

  3. O๊ฐ€ [LegacyOverrideBuiltIns] ํ™•์žฅ ์†์„ฑ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. prototype์„ O.[[GetPrototypeOf]]()๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. prototype์ด null์ด ์•„๋‹Œ ๋™์•ˆ:

    1. prototype์ด ๋ช…๋ช…๋œ ์†์„ฑ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๊ณ , prototype์— ์ด๋ฆ„์ด P์ธ ๊ณ ์œ  ์†์„ฑ์ด ์žˆ์œผ๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. prototype์„ prototype.[[GetPrototypeOf]]()๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํ•ด์„ ์ˆœ์„œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค:

  1. ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ.

  2. own ํ”„๋กœํผํ‹ฐ(์œ„์กฐ ๋ถˆ๊ฐ€ ์†์„ฑ๊ณผ ์—ฐ์‚ฐ ํฌํ•จ).

  3. [LegacyOverrideBuiltIns]์ด ์ง€์ •๋œ ๊ฒฝ์šฐ:

    1. ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ.

    2. ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์—์„œ ์˜ค๋Š” ํ”„๋กœํผํ‹ฐ.

  4. [LegacyOverrideBuiltIns]์ด ์—†๋Š” ๊ฒฝ์šฐ:

    1. ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์—์„œ ์˜ค๋Š” ํ”„๋กœํผํ‹ฐ.

    2. ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ.

ํ”Œ๋žซํผ ๊ฐ์ฒด O์—์„œ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ P์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋กœ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ setter ํ˜ธ์ถœ์„ ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. index๋ฅผ ? ToUint32(P)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. index๊ฐ€ ์ง€์›๋˜๋Š” ํ”„๋กœํผํ‹ฐ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹ˆ๋ฉด creating์„ true๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. operation์„ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ setter๋ฅผ ์„ ์–ธํ•œ operation์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. T๋ฅผ operation์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž์˜ ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. value๋ฅผ V๋ฅผ T ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. operation์ด ์‹๋ณ„์ž ์—†์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด:

    1. creating์ด true์ด๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ์„ค๋ช…์— ๋”ฐ๋ผ ์ƒˆ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์„ค์ • ๋‹จ๊ณ„(์ธ๋ฑ์Šค index, ๊ฐ’ value)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ(creating์ด false) ์ธํ„ฐํŽ˜์ด์Šค ์„ค๋ช…์— ๋”ฐ๋ผ ๊ธฐ์กด ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์„ค์ • ๋‹จ๊ณ„(์ธ๋ฑ์Šค index, ๊ฐ’ value)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  7. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, operation์ด ์‹๋ณ„์ž์™€ ํ•จ๊ป˜ ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋ฅผ operation์— ๋Œ€ํ•ด O๋ฅผ this๋กœ, ์ธ์ž๊ฐ’ ยซ index, value ยป๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ๊ฐ์ฒด O์—์„œ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ P์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ V๋กœ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ setter ํ˜ธ์ถœ์„ ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. creating์„ P๊ฐ€ ์ง€์›๋˜๋Š” ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด true๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. operation์„ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ setter๋ฅผ ์„ ์–ธํ•œ operation์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. T๋ฅผ operation์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž์˜ ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. value๋ฅผ V๋ฅผ T ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. operation์ด ์‹๋ณ„์ž ์—†์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด:

    1. creating์ด true์ด๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ์„ค๋ช…์— ๋”ฐ๋ผ ์ƒˆ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์„ค์ • ๋‹จ๊ณ„(P, value)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ(creating์ด false) ์ธํ„ฐํŽ˜์ด์Šค ์„ค๋ช…์— ๋”ฐ๋ผ ๊ธฐ์กด ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์„ค์ • ๋‹จ๊ณ„(P, value)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  6. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, operation์ด ์‹๋ณ„์ž์™€ ํ•จ๊ป˜ ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋ฅผ operation์— ๋Œ€ํ•ด O๋ฅผ this๋กœ, ์ธ์ž๊ฐ’ ยซ P, value ยป๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

LegacyPlatformObjectGetOwnProperty ์ถ”์ƒ ์—ฐ์‚ฐ์€ ๊ฐ์ฒด O, ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ P, ๋ถˆ๋ฆฌ์–ธ ignoreNamedProps ๊ฐ’์„ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. O๊ฐ€ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๊ณ , P๊ฐ€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ผ๋ฉด:

    1. index๋ฅผ ! ToUint32(P)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. index๊ฐ€ ์ง€์›๋˜๋Š” ํ”„๋กœํผํ‹ฐ ์ธ๋ฑ์Šค๋ผ๋ฉด:

      1. operation์„ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ getter๋ฅผ ์„ ์–ธํ•œ operation์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. value๋ฅผ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      3. operation์ด ์‹๋ณ„์ž ์—†์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด value๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๋ช…์— ๋”ฐ๋ผ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ ๊ฐ’ ๊ฒฐ์ •(index)์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      4. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, operation์ด ์‹๋ณ„์ž์™€ ํ•จ๊ป˜ ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด value๋ฅผ ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋ฅผ operation์— ๋Œ€ํ•ด O๋ฅผ this๋กœ, ์ธ์ž๊ฐ’ ยซ index ยป๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      5. desc๋ฅผ ํ•„๋“œ๊ฐ€ ์—†๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ(Property Descriptor)๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      6. desc.[[Value]]๋ฅผ value๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      7. O๊ฐ€ ์ธ๋ฑ์Šค ํ”„๋กœํผํ‹ฐ setter๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด desc.[[Writable]]์„ true๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      8. desc.[[Enumerable]] ๋ฐ desc.[[Configurable]]์„ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      9. desc๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. ignoreNamedProps๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. O๊ฐ€ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜๊ณ , ignoreNamedProps๊ฐ€ false์ด๋ฉด:

    1. ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ ๊ฐ€์‹œ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ P์™€ ๊ฐ์ฒด O๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ true์ด๋ฉด:

      1. operation์„ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ getter๋ฅผ ์„ ์–ธํ•œ operation์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      2. value๋ฅผ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      3. operation์ด ์‹๋ณ„์ž ์—†์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด value๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๋ช…์— ๋”ฐ๋ผ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ๊ฒฐ์ •(P)์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      4. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, operation์ด ์‹๋ณ„์ž์™€ ํ•จ๊ป˜ ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด value๋ฅผ ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋ฅผ operation์— ๋Œ€ํ•ด O๋ฅผ this๋กœ, ์ธ์ž๊ฐ’ ยซ P ยป๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      5. desc๋ฅผ ํ•„๋“œ๊ฐ€ ์—†๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ ๋””์Šคํฌ๋ฆฝํ„ฐ(Property Descriptor)๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      6. desc.[[Value]]๋ฅผ value๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      7. O๊ฐ€ ์ด๋ฆ„ ํ”„๋กœํผํ‹ฐ setter๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด desc.[[Writable]]์„ true๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      8. O๊ฐ€ [LegacyUnenumerableNamedProperties] ํ™•์žฅ ์†์„ฑ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด desc.[[Enumerable]]์„ false๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      9. desc.[[Configurable]]์„ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      10. desc๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. OrdinaryGetOwnProperty(O, P)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.10. ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด

๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ”„๋ก์‹œ(Proxy) ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์˜ ํ•œ ์ข…๋ฅ˜๋กœ, ์ด ์ ˆ์—์„œ ์ •์˜๋œ ํ”„๋ก์‹œ ํŠธ๋žฉ์„ ์‚ฌ์šฉํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ช…์„ธ๋Š” ํ”„๋ก์‹œ ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด๊ฐ€ Array ์ธ์Šคํ„ด์Šค๋ฅผ ํ”„๋ก์‹œ ๋Œ€์ƒ์œผ๋กœ ๊ฐ€์งˆ ๋•Œ ํŠน๋ณ„ ์ฒ˜๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋ฏ€๋กœ, ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ํƒ€์ž…์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์— ์ด๋Ÿฌํ•œ ํŠน๋ณ„ ์ฒ˜๋ฆฌ๊ฐ€ ์œ ์ง€๋œ ์ฑ„ ๋…ธ์ถœ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ ‡๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์˜ ํ”„๋ก์‹œ ํŠธ๋žฉ์€ ์ผ๋ฐ˜ Array ์ธ์Šคํ„ด์Šค์˜ ๋ถˆ๋ณ€์„ฑ ์™ธ์—๋„ ๋‹ค์Œ์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค:

๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ: realm realm์—์„œ Web IDL ํƒ€์ž… T์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ setAlgorithm, deleteAlgorithm์ด ์ฃผ์–ด์กŒ์„ ๋•Œ:
  1. innerArray๋ฅผ ! ArrayCreate(0)์œผ๋กœ ๋‘”๋‹ค.

  2. handler๋ฅผ OrdinaryObjectCreate(null, ยซ [[Type]], [[SetAlgorithm]], [[DeleteAlgorithm]], [[BackingList]] ยป)๋กœ ๋‘”๋‹ค.

  3. handler.[[Type]]์„ T๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. handler.[[SetAlgorithm]]์„ setAlgorithm์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. handler.[[DeleteAlgorithm]]์„ deleteAlgorithm์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  6. defineProperty๋ฅผ CreateBuiltinFunction(ยงโ€ฏ3.10.1 defineProperty์˜ ๋‹จ๊ณ„, 3, "", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

  7. ! CreateDataPropertyOrThrow(handler, "defineProperty", defineProperty)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  8. deleteProperty๋ฅผ CreateBuiltinFunction(ยงโ€ฏ3.10.2 deleteProperty์˜ ๋‹จ๊ณ„, 2, "", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

  9. ! CreateDataPropertyOrThrow(handler, "deleteProperty", deleteProperty)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  10. get์„ CreateBuiltinFunction(ยงโ€ฏ3.10.3 get์˜ ๋‹จ๊ณ„, 3, "", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

  11. ! CreateDataPropertyOrThrow(handler, "get", get)์„ ์‹คํ–‰ํ•œ๋‹ค.

  12. getOwnPropertyDescriptor๋ฅผ CreateBuiltinFunction(ยงโ€ฏ3.10.4 getOwnPropertyDescriptor์˜ ๋‹จ๊ณ„, 2, "", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

  13. ! CreateDataPropertyOrThrow(handler, "getOwnPropertyDescriptor", getOwnPropertyDescriptor)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  14. has๋ฅผ CreateBuiltinFunction(ยงโ€ฏ3.10.5 has์˜ ๋‹จ๊ณ„, 2, "", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

  15. ! CreateDataPropertyOrThrow(handler, "has", has)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  16. ownKeys๋ฅผ CreateBuiltinFunction(ยงโ€ฏ3.10.6 ownKeys์˜ ๋‹จ๊ณ„, 1, "", ยซ ยป, realm)๋กœ ๋‘”๋‹ค.

  17. ! CreateDataPropertyOrThrow(handler, "ownKeys", ownKeys)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  18. preventExtensions๋ฅผ CreateBuiltinFunction(ยงโ€ฏ3.10.7 preventExtensions์˜ ๋‹จ๊ณ„, ยซ ยป, 0, "", realm)๋กœ ๋‘”๋‹ค.

  19. ! CreateDataPropertyOrThrow(handler, "preventExtensions", preventExtensions)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  20. set์„ CreateBuiltinFunction(ยงโ€ฏ3.10.8 set์˜ ๋‹จ๊ณ„, ยซ ยป, 4, "", realm)๋กœ ๋‘”๋‹ค.

  21. ! CreateDataPropertyOrThrow(handler, "set", set)์„ ์‹คํ–‰ํ•œ๋‹ค.

  22. ! ProxyCreate(innerArray, handler)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.10.1. defineProperty

defineProperty ํ”„๋ก์‹œ ํŠธ๋žฉ์˜ ๋‹จ๊ณ„(๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์— ๋Œ€ํ•ด, O, P, descriptorObj๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ):
  1. handler๋ฅผ this ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. descriptor๋ฅผ ! ToPropertyDescriptor(descriptorObj)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. P๊ฐ€ "length"์ด๋ฉด:

    1. IsAccessorDescriptor(descriptor) ๊ฐ’์ด true์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. descriptor.[[Configurable]]๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ฐ’์ด true์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. descriptor.[[Enumerable]]๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ฐ’์ด true์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    4. descriptor.[[Writable]]๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ฐ’์ด false์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    5. descriptor.[[Value]]๊ฐ€ ์กด์žฌํ•˜๋ฉด ๊ธธ์ด ์„ค์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ handler, descriptor.[[Value]]๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    6. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. P๊ฐ€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์ด๋ฉด:

    1. IsAccessorDescriptor(descriptor) ๊ฐ’์ด true์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. descriptor.[[Configurable]]๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ฐ’์ด false์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. descriptor.[[Enumerable]]๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ฐ’์ด false์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    4. descriptor.[[Writable]]๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ฐ’์ด false์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    5. descriptor.[[Value]]๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ธ๋ฑ์Šค ๊ฐ’ ์„ค์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ handler, P, descriptor.[[Value]]๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    6. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. ? O.[[DefineOwnProperty]](P, descriptor)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.10.2. deleteProperty

deleteProperty ํ”„๋ก์‹œ ํŠธ๋žฉ์˜ ๋‹จ๊ณ„(๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์— ๋Œ€ํ•ด, O, P๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ):
  1. handler๋ฅผ this ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. P๊ฐ€ "length"์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. P๊ฐ€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์ด๋ฉด:

    1. oldLen์„ handler.[[BackingList]]์˜ ํฌ๊ธฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. index๋ฅผ ! ToUint32(P)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. index โ‰  oldLen โˆ’ 1์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    4. handler.[[DeleteAlgorithm]] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„๋ฅผ handler.[[BackingList]][index]์™€ index๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    5. handler.[[BackingList]]์˜ ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    6. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. ? O.[[Delete]](P)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.10.3. get

get ํ”„๋ก์‹œ ํŠธ๋žฉ์˜ ๋‹จ๊ณ„(๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์— ๋Œ€ํ•ด, O, P, Receiver๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ):
  1. handler๋ฅผ this ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. length๋ฅผ handler.[[BackingList]]์˜ ํฌ๊ธฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. P๊ฐ€ "length"์ด๋ฉด length๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. P๊ฐ€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์ด๋ฉด:

    1. index๋ฅผ ! ToUint32(P)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. index โ‰ฅ length์ด๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. jsValue๋ฅผ ๋ณ€ํ™˜ ํ•˜์—ฌ ์–ป์€ handler.[[BackingList]][index]์˜ JavaScript ๊ฐ’์œผ๋กœ ํ•œ๋‹ค.

    4. ์œ„ ๋‹จ๊ณ„๋Š” ์ ˆ๋Œ€ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    5. jsValue๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. ? O.[[Get]](P, Receiver)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.10.4. getOwnPropertyDescriptor

getOwnPropertyDescriptor ํ”„๋ก์‹œ ํŠธ๋žฉ์˜ ๋‹จ๊ณ„(๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์— ๋Œ€ํ•ด, O, P๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ):
  1. handler๋ฅผ this ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. length๋ฅผ handler.[[BackingList]]์˜ ํฌ๊ธฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. P๊ฐ€ "length"์ด๋ฉด ! FromPropertyDescriptor(PropertyDescriptor{[[Configurable]]: false, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: length })๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. P๊ฐ€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์ด๋ฉด

    1. index๋ฅผ ! ToUint32(P)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. index โ‰ฅ length์ด๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. jsValue๋ฅผ ๋ณ€ํ™˜ ํ•˜์—ฌ ์–ป์€ handler.[[BackingList]][index]์˜ JavaScript ๊ฐ’์œผ๋กœ ํ•œ๋‹ค.

    4. ์œ„ ๋‹จ๊ณ„๋Š” ์ ˆ๋Œ€ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    5. FromPropertyDescriptor(PropertyDescriptor{[[Configurable]]: true, [[Enumerable]]: true, [[Writable]]: true, [[Value]]: jsValue })๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. FromPropertyDescriptor(? O.[[GetOwnProperty]](P))๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.10.5. has

has ํ”„๋ก์‹œ ํŠธ๋žฉ์˜ ๋‹จ๊ณ„(๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์— ๋Œ€ํ•ด, O, P๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ):
  1. handler๋ฅผ this ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. P๊ฐ€ "length"์ด๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. P๊ฐ€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์ด๋ฉด:

    1. index๋ฅผ ! ToUint32(P)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. index๊ฐ€ handler.[[BackingList]]์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. ? O.[[HasProperty]](P)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.10.6. ownKeys

ownKeys ํ”„๋ก์‹œ ํŠธ๋žฉ์˜ ๋‹จ๊ณ„(๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์— ๋Œ€ํ•ด, O๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ):
  1. handler๋ฅผ this ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. length๋ฅผ handler.[[BackingList]]์˜ ํฌ๊ธฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. keys๋ฅผ ๋นˆ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. i๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. While i < length ๋™์•ˆ:

    1. keys์— ! ToString(i)๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    2. i๋ฅผ i + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. keys์— ! O.[[OwnPropertyKeys]]()๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

  7. CreateArrayFromList(keys)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.10.7. preventExtensions

preventExtensions ํ”„๋ก์‹œ ํŠธ๋žฉ์˜ ๋‹จ๊ณ„(๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์— ๋Œ€ํ•ด):
  1. false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.10.8. set

set ํ”„๋ก์‹œ ํŠธ๋žฉ์˜ ๋‹จ๊ณ„(๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์— ๋Œ€ํ•ด, O, P, V, Receiver๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ):
  1. handler๋ฅผ this ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. P๊ฐ€ "length"์ด๋ฉด ๊ธธ์ด ์„ค์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ handler, V๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. P๊ฐ€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค์ด๋ฉด ์ธ๋ฑ์Šค ๊ฐ’ ์„ค์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ handler, P, V๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. ? O.[[Set]](P, V, Receiver)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.10.9. ์ถ”์ƒ ์—ฐ์‚ฐ

๊ธธ์ด ์„ค์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜(๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์˜ handler์™€ newLen์ด ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ):
  1. uint32Len์„ ? ToUint32(newLen)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. numberLen์„ ? ToNumber(newLen)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. uint32Len โ‰  numberLen์ด๋ฉด RangeError ์˜ˆ์™ธ๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  4. oldLen์„ handler.[[BackingList]]์˜ ํฌ๊ธฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. uint32Len > oldLen์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. indexToDelete๋ฅผ oldLen โˆ’ 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. While indexToDelete โ‰ฅ uint32Len ๋™์•ˆ:

    1. handler.[[DeleteAlgorithm]] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„๋ฅผ handler.[[BackingList]][indexToDelete]์™€ indexToDelete๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. handler.[[BackingList]]์˜ ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    3. indexToDelete๋ฅผ indexToDelete โˆ’ 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  8. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค ๊ฐ’ ์„ค์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜(๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด ์ด๊ทธ์กฐํ‹ฑ ๊ฐ์ฒด์˜ handler, P, V๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ):
  1. oldLen์„ handler.[[BackingList]]์˜ ํฌ๊ธฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. index๋ฅผ ! ToUint32(P)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. index > oldLen์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. idlValue๋ฅผ V๋ฅผ handler.[[Type]] ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. index < oldLen์ด๋ฉด:

    1. handler.[[DeleteAlgorithm]] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„๋ฅผ handler.[[BackingList]][index]์™€ index๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  6. handler.[[SetAlgorithm]] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„๋ฅผ idlValue์™€ index๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  7. index = oldLen์ด๋ฉด idlValue๋ฅผ handler.[[BackingList]]์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  8. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, handler.[[BackingList]][index]๋ฅผ idlValue๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  9. true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.11. ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค

ยงโ€ฏ2.12 ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ž„์˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๊ฒฝ์šฐ๋“ค์€ ์ฃผ์–ด์ง„ ๊ฐ์ฒด์—์„œ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค:

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋Š” ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๊ธฐ ์œ„ํ•ด ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ์ƒ์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Web IDL ์ธ์ž ๋ฆฌ์ŠคํŠธ๋ž€ ๊ฐ ๊ฐ’์ด IDL ๊ฐ’์ด๊ฑฐ๋‚˜ โ€œ๋ˆ„๋ฝ(missing)โ€์ด๋ผ๋Š” ํŠน์ˆ˜ ๊ฐ’(์„ ํƒ์  ์ธ์ž๊ฐ€ ๋ˆ„๋ฝ๋จ์„ ๋‚˜ํƒ€๋ƒ„)์ธ ๊ฐ’ ๋ชฉ๋ก(list)์ž…๋‹ˆ๋‹ค.

Web IDL ์ธ์ž ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ธ์ž ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ: Web IDL ์ธ์ž ๋ฆฌ์ŠคํŠธ args๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:
  1. jsArgs๋ฅผ ๋นˆ ๋ชฉ๋ก์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. i๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. count๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. i < args์˜ ํฌ๊ธฐ์ธ ๋™์•ˆ:

    1. args[i]๊ฐ€ ํŠน์ˆ˜ ๊ฐ’ โ€œmissingโ€์ด๋ฉด, jsArgs์— undefined๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, args[i]๋Š” IDL ๊ฐ’์ž…๋‹ˆ๋‹ค:

      1. convertResult๋ฅผ args[i]๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์‹œ throwํ•ฉ๋‹ˆ๋‹ค.

      2. convertResult๋ฅผ jsArgs์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      3. count๋ฅผ i + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. i๋ฅผ i + 1๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. jsArgs๋ฅผ count ๊ฐœ์˜ ํ•ญ๋ชฉ๋งŒ ๋‚จ๋„๋ก ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค.

  6. jsArgs๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๊ฐ์ฒด์˜ ์—ฐ์‚ฐ ํ˜ธ์ถœํ•˜๊ธฐ: ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ’ value, ์—ฐ์‚ฐ ์ด๋ฆ„ opName, Web IDL ์ธ์ž ๋ฆฌ์ŠคํŠธ args, ์„ ํƒ์  ์ฝœ๋ฐฑ this ๊ฐ’ thisArg๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์˜ˆ์™ธ๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  1. completion์„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. thisArg๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด thisArg๋ฅผ undefined๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. O๋ฅผ value์— ํ•ด๋‹นํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. realm์„ O์˜ ์—ฐ๊ฒฐ๋œ realm์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. relevant settings๋ฅผ realm์˜ ์„ค์ • ๊ฐ์ฒด(settings object)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. stored settings๋ฅผ value์˜ ์ฝœ๋ฐฑ ์ปจํ…์ŠคํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ค€๋น„๋ฅผ relevant settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  8. ์ฝœ๋ฐฑ ์‹คํ–‰ ์ค€๋น„๋ฅผ stored settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  9. X๋ฅผ O๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  10. IsCallable(O)๊ฐ€ false์ด๋ฉด:

    1. getResult๋ฅผ Completion(Get(O, opName))๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. getResult๊ฐ€ ๋น„์ •์ƒ ์™„๋ฃŒ(abrupt completion)์ด๋ฉด, completion์— getResult๋ฅผ ํ• ๋‹นํ•˜๊ณ  return ๋‹จ๊ณ„๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.

    3. X๋ฅผ getResult.[[Value]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    4. IsCallable(X)๊ฐ€ false์ด๋ฉด, completion์„ Completion Record { [[Type]]: throw, [[Value]]: ์ƒˆ๋กœ ์ƒ์„ฑ๋œ TypeError ๊ฐ์ฒด, [[Target]]: ๋นˆ ๊ฐ’ }๋กœ ์„ค์ •ํ•˜๊ณ  return ๋‹จ๊ณ„๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.

    5. thisArg๋ฅผ O๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(์ฃผ์–ด์ง„ ๊ฐ’์„ ๋ฎ์–ด์”€).

  11. jsArgs๋ฅผ args๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ธ์ž ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์ค‘ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ, completion์„ ์˜ˆ์™ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” completion ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ณ  return ๋‹จ๊ณ„๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.

  12. callResult๋ฅผ Completion(Call(X, thisArg, jsArgs))๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  13. callResult๊ฐ€ ๋น„์ •์ƒ ์™„๋ฃŒ(abrupt completion)์ด๋ฉด completion์— callResult๋ฅผ ํ• ๋‹นํ•˜๊ณ  return ๋‹จ๊ณ„๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.

  14. completion์„ callResult.[[Value]]๋ฅผ ์—ฐ์‚ฐ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…๊ณผ ๋™์ผํ•œ ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์ค‘ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ completion์„ ์˜ˆ์™ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” completion ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  15. Return: ์ด ์‹œ์ ์—์„œ completion์€ IDL ๊ฐ’์ด๊ฑฐ๋‚˜ ๋น„์ •์ƒ ์™„๋ฃŒ์ž„.

    1. ์ฝœ๋ฐฑ ์‹คํ–‰ ํ›„ ์ •๋ฆฌ(clean up)๋ฅผ stored settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ํ›„ ์ •๋ฆฌ(clean up)๋ฅผ relevant settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    3. completion์ด IDL ๊ฐ’์ด๋ฉด completion์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    4. completion์ด ๋น„์ •์ƒ ์™„๋ฃŒ์ด๊ณ , ์—ฐ์‚ฐ์ด ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ํ”„๋ผ๋ฏธ์Šค ํƒ€์ž…์ด ์•„๋‹Œ ๊ฒฝ์šฐ, completion.[[Value]]๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

    5. rejectedPromise๋ฅผ ! Call(%Promise.reject%, %Promise%, ยซcompletion.[[Value]]ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    6. rejectedPromise๋ฅผ ์—ฐ์‚ฐ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.11.1. ๋ ˆ๊ฑฐ์‹œ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด

ํŠน์ • ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํŠน์ • realm์— ๋…ธ์ถœ๋˜๊ณ , ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒ์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ทธ realm์˜ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์€ ํ•ด๋‹น ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‹๋ณ„์ž์ด๋ฉฐ, ๊ทธ ๊ฐ’์€ ๋ ˆ๊ฑฐ์‹œ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

ํŠน์ • ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋ ˆ๊ฑฐ์‹œ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด์—๋Š” ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ์ƒ์ˆ˜์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ยงโ€ฏ3.7.5 ์ƒ์ˆ˜ ์ฐธ๊ณ .

์ฐธ๊ณ : ๋ ˆ๊ฑฐ์‹œ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด์ด๋ฏ€๋กœ, typeof ์—ฐ์‚ฐ์ž๋ฅผ ๋ ˆ๊ฑฐ์‹œ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด์— ์ ์šฉํ•˜๋ฉด "function"์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

ํŠน์ • ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค interface ์— ๋Œ€ํ•ด ์‹๋ณ„์ž id ์™€ realm realm ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ ˆ๊ฑฐ์‹œ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด ๋ฅผ ์ƒ์„ฑ ํ•˜๋Š” ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. steps๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‘”๋‹ค:

    1. ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค(throw) TypeError.

  2. F๋ฅผ CreateBuiltinFunction(steps, 0, id, ยซ ยป, realm)์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  3. ์ƒ์ˆ˜ ์ •์˜๋ฅผ interface์™€ F, realm์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค.

  4. F๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.12. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜ธ์ถœ ๊ฐ€๋Šฅ(callable) ๊ฐ์ฒด๊ฐ€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋  ๋•Œ๋Š”, ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์˜ ์—ฐ์‚ฐ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹(์ด์ „ ์„น์…˜ ์ฐธ์กฐ)๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž… ๊ฐ’ callable์„ Web IDL ์ธ์ž ๋ฆฌ์ŠคํŠธ args, ์˜ˆ์™ธ ๋™์ž‘ exceptionBehavior("report" ๋˜๋Š” "rethrow")์™€ ์„ ํƒ์  ์ฝœ๋ฐฑ this ๊ฐ’ thisArg๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ธฐ: ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์˜ˆ์™ธ๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

exceptionBehavior ์ธ์ž๋Š” callable์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ํ”„๋ผ๋ฏธ์Šค ํƒ€์ž…์ด ์•„๋‹ ๋•Œ๋งŒ ์ œ๊ณต๋˜์–ด์•ผ ํ•˜๋ฉฐ, callable์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด undefined ๋˜๋Š” any๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ฐ˜๋“œ์‹œ "rethrow"์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฝœ ์‚ฌ์ดํŠธ๊ฐ€ ์ด๋ฅผ ์ค€์ˆ˜ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ์ „๊นŒ์ง€, ๋ช…์„ธ์—์„œ ํ•ด๋‹น ๊ฐ’์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด "rethrow"๊ฐ€ ๊ณต๊ธ‰๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  1. completion์„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. thisArg๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด thisArg๋ฅผ undefined๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. F๋ฅผ callable์— ํ•ด๋‹นํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. IsCallable(F)๊ฐ€ false์ด๋ฉด:

    1. ์ฐธ๊ณ : ์ด๊ฒƒ์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ [LegacyTreatNonObjectAsNull] ํŠน์„ฑ์ด ๋ถ™์€ attribute์—์„œ ์˜จ ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    2. undefined๋ฅผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. realm์„ F์˜ ์—ฐ๊ฒฐ๋œ realm์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. relevant settings๋ฅผ realm์˜ ์„ค์ • ๊ฐ์ฒด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. stored settings๋ฅผ callable์˜ ์ฝœ๋ฐฑ ์ปจํ…์ŠคํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  8. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ค€๋น„๋ฅผ relevant settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  9. ์ฝœ๋ฐฑ ์‹คํ–‰ ์ค€๋น„๋ฅผ stored settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  10. jsArgs๋ฅผ args๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ธ์ž ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด completion์„ ์˜ˆ์™ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” completion ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ณ  return ๋‹จ๊ณ„๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.

  11. callResult๋ฅผ Completion(Call(F, thisArg, jsArgs))๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  12. callResult๊ฐ€ ๋น„์ •์ƒ ์™„๋ฃŒ(abrupt completion)์ด๋ฉด completion์„ callResult๋กœ ์„ค์ •ํ•˜๊ณ  return ๋‹จ๊ณ„๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.

  13. completion์„ callResult.[[Value]]๋ฅผ callable์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…๊ณผ ๋™์ผํ•œ ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด completion์„ ์˜ˆ์™ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” completion ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  14. Return: ์ด ์‹œ์ ์—์„œ completion์€ IDL ๊ฐ’์ด๊ฑฐ๋‚˜ ๋น„์ •์ƒ ์™„๋ฃŒ์ž…๋‹ˆ๋‹ค.

    1. ์ฝœ๋ฐฑ ์‹คํ–‰ ํ›„ ์ •๋ฆฌ(clean up)๋ฅผ stored settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ํ›„ ์ •๋ฆฌ(clean up)๋ฅผ relevant settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    3. completion์ด IDL ๊ฐ’์ด๋ฉด completion์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    4. ๋‹จ์–ธ: completion์€ ๋น„์ •์ƒ ์™„๋ฃŒ์ด๋‹ค.

    5. exceptionBehavior๊ฐ€ "rethrow"์ด๋ฉด completion.[[Value]]๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

    6. ๊ทธ ์™ธ exceptionBehavior๊ฐ€ "report"์ผ ๊ฒฝ์šฐ:

      1. ๋‹จ์–ธ: callable์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์€ undefined ๋˜๋Š” any์ด๋‹ค.

      2. ์˜ˆ์™ธ ๋ณด๊ณ ๋ฅผ completion.[[Value]]์— ๋Œ€ํ•ด realm์˜ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      3. ์œ ์ผํ•œ undefined IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    7. ๋‹จ์–ธ: callable์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ํ”„๋ผ๋ฏธ์Šค ํƒ€์ž…์ด๋‹ค.

    8. rejectedPromise๋ฅผ ! Call(%Promise.reject%, %Promise%, ยซcompletion.[[Value]]ยป)๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    9. rejectedPromise๋ฅผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ์ž(constructor)๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ”„๋ผ๋ฏธ์Šค ํƒ€์ž… ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๊ฐ–์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž… ๊ฐ’ callable์„ Web IDL ์ธ์ž ๋ฆฌ์ŠคํŠธ args๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์„ ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” IDL ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์˜ˆ์™ธ๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  1. completion์„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. F๋ฅผ callable์— ํ•ด๋‹นํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. IsConstructor(F)๊ฐ€ false์ด๋ฉด TypeError ์˜ˆ์™ธ๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  4. realm์„ F์˜ ์—ฐ๊ฒฐ๋œ realm์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. relevant settings๋ฅผ realm์˜ ์„ค์ • ๊ฐ์ฒด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. stored settings๋ฅผ callable์˜ ์ฝœ๋ฐฑ ์ปจํ…์ŠคํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ค€๋น„๋ฅผ relevant settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  8. ์ฝœ๋ฐฑ ์‹คํ–‰ ์ค€๋น„๋ฅผ stored settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  9. jsArgs๋ฅผ args๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ธ์ž ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด completion์„ ์˜ˆ์™ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” completion ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ณ  return ๋‹จ๊ณ„๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.

  10. callResult๋ฅผ Completion(Construct(F, jsArgs))๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  11. callResult๊ฐ€ ๋น„์ •์ƒ ์™„๋ฃŒ(abrupt completion)์ด๋ฉด completion์„ callResult๋กœ ์„ค์ •ํ•˜๊ณ  return ๋‹จ๊ณ„๋กœ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.

  12. completion์„ callResult.[[Value]]๋ฅผ callable์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…๊ณผ ๋™์ผํ•œ ํƒ€์ž…์˜ IDL ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด completion์„ ์˜ˆ์™ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” completion ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  13. Return: ์ด ์‹œ์ ์—์„œ completion์€ IDL ๊ฐ’์ด๊ฑฐ๋‚˜ ๋น„์ •์ƒ ์™„๋ฃŒ์ž…๋‹ˆ๋‹ค.

    1. ์ฝœ๋ฐฑ ์‹คํ–‰ ํ›„ ์ •๋ฆฌ(clean up)๋ฅผ stored settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ํ›„ ์ •๋ฆฌ(clean up)๋ฅผ relevant settings๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    3. completion์ด ๋น„์ •์ƒ ์™„๋ฃŒ์ด๋ฉด completion.[[Value]]๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

    4. completion์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3.13. ๋„ค์ž„์ŠคํŽ˜์ด์Šค

ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ํŠน์ • realm์— ๋…ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น realm์˜ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์‹๋ณ„์ž์ด๊ณ , ๊ฐ’์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด๋ผ ๋ถ€๋ฅด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด์˜ ํŠน์„ฑ์€ ยงโ€ฏ3.13.1 ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

3.13.1. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด

ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค namespace์™€ realm realm์— ๋Œ€ํ•ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  1. namespaceObject๋ฅผ OrdinaryObjectCreate(realm.[[Intrinsics]].[[%Object.prototype%]])๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. ์ •๊ทœ ์†์„ฑ ์ •์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ namespace, namespaceObject, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  3. ์ •๊ทœ ์—ฐ์‚ฐ ์ •์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ namespace, namespaceObject, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  4. ์ƒ์ˆ˜ ์ •์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ namespace, namespaceObject, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  5. ๊ฐ ๋…ธ์ถœ๋œ ์ธํ„ฐํŽ˜์ด์Šค interface ์ค‘, [LegacyNamespace] ํ™•์žฅ ์†์„ฑ์ด ์žˆ๊ณ , ๊ทธ ์ธ์ž๊ฐ€ namespace์˜ ์‹๋ณ„์ž์ธ ๊ฒฝ์šฐ:

    1. id๋ฅผ interface์˜ ์‹๋ณ„์ž๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. interfaceObject๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ interface, id, realm์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. DefineMethodProperty(namespaceObject, id, interfaceObject, false)๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  6. namespaceObject๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ์ฒด์˜ class string์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค.

3.14. ์˜ˆ์™ธ

3.14.1. DOMException ์ปค์Šคํ…€ ๋ฐ”์ธ๋”ฉ

JavaScript ๋ฐ”์ธ๋”ฉ์—์„œ, DOMException์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋Š” ๊ทธ [[Prototype]] ๋‚ด๋ถ€ ์Šฌ๋กฏ์ด, ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด ์ƒ์„ฑ ์ถ”์ƒ ์—ฐ์‚ฐ์—์„œ ์ •์˜๋œ ๋Œ€๋กœ, ๊ณ ์œ  ๊ฐ์ฒด %Error.prototype%์œผ๋กœ ์„ค์ •๋œ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๋‚ด์žฅ ์˜ˆ์™ธ์ฒ˜๋Ÿผ [[ErrorData]] ๋ฐ [[Stack]] ์Šฌ๋กฏ๋„ ๊ฐ€์ง„๋‹ค.

์ถ”๊ฐ€๋กœ, ๊ตฌํ˜„์ด ๋„ค์ดํ‹ฐ๋ธŒ Error ๊ฐ์ฒด์— ๊ทธ ๋ฐ–์˜ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์ด๋‚˜ ๋น„ํ‘œ์ค€ ์†์„ฑ(line ๋ฐ column ์†์„ฑ ๋“ฑ)์„ ์ œ๊ณตํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ๋“ค๋„ DOMException ๊ฐ์ฒด์— ๋…ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

3.14.2. ์˜ˆ์™ธ ๊ฐ์ฒด

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

DOMException์€ ํ”Œ๋žซํผ ๊ฐ์ฒด๋กœ ํ‘œํ˜„๋˜๋ฉฐ, DOMException ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

3.14.3. ์˜ˆ์™ธ ์ƒ์„ฑ ๋ฐ throw

๋‹จ์ˆœ ์˜ˆ์™ธ ํƒ€์ž… T์˜ ์˜ˆ์™ธ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜:
  1. message๋ฅผ ์˜ˆ์™ธ ์ƒํ™ฉ์— ์ ํ•ฉํ•œ ๊ตฌํ˜„์ฒด ์ •์˜(implementation-defined) ๋ฉ”์‹œ์ง€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ๋ช…์„ธ๊ฐ€ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ตฌํ˜„์ฒด๋Š” ๋ฏผ๊ฐํ•˜๊ฑฐ๋‚˜ ๋ณด์•ˆ ์ •๋ณด๊ฐ€ ๋ˆ„์ถœ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํฌ๋กœ์Šค ์˜ค๋ฆฌ์ง„ ํ”„๋ ˆ์ž„์˜ URL, ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด ๋“ฑ์ด ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. args๋ฅผ ยซ message ยป๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. constructor๋ฅผ ํ˜„์žฌ realm.[[Intrinsics]].[[%T%]]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. ! Construct(constructor, args)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

DOMException์˜ ์˜ˆ์™ธ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜(name: name):
  1. ๋‹จ์–ธ: name์ด DOMException ์ด๋ฆ„ ํ…Œ์ด๋ธ”์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

  2. ex๋ฅผ new DOMException์œผ๋กœ ํ˜„์žฌ realm์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  3. ex์˜ name์„ name์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. ex์˜ message๋ฅผ ์˜ˆ์™ธ ์ƒํ™ฉ์— ์ ํ•ฉํ•œ ๊ตฌํ˜„์ฒด ์ •์˜ ๋ฉ”์‹œ์ง€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ๋ช…์„ธ๊ฐ€ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ตฌํ˜„์ฒด๋Š” ๋ฏผ๊ฐํ•˜๊ฑฐ๋‚˜ ๋ณด์•ˆ ์ •๋ณด๊ฐ€ ๋ˆ„์ถœ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํฌ๋กœ์Šค ์˜ค๋ฆฌ์ง„ ํ”„๋ ˆ์ž„์˜ URL, ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด ๋“ฑ์ด ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  5. ex๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

DOMException ํŒŒ์ƒ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์˜ˆ์™ธ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜(์ธํ„ฐํŽ˜์ด์Šค ์‹๋ณ„์ž type, ์ถ”๊ฐ€ ์ดˆ๊ธฐํ™” ์ง€์นจ ํฌํ•จ):
  1. ex๋ฅผ new type ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค๋กœ ํ˜„์žฌ realm์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. ex์˜ name์„ type์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ex์˜ message๋ฅผ ์˜ˆ์™ธ ์ƒํ™ฉ์— ์ ํ•ฉํ•œ ๊ตฌํ˜„์ฒด ์ •์˜ ๋ฉ”์‹œ์ง€๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ๋ช…์„ธ๊ฐ€ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ตฌํ˜„์ฒด๋Š” ๋ฏผ๊ฐํ•˜๊ฑฐ๋‚˜ ๋ณด์•ˆ ์ •๋ณด๊ฐ€ ๋ˆ„์ถœ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํฌ๋กœ์Šค ์˜ค๋ฆฌ์ง„ ํ”„๋ ˆ์ž„์˜ URL, ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด ๋“ฑ์ด ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  4. ํ˜ธ์ถœ์ž๊ฐ€ ๊ธฐ์ˆ ํ•œ ์ถ”๊ฐ€ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ex์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  5. ex๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์™ธ throw ์•Œ๊ณ ๋ฆฌ์ฆ˜:
  1. O๋ฅผ ๋™์ผํ•œ ์ธ์ž๋กœ ์˜ˆ์™ธ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. O๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์˜ˆ์™ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด๊ฐ€ ํ•จ์ˆ˜ ๊ฐ์ฒด ๋ฐ–์œผ๋กœ ์ „ํŒŒ๋  ๋•Œ, ๊ทธ realm๊ณผ ์—ฐ๊ฒฐ๋œ ๊ฒƒ๋“ค๋กœ ์ œํ•œํ•œ๋‹ค. ์ด๋Š” ํ•ด๋‹น ํ•จ์ˆ˜ ๊ฐ์ฒด์˜ realm(์ฆ‰, ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์˜ ํ˜„์žฌ realm)์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ IDL์„ ์ƒ๊ฐํ•ด ๋ณด์ž:

[Exposed=Window]
interface MathUtils {
  // x๊ฐ€ ์Œ์ˆ˜๋ฉด, "NotSupportedError" DOMException์„ throwํ•ฉ๋‹ˆ๋‹ค.
  double computeSquareRoot(double x);
};

myMU๊ฐ€ ๋‹ค๋ฅธ realm์—์„œ ์˜จ MathUtils ๊ฐ์ฒด๋ผ๋ฉด, ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ throw๋œ ์˜ˆ์™ธ๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ realm์—์„œ ์ƒ์„ฑ๋œ ์˜ˆ์™ธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค:

const myMU = window.getMathUtils();          // ์ด realm์˜ MathUtils ๊ฐ์ฒด
const otherMU = otherWindow.getMathUtils();  // ๋‹ค๋ฅธ realm์˜ MathUtils ๊ฐ์ฒด

myMU instanceof Object;                      // true
otherMU instanceof Object;                   // false
otherMU instanceof otherWindow.Object;       // true

try {
  otherMU.doComputation.call(myMU, -1);
} catch (e) {
  console.assert(!(e instanceof DOMException));
  console.assert(e instanceof otherWindow.DOMException);
}

3.14.4. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

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

๋ฌธ์„œ ๊ทœ์•ฝ์— ๋”ฐ๋ผ, ๋ณธ ๋ฌธ์„œ์—์„œ ๋ช…์„ธ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ throw๋œ ์˜ˆ์™ธ๋ฅผ ๊ฐ€๋กœ์ฑ„๊ฑฐ๋‚˜, ์˜ˆ์™ธ๊ฐ€ throw๋œ ๊ฒฝ์šฐ์˜ ์ •ํ™•ํ•œ ์ฒ˜๋ฆฌ ๋‹จ๊ณ„๋ฅผ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜, ๋น„์ •์ƒ ์™„๋ฃŒ(abrupt completion)์„ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ IDL ์กฐ๊ฐ(fragment)์€ ๋‘ ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•˜๋‚˜์˜ ์˜ˆ์™ธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ExceptionThrower์˜ valueOf ์†์„ฑ์€ ๊ฐ’์„ ์–ป์œผ๋ ค ํ•  ๋•Œ๋งˆ๋‹ค ์˜ˆ์™ธ๋ฅผ throwํ•˜๋„๋ก ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

[Exposed=Window]
interface Dahut {
  attribute DOMString type;
};

[Exposed=Window]
interface ExceptionThrower {
  // ์ด ์†์„ฑ์€ ํ•ญ์ƒ NotSupportedError๋ฅผ throwํ•˜๋ฉฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  attribute long valueOf;
};

์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ๋‹ค์Œ ์ฝ”๋“œ๋Š” ์˜ˆ์™ธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

var d = getDahut();              // Dahut ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ
var et = getExceptionThrower();  // ExceptionThrower ์ธ์Šคํ„ด์Šค ์–ป๊ธฐ

try {
  d.type = { toString: function() { throw "abc"; } };
} catch (e) {
  // ์—ฌ๊ธฐ์„œ ๋ฌธ์ž์—ด "abc"๊ฐ€ catch๋ฉ๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ
  // ์ต๋ช… ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , [[DefaultValue]], ToPrimitive, ToString ์•Œ๊ณ ๋ฆฌ์ฆ˜์€
  // ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ catchํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
}

try {
  d.type = { toString: { } };
} catch (e) {
  // ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ๊ฐ€ catch๋ฉ๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ์ฒด์˜ toString ํ”„๋กœํผํ‹ฐ ๊ฐ’์— ๋Œ€ํ•ด
  // [[Call]]์„ ์‹œ๋„ํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
}

try {
  d.type = Symbol();
} catch (e) {
  // ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ๊ฐ€ catch๋ฉ๋‹ˆ๋‹ค. Symbol ๊ฐ’์— ๋Œ€ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ToString ์ถ”์ƒ ์—ฐ์‚ฐ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
}

d.type = et;
// ์—ฌ๊ธฐ์„œ๋Š” ์žกํžˆ์ง€ ์•Š์€ "NotSupportedError" DOMException์ด throw๋ฉ๋‹ˆ๋‹ค.
// [[DefaultValue]] ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ExceptionThrower ๊ฐ์ฒด์˜ "valueOf" ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์–ป์œผ๋ ค ์‹œ๋„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
// ์ด ์˜ˆ์™ธ๋Š” ์ด ์ฝ”๋“œ ๋ธ”๋ก ๋ฐ–์œผ๋กœ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.

4. ๊ณตํ†ต ์ •์˜

์ด ์ ˆ์—์„œ๋Š” ๋ชจ๋“  ์ ํ•ฉ ๊ตฌํ˜„์ฒด๊ฐ€ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ณตํ†ต ์ •์˜๋ฅผ ๋ช…์„ธํ•ฉ๋‹ˆ๋‹ค.

4.1. ArrayBufferView

typedef (Int8Array or Int16Array or Int32Array or
         Uint8Array or Uint16Array or Uint32Array or Uint8ClampedArray or
         BigInt64Array or BigUint64Array or
         Float16Array or Float32Array or Float64Array or DataView) ArrayBufferView;

ArrayBufferView ํƒ€์ž…์€ ArrayBuffer๋‚˜ SharedArrayBuffer ([AllowShared]์ด ์‚ฌ์šฉ๋  ๋•Œ)์— ๋Œ€ํ•œ ๋ทฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

4.2. BufferSource

typedef (ArrayBuffer or ArrayBufferView) BufferSource;

BufferSource ํƒ€์ž…์€ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ArrayBuffer์ด๊ฑฐ๋‚˜, ArrayBuffer์— ๋Œ€ํ•œ ๋ทฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : [AllowShared] ๋Š” BufferSource์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ArrayBuffer๊ฐ€ ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  AllowSharedBufferSource๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

4.3. AllowSharedBufferSource

typedef (ArrayBuffer or SharedArrayBuffer or [AllowShared] ArrayBufferView) AllowSharedBufferSource;

AllowSharedBufferSource ํƒ€์ž…์€ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ArrayBuffer์ด๊ฑฐ๋‚˜ SharedArrayBuffer์ด๊ฑฐ๋‚˜, ArrayBuffer ๋˜๋Š” SharedArrayBuffer์— ๋Œ€ํ•œ ๋ทฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

4.4. DOMException

DOMException ํƒ€์ž…์€ ๋‹ค์Œ IDL ์กฐ๊ฐ์œผ๋กœ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์ž…๋‹ˆ๋‹ค:

[Exposed=*,
 Serializable]
interface DOMException { // but see below note about JavaScript binding
  constructor(optional DOMString message = "", optional DOMString name = "Error");
  readonly attribute DOMString name;
  readonly attribute DOMString message;
  readonly attribute unsigned short code;

  const unsigned short INDEX_SIZE_ERR = 1;
  const unsigned short DOMSTRING_SIZE_ERR = 2;
  const unsigned short HIERARCHY_REQUEST_ERR = 3;
  const unsigned short WRONG_DOCUMENT_ERR = 4;
  const unsigned short INVALID_CHARACTER_ERR = 5;
  const unsigned short NO_DATA_ALLOWED_ERR = 6;
  const unsigned short NO_MODIFICATION_ALLOWED_ERR = 7;
  const unsigned short NOT_FOUND_ERR = 8;
  const unsigned short NOT_SUPPORTED_ERR = 9;
  const unsigned short INUSE_ATTRIBUTE_ERR = 10;
  const unsigned short INVALID_STATE_ERR = 11;
  const unsigned short SYNTAX_ERR = 12;
  const unsigned short INVALID_MODIFICATION_ERR = 13;
  const unsigned short NAMESPACE_ERR = 14;
  const unsigned short INVALID_ACCESS_ERR = 15;
  const unsigned short VALIDATION_ERR = 16;
  const unsigned short TYPE_MISMATCH_ERR = 17;
  const unsigned short SECURITY_ERR = 18;
  const unsigned short NETWORK_ERR = 19;
  const unsigned short ABORT_ERR = 20;
  const unsigned short URL_MISMATCH_ERR = 21;
  const unsigned short QUOTA_EXCEEDED_ERR = 22;
  const unsigned short TIMEOUT_ERR = 23;
  const unsigned short INVALID_NODE_TYPE_ERR = 24;
  const unsigned short DATA_CLONE_ERR = 25;
};

์ฐธ๊ณ : ยง 3.14.1 DOMException ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ”์ธ๋”ฉ์—์„œ ๋…ผ์˜ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, JavaScript ๋ฐ”์ธ๋”ฉ์€ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋„˜์–ด์„œ๋Š” ์ถ”๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ถ€๊ณผํ•œ๋‹ค.

๊ฐ DOMException ๊ฐ์ฒด์—๋Š” ์—ฐ๊ด€๋œ name ๋ฐ message๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋‘˜ ๋‹ค ๋ฌธ์ž์—ด์ด๋‹ค.

new DOMException(message, name) ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. this์˜ name์„ name์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. this์˜ message๋ฅผ message๋กœ ์„ค์ •ํ•œ๋‹ค.

name ๊ฒŒํ„ฐ ๋‹จ๊ณ„๋Š” this์˜ name์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

message ๊ฒŒํ„ฐ ๋‹จ๊ณ„๋Š” this์˜ message๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

code ๊ฒŒํ„ฐ ๋‹จ๊ณ„๋Š” this์˜ name์— ๋Œ€ํ•ด DOMException ์ด๋ฆ„ ํ‘œ์— ํ‘œ์‹œ๋œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ๊ทธ๋Ÿฌํ•œ ํ•ญ๋ชฉ์ด ํ‘œ์— ์—†์œผ๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

DOMException ๊ฐ์ฒด๋Š” ์ง๋ ฌํ™” ๊ฐ€๋Šฅ ๊ฐ์ฒด์ด๋‹ค.

value ๋ฐ serialized๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ทธ ์ง๋ ฌํ™” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. serialized.[[Name]]์„ value์˜ name์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
  2. serialized.[[Message]]๋ฅผ value์˜ message๋กœ ์„ค์ •ํ•œ๋‹ค.
  3. serialized.[[Stack]]์„ value.[[Stack]]์—์„œ ํŒŒ์ƒ๋œ ๊ตฌํ˜„ ์ •์˜ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.
  4. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์•„์ง ๋ช…์‹œ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ด€์‹ฌ ์žˆ๋Š” ๋ถ€์ˆ˜ ๋ฐ์ดํ„ฐ, ํŠนํžˆ line ๋ฐ column ์†์„ฑ์˜ ์ง๋ ฌํ™”๋œ ํ‘œํ˜„์„ serialized์— ์ฒจ๋ถ€ํ•ด์•ผ ํ•œ๋‹ค.

value ๋ฐ serialized๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ทธ ์—ญ์ง๋ ฌํ™” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. value์˜ name์„ serialized.[[Name]]์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
  2. value์˜ message๋ฅผ serialized.[[Message]]๋กœ ์„ค์ •ํ•œ๋‹ค.
  3. value.[[Stack]]์„ serialized.[[Stack]]์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
  4. ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ serialized์— ์ฒจ๋ถ€๋˜์–ด ์žˆ์œผ๋ฉด, ๊ทธ๊ฒƒ์„ ์—ญ์ง๋ ฌํ™”ํ•˜์—ฌ value์— ์ฒจ๋ถ€ํ•œ๋‹ค.

4.5. Function

callback Function = any (any... arguments);

Function ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž…์€ ์ธ์ž์— ์–ด๋–ค ์ œํ•œ๋„ ์—†์œผ๋ฉฐ ๋ฐ˜ํ™˜๊ฐ’๋„ ์ œํ•œ์ด ์—†๋Š” ํ•จ์ˆ˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

4.6. VoidFunction

callback VoidFunction = undefined ();

VoidFunction ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํƒ€์ž…์€ ์ธ์ž๋ฅผ ๋ฐ›์ง€ ์•Š์œผ๋ฉฐ ๋ฐ˜ํ™˜๊ฐ’๋„ ์—†๋Š” ํ•จ์ˆ˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

5. ํ™•์žฅ์„ฑ

์ด ์ ˆ์€ ์ฐธ๊ณ ์šฉ์ž…๋‹ˆ๋‹ค.

์–ธ์–ด ๋ฐ”์ธ๋”ฉ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํ™•์žฅ์€, ๋ณธ ๋ฌธ์„œ์—์„œ ์ •์˜๋œ ๊ฒƒ๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ํ™•์žฅ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์„ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ด๋‚˜ ํ”„๋กœ์ ํŠธ๋ณ„ ์‚ฌ์šฉ์„ ์œ„ํ•œ ํ™•์žฅ์€ ๋‹ค๋ฅธ ๋ช…์„ธ์— ๋‚˜์˜ค๋Š” IDL ์กฐ๊ฐ์— ํฌํ•จํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ๋ช…์„ธ์—์„œ ์‚ฌ์šฉ์ด ํ•„์š”ํ•œ ํ™•์žฅ์€ Web IDL ์ž‘์—… ๊ทธ๋ฃน(์ž‘์„ฑ ์‹œ์  ๊ธฐ์ค€ W3C Web Platform Working Group)๊ณผ ํ˜‘์˜ํ•˜์—ฌ ๋ณธ ๋ฌธ์„œ์˜ ํ–ฅํ›„ ๋ฒ„์ „์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

IDL ์–ธ์–ด์˜ ๋‹ค๋ฅธ ์ธก๋ฉด์— ๋Œ€ํ•œ ํ™•์žฅ์€ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

6. ๋ ˆ๊ฑฐ์‹œ ๊ตฌ์„ฑ ์š”์†Œ

์ด ์ ˆ์€ ์ฐธ๊ณ ์šฉ์ž…๋‹ˆ๋‹ค.

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

๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ ˆ๊ฑฐ์‹œ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ ๊ณง ๋ณธ ๋ฌธ์„œ์—์„œ ์ œ๊ฑฐ๋  ๊ฒƒ์ž„์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ด๊ฒƒ์ด ํ–ฅํ›„ ๋ณธ ๋ฌธ์„œ์—์„œ ์ œ๊ฑฐ๋  ์ข‹์€ ํ›„๋ณด์ž„์„ ์‹œ์‚ฌํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํœด๋ฆฌ์Šคํ‹ฑ์— ๋”ฐ๋ผ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ช…์„ธํ•˜๋ ค๋Š” ์›น ํ”Œ๋žซํผ ๊ธฐ๋Šฅ์ด ์™„์ „ํžˆ ์ œ๊ฑฐ๋˜๊ฑฐ๋‚˜ ๋ ˆ๊ฑฐ์‹œ Web IDL ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋ช…์„ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

7. ์ด ๋ช…์„ธ ์ฐธ์กฐ

์ด ์ ˆ์€ ์ฐธ๊ณ ์šฉ์ž…๋‹ˆ๋‹ค.

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

์ด ๋ช…์„ธ์˜ ๋ถ€๋ก A์— ์žˆ๋Š” IDL ์กฐ๊ฐ์€, ๋ณธ ๋ช…์„ธ์˜ ๊ทœ๋ฒ”์  ์ฐธ์กฐ์—์„œ ์ •์˜๋œ IDL ์กฐ๊ฐ๋“ค๊ณผ ํ•จ๊ป˜, โ€œWeb IDLโ€ ๋ช…์„ธ์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์ ํ•ฉํ•œ IDL ์กฐ๊ฐ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ์š”๊ตฌ๋˜๋Š” ๋Œ€๋กœ ํ•ด์„๋˜์–ด์•ผ ํ•œ๋‹ค. [WEBIDL]

๋˜ํ•œ, ์ฐธ์กฐ ๋ช…์„ธ์—์„œ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ ์ ํ•ฉ์„ฑ ํด๋ž˜์Šค๋Š” ๋ณธ ๋ช…์„ธ์˜ ์ ํ•ฉ ๊ตฌํ˜„์ฒด ํด๋ž˜์Šค๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค:

์ ํ•ฉํ•œ FooML ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ๋˜ํ•œ ๋ณธ ๋ช…์„ธ์˜ ๋ถ€๋ก A์˜ IDL ์กฐ๊ฐ์— ๋Œ€ํ•œ ์ ํ•ฉ ๊ตฌํ˜„์ฒด์—ฌ์•ผ ํ•˜๋ฉฐ, ์ด๋Š” โ€œWeb IDLโ€ ๋ช…์„ธ์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ํ•ด์„๋˜์–ด์•ผ ํ•œ๋‹ค. [WEBIDL]

8. ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฐ ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

์ด ๋ช…์„ธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ IDL ๊ฐ’ ์‚ฌ์ด์˜ ๋ณ€ํ™˜ ๊ณ„์ธต์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ„์ธต์„ ์ž˜๋ชป ๊ตฌํ˜„ํ•˜๋ฉด ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๊ฐ์‚ฌ์˜ ๊ธ€

์ด ์ ˆ์€ ์ฐธ๊ณ ์šฉ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘์ž๋“ค์€ ๋‹ค์Œ ๋ถ„๋“ค๊ป˜ ์ด ๋ช…์„ธ์— ๊ธฐ์—ฌํ•ด ์ฃผ์‹  ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ์‚ฌ์˜ ๋ง์”€์„ ์ „ํ•ฉ๋‹ˆ๋‹ค: Glenn Adams, David Andersson, Jake Archibald, Tab Atkins-Bittner, L. David Baron, Art Barstow, Nils Barth, Robin Berjon, David Bruant, Jan-Ivar Bruaroey, Marcos Cรกceres, Giovanni Campagna, Franรงois Daoust, Domenic Denicola, Chris Dumez, Michael Dyck, Daniel Ehrenberg, Brendan Eich, Joรฃo Eiras, Gorm Haug Eriksen, Sigbjorn Finne, David Flanagan, Aryeh Gregor, Dimitry Golubovsky, James Graham, Aryeh Gregor, Tiancheng โ€œTimothyโ€ Gu, Kartikaya Gupta, Marcin Hanclik, Jed Hartman, Stefan Haustein, Dominique Hazaรซl-Massieux, Ian Hickson, Bjรถrn Hรถhrmann, Kyle Huey, Lachlan Hunt, Oliver Hunt, Jim Jewett, Wolfgang Keller, Anne van Kesteren, Olav Junker Kjรฆr, Takayoshi Kochi, Magnus Kristiansen, Raphael Kubo da Costa, Takeshi Kurosawa, Yves Lafon, Travis Leithead, Jim Ley, Kevin Lindsey, Jens Lindstrรถm, Peter Linss, ๅ‘‚ๅบท่ฑช (Kang-Hao Lu), Kyle Machulis, Darien Maillet Valentine, Mark Miller, Ms2ger, Andrew Oakley, ๅฒกๅ‚ ๅฒ็ด€ (Shiki Okasaka), Jason Orendorff, Olli Pettay, Simon Pieters, Andrei Popescu, Franรงois Remy, Tim Renouf, Jeremy Roman, Tim Ruffles, Alex Russell, Takashi Sakamoto, Doug Schepers, Jonas Sicking, Garrett Smith, Sam Sneddon, Jungkee Song, Josh Soref, Maciej Stachowiak, Austin Sullivan, Anton Tayanovskyy, triple-underscore, Peter Van der Beken, Jeff Walden, Allen Wirfs-Brock, Jeffrey Yasskin ๊ทธ๋ฆฌ๊ณ , Collin Xu.

ํŽธ์ง‘์ž๊ฐ€ ๋ช…์„ธ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ด ๋ฌธ์„œ๋ฅผ ๊ด€๋ฆฌํ•ด ์ค€ Sam Weinig์—๊ฒŒ๋„ ํŠน๋ณ„ํžˆ ๊ฐ์‚ฌ๋ฅผ ์ „ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ˜„ํ–‰ ํ‘œ์ค€์€ Edgar Chen (Mozilla, echen@mozilla.com)๊ณผ Tiancheng "Timothy" Gu (timothygu99@gmail.com)๊ฐ€ ์ง‘ํ•„ํ•˜์˜€์œผ๋ฉฐ, Boris Zbarsky (bzbarsky@mit.edu), Cameron McCormack (cam@mcc.id.au), ๊ทธ๋ฆฌ๊ณ  Tobie Langel (tobie@unlockopen.com)์˜ ์ค‘์š”ํ•œ ๊ธฐ์—ฌ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

IDL ๋ฌธ๋ฒ•

์ด ์ ˆ์—์„œ๋Š” ์‹œ์ž‘ ๊ธฐํ˜ธ Definitions๊ฐ€ ์ „์ฒด IDL ์กฐ๊ฐ๊ณผ ๋งค์นญ๋˜๋Š” LL(1) ๋ฌธ๋ฒ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•์˜ ๊ฐ ์ƒ์„ฑ์‹(production)์€ ์˜ค๋ฅธ์ชฝ์— 0์ด ์•„๋‹Œ ๊ฐœ์ˆ˜์˜ ํ„ฐ๋ฏธ๋„๊ณผ ๋น„ํ„ฐ๋ฏธ๋„ ๊ธฐํ˜ธ๊ฐ€ ์žˆ๊ฑฐ๋‚˜, ๊ธฐํ˜ธ๊ฐ€ ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์—ก์‹ค๋ก (ฮต)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ธฐํ˜ธ๋Š” ๋น„ํ„ฐ๋ฏธ๋„ ๊ธฐํ˜ธ์ž…๋‹ˆ๋‹ค. ๊ณ ์ •ํญ ๊ธ€๊ผด๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ธฐํ˜ธ๋Š” ํ„ฐ๋ฏธ๋„ ๊ธฐํ˜ธ์ž…๋‹ˆ๋‹ค. ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ์‚ฐ์„ธ๋ฆฌํ”„ ๊ธ€๊ผด์˜ ๊ธฐํ˜ธ๋Š” ํ„ฐ๋ฏธ๋„ ๊ธฐํ˜ธ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด Perl 5 ์ •๊ทœํ‘œํ˜„์‹ ๋ฌธ๋ฒ•([PERLRE])์„ ์‚ฌ์šฉํ•ด ๋งค์นญ๋ฉ๋‹ˆ๋‹ค:

integer = /-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/
decimal = /-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/
identifier = /[_-]?[A-Za-z][0-9A-Z_a-z-]*/
string = /"[^"]*"/
whitespace = /[\t\n\r ]+/
comment = /\/\/.*|\/\*(.|\n)*?\*\//
other = /[^\t\n\r 0-9A-Za-z]/

ํ† ํฌ๋‚˜์ด์ €๋Š” ์Šค์นผ๋ผ ๊ฐ’ ์‹œํ€€์Šค์— ๋Œ€ํ•ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ† ํฌ๋‚˜์ด์ง•ํ•  ๋•Œ๋Š” ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๊ธด ์ผ์น˜ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž…๋ ฅ ํ…์ŠคํŠธ๊ฐ€ โ€œa1โ€์ด๋ฉด ํ•˜๋‚˜์˜ identifier๋กœ ํ† ํฌ๋‚˜์ด์ฆˆ๋˜๊ณ , identifier์™€ integer๋กœ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ธด ์ผ์น˜๊ฐ€ ์œ„์— ๋ช…์‹œ๋œ ํ„ฐ๋ฏธ๋„ ์‹ฌ๋ณผ ๋˜๋Š” ๋ฌธ๋ฒ•์˜ ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„ ์‹ฌ๋ณผ ์ค‘ ํ•˜๋‚˜์™€ ๋ชจ๋‘ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด, ํ›„์ž๊ฐ€ ๋˜๋„๋ก ํ† ํฌ๋‚˜์ด์ฆˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž…๋ ฅ ํ…์ŠคํŠธ โ€œlongโ€์€ ํ„ฐ๋ฏธ๋„ ์‹ฌ๋ณผ long์œผ๋กœ ํ† ํฌ๋‚˜์ด์ฆˆ๋˜๊ณ , identifier "long"์ด ์•„๋‹™๋‹ˆ๋‹ค. โ€œ.โ€๋Š” ํ„ฐ๋ฏธ๋„ ์‹ฌ๋ณผ .๋กœ ํ† ํฌ๋‚˜์ด์ฆˆ๋˜๋ฉฐ, other๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

IDL ๋ฌธ๋ฒ•์€ ๊ณ ์ •ํญ ํ„ฐ๋ฏธ๋„ ์‹ฌ๋ณผ๊ณผ identifier ํ„ฐ๋ฏธ๋„์˜ ๊ฐ’ ๋ชจ๋‘์— ๋Œ€ํ•ด ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž…๋ ฅ ํ…์ŠคํŠธ โ€œConstโ€๋Š” identifier๋กœ ํ† ํฌ๋‚˜์ด์ฆˆ๋˜๊ณ  ํ„ฐ๋ฏธ๋„ ์‹ฌ๋ณผ const๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. interface์˜ identifier๊ฐ€ "A"์ธ ๊ฒƒ๊ณผ "a"์ธ ๊ฒƒ์€ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ™•์žฅ ์†์„ฑ [legacyfactoryfunction]์€ [LegacyFactoryFunction] ํ™•์žฅ ์†์„ฑ์œผ๋กœ ์ธ์‹๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•”์‹œ์ ์œผ๋กœ, ํŒŒ์‹ฑ๋˜๋Š” ์ž…๋ ฅ ํ…์ŠคํŠธ์˜ ๋ชจ๋“  ํ„ฐ๋ฏธ๋„ ์‚ฌ์ด์—๋Š” ์ž„์˜ ๊ฐœ์ˆ˜์˜ whitespace ๋ฐ comment ํ„ฐ๋ฏธ๋„์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ whitespace์™€ comment ํ„ฐ๋ฏธ๋„์€ ํŒŒ์‹ฑ ์ค‘์— ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์˜ LL(1) ๋ฌธ๋ฒ•์€ Definitions์—์„œ ์‹œ์ž‘ํ•˜์—ฌ IDL ์กฐ๊ฐ์— ๋งค์นญ๋ฉ๋‹ˆ๋‹ค:

Definitions ::
    ExtendedAttributeList Definition Definitions
    ฮต

Definition ::
    CallbackOrInterfaceOrMixin
    Namespace
    Partial
    Dictionary
    Enum
    Typedef
    IncludesStatement

ArgumentNameKeyword ::
    attribute
    callback
    const
    constructor
    deleter
    dictionary
    enum
    getter
    includes
    inherit
    interface
    iterable
    maplike
    mixin
    namespace
    partial
    readonly
    required
    setlike
    setter
    static
    stringifier
    typedef
    unrestricted

CallbackOrInterfaceOrMixin ::
    callback CallbackRestOrInterface
    interface InterfaceOrMixin

InterfaceOrMixin ::
    InterfaceRest
    MixinRest

InterfaceRest ::
    identifier Inheritance { InterfaceMembers } ;

Partial ::
    partial PartialDefinition

PartialDefinition ::
    interface PartialInterfaceOrPartialMixin
    PartialDictionary
    Namespace

PartialInterfaceOrPartialMixin ::
    PartialInterfaceRest
    MixinRest

PartialInterfaceRest ::
    identifier { PartialInterfaceMembers } ;

InterfaceMembers ::
    ExtendedAttributeList InterfaceMember InterfaceMembers
    ฮต

InterfaceMember ::
    PartialInterfaceMember
    Constructor

PartialInterfaceMembers ::
    ExtendedAttributeList PartialInterfaceMember PartialInterfaceMembers
    ฮต

PartialInterfaceMember ::
    Const
    Operation
    Stringifier
    StaticMember
    Iterable
    AsyncIterable
    ReadOnlyMember
    ReadWriteAttribute
    ReadWriteMaplike
    ReadWriteSetlike
    InheritAttribute

Inheritance ::
    : identifier
    ฮต

MixinRest ::
    mixin identifier { MixinMembers } ;

MixinMembers ::
    ExtendedAttributeList MixinMember MixinMembers
    ฮต

MixinMember ::
    Const
    RegularOperation
    Stringifier
    OptionalReadOnly AttributeRest

IncludesStatement ::
    identifier includes identifier ;

CallbackRestOrInterface ::
    CallbackRest
    interface identifier { CallbackInterfaceMembers } ;

CallbackInterfaceMembers ::
    ExtendedAttributeList CallbackInterfaceMember CallbackInterfaceMembers
    ฮต

CallbackInterfaceMember ::
    Const
    RegularOperation

Const ::
    const ConstType identifier = ConstValue ;

ConstValue ::
    BooleanLiteral
    FloatLiteral
    integer

BooleanLiteral ::
    true
    false

FloatLiteral ::
    decimal
    -Infinity
    Infinity
    NaN

ConstType ::
    PrimitiveType
    identifier

ReadOnlyMember ::
    readonly ReadOnlyMemberRest

ReadOnlyMemberRest ::
    AttributeRest
    MaplikeRest
    SetlikeRest

ReadWriteAttribute ::
    AttributeRest

InheritAttribute ::
    inherit AttributeRest

AttributeRest ::
    attribute TypeWithExtendedAttributes AttributeName ;

AttributeName ::
    AttributeNameKeyword
    identifier

AttributeNameKeyword ::
    required

OptionalReadOnly ::
    readonly
    ฮต

DefaultValue ::
    ConstValue
    string
    [ ]
    { }
    null
    undefined

Operation ::
    RegularOperation
    SpecialOperation

RegularOperation ::
    Type OperationRest

SpecialOperation ::
    Special RegularOperation

Special ::
    getter
    setter
    deleter

OperationRest ::
    OptionalOperationName ( ArgumentList ) ;

OptionalOperationName ::
    OperationName
    ฮต

OperationName ::
    OperationNameKeyword
    identifier

OperationNameKeyword ::
    includes

ArgumentList ::
    Argument Arguments
    ฮต

Arguments ::
    , Argument Arguments
    ฮต

Argument ::
    ExtendedAttributeList ArgumentRest

ArgumentRest ::
    optional TypeWithExtendedAttributes ArgumentName Default
    Type Ellipsis ArgumentName

ArgumentName ::
    ArgumentNameKeyword
    identifier

Ellipsis ::
    ...
    ฮต

Constructor ::
    constructor ( ArgumentList ) ;

Stringifier ::
    stringifier StringifierRest

StringifierRest ::
    OptionalReadOnly AttributeRest
    ;

StaticMember ::
    static StaticMemberRest

StaticMemberRest ::
    OptionalReadOnly AttributeRest
    RegularOperation

Iterable ::
    iterable < TypeWithExtendedAttributes OptionalType > ;

OptionalType ::
    , TypeWithExtendedAttributes
    ฮต

AsyncIterable ::
    async_iterable < TypeWithExtendedAttributes OptionalType > OptionalArgumentList ;

OptionalArgumentList ::
    ( ArgumentList )
    ฮต

ReadWriteMaplike ::
    MaplikeRest

MaplikeRest ::
    maplike < TypeWithExtendedAttributes , TypeWithExtendedAttributes > ;

ReadWriteSetlike ::
    SetlikeRest

SetlikeRest ::
    setlike < TypeWithExtendedAttributes > ;

Namespace ::
    namespace identifier { NamespaceMembers } ;

NamespaceMembers ::
    ExtendedAttributeList NamespaceMember NamespaceMembers
    ฮต

NamespaceMember ::
    RegularOperation
    readonly AttributeRest
    Const

Dictionary ::
    dictionary identifier Inheritance { DictionaryMembers } ;

DictionaryMembers ::
    DictionaryMember DictionaryMembers
    ฮต

DictionaryMember ::
    ExtendedAttributeList DictionaryMemberRest

DictionaryMemberRest ::
    required TypeWithExtendedAttributes identifier ;
    Type identifier Default ;

PartialDictionary ::
    dictionary identifier { DictionaryMembers } ;

Default ::
    = DefaultValue
    ฮต

Enum ::
    enum identifier { EnumValueList } ;

EnumValueList ::
    string EnumValueListComma

EnumValueListComma ::
    , EnumValueListString
    ฮต

EnumValueListString ::
    string EnumValueListComma
    ฮต

CallbackRest ::
    identifier = Type ( ArgumentList ) ;

Typedef ::
    typedef TypeWithExtendedAttributes identifier ;

Type ::
    SingleType
    UnionType Null

TypeWithExtendedAttributes ::
    ExtendedAttributeList Type

SingleType ::
    DistinguishableType
    any
    PromiseType

UnionType ::
    ( UnionMemberType or UnionMemberType UnionMemberTypes )

UnionMemberType ::
    ExtendedAttributeList DistinguishableType
    UnionType Null

UnionMemberTypes ::
    or UnionMemberType UnionMemberTypes
    ฮต

DistinguishableType ::
    PrimitiveType Null
    StringType Null
    identifier Null
    sequence < TypeWithExtendedAttributes > Null
    async_sequence < TypeWithExtendedAttributes > Null
    object Null
    symbol Null
    BufferRelatedType Null
    FrozenArray < TypeWithExtendedAttributes > Null
    ObservableArray < TypeWithExtendedAttributes > Null
    RecordType Null
    undefined Null

PrimitiveType ::
    UnsignedIntegerType
    UnrestrictedFloatType
    boolean
    byte
    octet
    bigint

UnrestrictedFloatType ::
    unrestricted FloatType
    FloatType

FloatType ::
    float
    double

UnsignedIntegerType ::
    unsigned IntegerType
    IntegerType

IntegerType ::
    short
    long OptionalLong

OptionalLong ::
    long
    ฮต

StringType ::
    ByteString
    DOMString
    USVString

PromiseType ::
    Promise < Type >

RecordType ::
    record < StringType , TypeWithExtendedAttributes >

Null ::
    ?
    ฮต

BufferRelatedType ::
    ArrayBuffer
    SharedArrayBuffer
    DataView
    Int8Array
    Int16Array
    Int32Array
    Uint8Array
    Uint16Array
    Uint32Array
    Uint8ClampedArray
    BigInt64Array
    BigUint64Array
    Float16Array
    Float32Array
    Float64Array

ExtendedAttributeList ::
    [ ExtendedAttribute ExtendedAttributes ]
    ฮต

ExtendedAttributes ::
    , ExtendedAttribute ExtendedAttributes
    ฮต

ExtendedAttribute ::
    ( ExtendedAttributeInner ) ExtendedAttributeRest
    [ ExtendedAttributeInner ] ExtendedAttributeRest
    { ExtendedAttributeInner } ExtendedAttributeRest
    Other ExtendedAttributeRest

ExtendedAttributeRest ::
    ExtendedAttribute
    ฮต

ExtendedAttributeInner ::
    ( ExtendedAttributeInner ) ExtendedAttributeInner
    [ ExtendedAttributeInner ] ExtendedAttributeInner
    { ExtendedAttributeInner } ExtendedAttributeInner
    OtherOrComma ExtendedAttributeInner
    ฮต

Other ::
    integer
    decimal
    identifier
    string
    other
    -
    -Infinity
    .
    ...
    :
    ;
    <
    =
    >
    ?
    *
    ByteString
    DOMString
    FrozenArray
    Infinity
    NaN
    ObservableArray
    Promise
    USVString
    any
    bigint
    boolean
    byte
    double
    false
    float
    long
    null
    object
    octet
    or
    optional
    record
    sequence
    short
    symbol
    true
    unsigned
    undefined
    ArgumentNameKeyword
    BufferRelatedType

OtherOrComma ::
    Other
    ,

IdentifierList ::
    identifier Identifiers

Identifiers ::
    , identifier Identifiers
    ฮต

IntegerList ::
    integer Integers

Integers ::
    , integer Integers
    ฮต

ExtendedAttributeNoArgs ::
    identifier

ExtendedAttributeArgList ::
    identifier ( ArgumentList )

ExtendedAttributeIdent ::
    identifier = identifier

ExtendedAttributeString ::
    identifier = string

ExtendedAttributeInteger ::
    identifier = integer

ExtendedAttributeDecimal ::
    identifier = decimal

ExtendedAttributeWildcard ::
    identifier = *

ExtendedAttributeIdentList ::
    identifier = ( IdentifierList )

ExtendedAttributeIntegerList ::
    identifier = ( IntegerList )

ExtendedAttributeNamedArgList ::
    identifier = identifier ( ArgumentList )

์ฐธ๊ณ : Other ๋น„๋‹จ๋ง์€ (, ), [, ], {, } ๊ทธ๋ฆฌ๊ณ  ,๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋‹จ์ผ ๋‹จ๋ง ๊ธฐํ˜ธ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

ExtendedAttribute ๋น„๋‹จ๋ง์€ ๊ด„ํ˜ธ, ๋Œ€๊ด„ํ˜ธ, ์ค‘๊ด„ํ˜ธ๊ฐ€ ๊ท ํ˜•์„ ์ด๋ฃจ๊ณ  , ํ† ํฐ์ด ๊ทธ ๊ท ํ˜• ์žกํžŒ ๊ด„ํ˜ธ ์•ˆ์—์„œ๋งŒ ๋‚˜ํƒ€๋‚˜๋Š” ํ•œ, ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋‹จ๋ง ๊ธฐํ˜ธ ์‹œํ€€์Šค์™€ ์ผ์น˜ํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๊ฐ€๋Šฅํ•œ ์‹œํ€€์Šค ์ค‘ ์˜ค์ง ์ผ๋ถ€๋งŒ์ด ์ด ๋ช…์„ธ์—์„œ ์ •์˜๋œ ํ™•์žฅ ์†์„ฑ ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค โ€” ์‚ฌ์šฉ๋˜๋Š” ํ™•์žฅ ์†์„ฑ์˜ ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด์„œ๋Š” ยงโ€ฏ2.14 ํ™•์žฅ ์†์„ฑ ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฌธ์„œ ๊ด€๋ก€

์ด ๋ฌธ์„œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„œ์ฒด ๊ด€๋ก€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

์ด ๋ฌธ์„œ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€๋ก€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

์ ํ•ฉ์„ฑ

์ด ๋ช…์„ธ์„œ์˜ ๋ชจ๋“  ๋‚ด์šฉ์€ ๋„ํ‘œ, ์˜ˆ์‹œ, ์ฐธ๊ณ  ๋ฐ ์ •๋ณด์šฉ์œผ๋กœ ํ‘œ์‹œ๋œ ์„น์…˜์„ ์ œ์™ธํ•˜๋ฉด ๊ทœ๋ฒ”์ ์ž…๋‹ˆ๋‹ค.

์ด ๋ช…์„ธ์„œ๋Š” Infra ํ‘œ์ค€์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. [INFRA]

์ด ๋ช…์„ธ์„œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ํ•ฉ์„ฑ ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋ฉ๋‹ˆ๋‹ค:

์ ํ•ฉํ•œ IDL ์กฐ๊ฐ ์ง‘ํ•ฉ

IDL ์กฐ๊ฐ๋“ค์˜ ์ง‘ํ•ฉ์€, ํ•จ๊ป˜ ๊ณ ๋ คํ–ˆ์„ ๋•Œ, ์ด ๋ช…์„ธ์„œ์—์„œ IDL ์กฐ๊ฐ์— ์ ์šฉ๋˜๋Š” must-, required-, shall- ์ˆ˜์ค€์˜ ๊ธฐ์ค€์„ ๋ชจ๋‘ ์ถฉ์กฑ์‹œํ‚ค๋ฉด ์ ํ•ฉํ•œ IDL ์กฐ๊ฐ ์ง‘ํ•ฉ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

์ ํ•ฉํ•œ ๊ตฌํ˜„

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด ๊ตฌํ˜„์— ์ ์šฉ๋˜๋Š” must-, required-, shall- ์ˆ˜์ค€์˜ ๊ธฐ์ค€์„ ์ด ๋ช…์„ธ์„œ์—์„œ ๋ชจ๋‘ ์ถฉ์กฑ์‹œํ‚ค๋ฉด, ํ•ด๋‹น ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ ํ•ฉํ•œ ๊ตฌํ˜„์œผ๋กœ, ํ•ด๋‹น ์ ํ•ฉํ•œ IDL ์กฐ๊ฐ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

์ ํ•ฉํ•œ JavaScript ๊ตฌํ˜„

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ JavaScript ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด ๊ตฌํ˜„์— ์ ์šฉ๋˜๋Š” must-, required-, shall- ์ˆ˜์ค€์˜ ๊ธฐ์ค€์„ ์ด ๋ช…์„ธ์„œ์—์„œ ๋ชจ๋‘ ์ถฉ์กฑ์‹œํ‚ค๋ฉด, ํ•ด๋‹น ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ ํ•ฉํ•œ JavaScript ๊ตฌํ˜„์œผ๋กœ, ํ•ด๋‹น ์ ํ•ฉํ•œ IDL ์กฐ๊ฐ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

์ง€์  ์žฌ์‚ฐ๊ถŒ

์ด ํ˜„ํ–‰ ํ‘œ์ค€์—๋Š” W3C์˜ WebIDL [sic] Level 1์—์„œ ๋ณต์‚ฌ๋œ ์ž๋ฃŒ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์ž๋ฃŒ๋Š” W3C ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ ๋ฌธ์„œ ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

Copyright ยฉ WHATWG (Apple, Google, Mozilla, Microsoft). ์ด ์ €์ž‘๋ฌผ์€ ํฌ๋ฆฌ์—์ดํ‹ฐ๋ธŒ ์ปค๋จผ์ฆˆ ์ €์ž‘์ž ํ‘œ์‹œ 4.0 ๊ตญ์ œ ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ผ์ด์„ ์Šค๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋‚ด์šฉ์ด ์†Œ์Šค ์ฝ”๋“œ์— ํ†ตํ•ฉ๋œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋Š”, ํ•ด๋‹น ์†Œ์Šค ์ฝ”๋“œ์˜ ๋ถ€๋ถ„์€ BSD 3-Clause ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ณ„๋„๋กœ ๋ผ์ด์„ ์Šค๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํ˜„ํ–‰ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ํŠนํ—ˆ ๊ฒ€ํ† ์šฉ ๋ฒ„์ „์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋ถ„์€ ํ˜„ํ–‰ ํ‘œ์ค€ ๊ฒ€ํ†  ์ดˆ์•ˆ์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ƒ‰์ธ

์ด ๋ช…์„ธ์—์„œ ์ •์˜๋œ ์šฉ์–ด

์ฐธ์กฐ๋กœ ์ •์˜๋œ ์šฉ์–ด

์ฐธ๊ณ  ๋ฌธํ—Œ

๊ทœ๋ฒ”์  ์ฐธ๊ณ  ๋ฌธํ—Œ

[DOM]
Anne van Kesteren. DOM ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://dom.spec.whatwg.org/
[ECMA-262]
ECMAScript ์–ธ์–ด ๋ช…์„ธ. URL: https://tc39.es/ecma262/multipage/
[ECMA-402]
ECMAScript ๊ตญ์ œํ™” API ๋ช…์„ธ. URL: https://tc39.es/ecma402/
[HTML]
Anne van Kesteren; et al. HTML ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://html.spec.whatwg.org/multipage/
[IEEE-754]
IEEE ๋ถ€๋™์†Œ์ˆ˜์  ์‚ฐ์ˆ  ํ‘œ์ค€. 2019๋…„ 7์›” 22์ผ. URL: https://ieeexplore.ieee.org/document/8766229
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://infra.spec.whatwg.org/
[PERLRE]
Perl ์ •๊ทœ์‹ (Perl 5.8.8). 2006๋…„ 2์›”. URL: http://search.cpan.org/dist/perl/pod/perlre.pod
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://webidl.spec.whatwg.org/

์ •๋ณด์šฉ ์ฐธ๊ณ  ๋ฌธํ—Œ

[API-DESIGN-PRINCIPLES]
Jeffrey Yasskin. ์›น ํ”Œ๋žซํผ ์„ค๊ณ„ ์›์น™. URL: https://w3ctag.github.io/design-principles/
[CSS3-CONDITIONAL]
Chris Lilley; David Baron; Elika Etemad. CSS ์กฐ๊ฑด๋ถ€ ๊ทœ์น™ ๋ชจ๋“ˆ 3๋‹จ๊ณ„. URL: https://drafts.csswg.org/css-conditional-3/
[CSSOM]
Daniel Glazman; Emilio Cobos รlvarez. CSS ์˜ค๋ธŒ์ ํŠธ ๋ชจ๋ธ (CSSOM). URL: https://drafts.csswg.org/cssom/
[FETCH]
Anne van Kesteren. Fetch ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://fetch.spec.whatwg.org/
[INDEXEDDB]
Nikunj Mehta; et al. Indexed Database API. URL: https://w3c.github.io/IndexedDB/
[PROPOSAL-FLOAT16ARRAY]
JavaScript์— float16 TypedArrays ์ถ”๊ฐ€ ์ œ์•ˆ. URL: https://tc39.es/proposal-float16array/
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers Nightly. URL: https://w3c.github.io/ServiceWorker/
[STREAMS]
Adam Rice; et al. Streams ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://streams.spec.whatwg.org/
[WASM-JS-API-1]
Daniel Ehrenberg. WebAssembly JavaScript ์ธํ„ฐํŽ˜์ด์Šค. URL: https://webassembly.github.io/spec/js-api/
[WASM-JS-API-2]
. Ms2ger; Ryan Hunt. WebAssembly JavaScript ์ธํ„ฐํŽ˜์ด์Šค. URL: https://webassembly.github.io/spec/js-api/
[XML-NAMES]
Tim Bray; et al. Namespaces in XML 1.0 (์„ธ ๋ฒˆ์งธ ํŒ). 2009๋…„ 12์›” 8์ผ. REC. URL: https://www.w3.org/TR/xml-names/

IDL ์ƒ‰์ธ

[Exposed=*, Serializable]
interface QuotaExceededError : DOMException {
  constructor(optional DOMString message = "", optional QuotaExceededErrorOptions options = {});

  readonly attribute double? quota;
  readonly attribute double? requested;
};

dictionary QuotaExceededErrorOptions {
  double quota;
  double requested;
};

typedef (Int8Array or Int16Array or Int32Array or
         Uint8Array or Uint16Array or Uint32Array or Uint8ClampedArray or
         BigInt64Array or BigUint64Array or
         Float16Array or Float32Array or Float64Array or DataView) ArrayBufferView;

typedef (ArrayBuffer or ArrayBufferView) BufferSource;
typedef (ArrayBuffer or SharedArrayBuffer or [AllowShared] ArrayBufferView) AllowSharedBufferSource;
[Exposed=*,
 Serializable]
interface DOMException { // but see below note about JavaScript binding
  constructor(optional DOMString message = "", optional DOMString name = "Error");
  readonly attribute DOMString name;
  readonly attribute DOMString message;
  readonly attribute unsigned short code;

  const unsigned short INDEX_SIZE_ERR = 1;
  const unsigned short DOMSTRING_SIZE_ERR = 2;
  const unsigned short HIERARCHY_REQUEST_ERR = 3;
  const unsigned short WRONG_DOCUMENT_ERR = 4;
  const unsigned short INVALID_CHARACTER_ERR = 5;
  const unsigned short NO_DATA_ALLOWED_ERR = 6;
  const unsigned short NO_MODIFICATION_ALLOWED_ERR = 7;
  const unsigned short NOT_FOUND_ERR = 8;
  const unsigned short NOT_SUPPORTED_ERR = 9;
  const unsigned short INUSE_ATTRIBUTE_ERR = 10;
  const unsigned short INVALID_STATE_ERR = 11;
  const unsigned short SYNTAX_ERR = 12;
  const unsigned short INVALID_MODIFICATION_ERR = 13;
  const unsigned short NAMESPACE_ERR = 14;
  const unsigned short INVALID_ACCESS_ERR = 15;
  const unsigned short VALIDATION_ERR = 16;
  const unsigned short TYPE_MISMATCH_ERR = 17;
  const unsigned short SECURITY_ERR = 18;
  const unsigned short NETWORK_ERR = 19;
  const unsigned short ABORT_ERR = 20;
  const unsigned short URL_MISMATCH_ERR = 21;
  const unsigned short QUOTA_EXCEEDED_ERR = 22;
  const unsigned short TIMEOUT_ERR = 23;
  const unsigned short INVALID_NODE_TYPE_ERR = 24;
  const unsigned short DATA_CLONE_ERR = 25;
};

callback Function = any (any... arguments);
callback VoidFunction = undefined ();
โœ”MDN

DOMException/DOMException

In all current engines.

Firefox37+Safari10.1+Chrome46+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

DOMException/message

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
โœ”MDN

DOMException/name

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
โœ”MDN

DOMException

In all current engines.

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+IE9+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
Node.js17.0.0+