°´Ã¼

¿ÀÅäÇÖÅ°¿¡¼­ °´Ã¼(object)´Â Ãß»ó µ¥ÀÌÅÍ À¯ÇüÀ¸·Î¼­ ¼¼ °¡Áö ±âº» ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù:

°´Ã¼ ÂüÁ¶´Â ƯÁ¤ °´Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ ¶Ç´Â ÇÚµé("handle")ÀÔ´Ï´Ù. ¹®ÀÚ¿­°ú ¼ýÀÚó·³, °´Ã¼ ÂüÁ¶´Â º¯¼ö¿¡ ÀúÀåÇÏ°í ÇÔ¼ö·ÎºÎÅÍ ¹ÝȯÇÏ¸ç °´Ã¼ ¾È¿¡ ÀúÀåÇÒ ¼ö ÀÖ½À´Ï´Ù. x := y ó·³ ÂüÁ¶¸¦ ÇÑ º¯¼ö¿¡¼­ ´Ù¸¥ º¯¼ö·Î º¹»çÇÏ°í ³ª¸é, µÎ º¯¼ö ¸ðµÎ °°Àº °´Ã¼¸¦ °¡¸®Åµ´Ï´Ù.

IsObject¸¦ »ç¿ëÇÏ¸é °ªÀÌ °´Ã¼ÀÎÁö ÆǺ°ÇÒ ¼ö ÀÖ½À´Ï´Ù:

Result := IsObject(expression)

°´Ã¼ÀÇ Á¾·ù´Â ´ÙÀ½°ú °°½À´Ï´Ù:

¸ñÂ÷

±âº» »ç¿ë¹ý

´Ü¼øÇÑ ¹è¿­

¹è¿­À» ¸¸µì´Ï´Ù:

Array := [Item1, Item2, ..., ItemN]
Array := Array(Item1, Item2, ..., ItemN)

Ç׸ñÀ» ¿­¶÷ÇÕ´Ï´Ù:

Value := Array[Index]

Ç׸ñÀ» ÇÒ´çÇÕ´Ï´Ù:

Array[Index] := Value

ÁÖ¾îÁø À妽º¿¡ Ç׸ñ(µé)À» »ðÀÔÇÕ´Ï´Ù:

Array.InsertAt(Index, Value, Value2, ...)

Ç׸ñ(µé)À» Ãß°¡ÇÕ´Ï´Ù:

Array.Push(Value, Value2, ...)

Ç׸ñÀ» Á¦°ÅÇÕ´Ï´Ù:

RemovedValue := Array.RemoveAt(Index)

¸¶Áö¸· Ç׸ñÀ» Á¦°ÅÇÕ´Ï´Ù:

RemovedValue := Array.Pop()

¹è¿­ÀÌ ºñ¾î ÀÖÁö ¾ÊÀ¸¸é, MinIndex¿Í MaxIndex/Length´Â ¹è¿­¿¡¼­ ÇöÀç »ç¿ëÁßÀÎ °¡Àå ³·Àº À妽º¿Í °¡Àå ³ôÀº À妽º¸¦ µ¹·ÁÁÝ´Ï´Ù. °¡Àå ³·Àº À妽º´Â °ÅÀÇ ´ëºÎºÐ 1À̹ǷÎ, MaxIndex´Â º¸Åë Ç׸ñÀÇ °³¼ö¸¦ µ¹·ÁÁÝ´Ï´Ù. ±×·¸Áö¸¸, Á¤¼ö Å°°¡ ¾ø´Ù¸é, MaxIndex´Â ºó ¹®ÀÚ¿­À» µ¹·ÁÁÝ´Ï´Ù. ¹Ý¸é¿¡ Length´Â 0À» µ¹·ÁÁÝ´Ï´Ù. ¹è¿­ÀÇ ³»¿ëÀº À妽º ¶Ç´Â For-loop·Î ȸµ¹ÀÌÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î:

array := ["one", "two", "three"]

; 1ºÎÅÍ ¹è¿­ÀÇ ³¡±îÁö ¹Ýº¹ÇÕ´Ï´Ù:
Loop % array.Length()
    MsgBox % array[A_Index]

; ¹è¿­ÀÇ ³»¿ëÀ» ¿­°ÅÇÕ´Ï´Ù:
For index, value in array
    MsgBox % "Item " index " is '" value "'"

¿¬°ü ¹è¿­

¿¬°ü ¹è¿­Àº À¯ÀÏÇÑ Å° Áý´Ü°ú À¯ÀÏÇÑ °ª Áý´ÜÀ» Æ÷ÇÔÇÏ´Â °´Ã¼ÀÔ´Ï´Ù. °¢ Å°´Â °¢ °ª¿¡ ¿¬°üµÇ¾î ÀÖ½À´Ï´Ù. Å°´Â ¹®ÀÚ¿­À̳ª Á¤¼ö¶Ç´Â °´Ã¼°¡ µÉ ¼ö ÀÖ´Â ¹Ý¸é, °ªÀº ¾î¶² À¯Çüµµ µÉ ¼ö ÀÖ½À´Ï´Ù. ¿¬°ü ¹è¿­À» ´ÙÀ½°ú °°ÀÌ ¸¸µé ¼ö ÀÖ½À´Ï´Ù:

Array := {KeyA: ValueA, KeyB: ValueB, ..., KeyZ: ValueZ}
Array := Object("KeyA", ValueA, "KeyB", ValueB, ..., "KeyZ", ValueZ)

{key:value} Ç¥±â¹ýÀ» »ç¿ëÇϸé, ¿ÀÁ÷ ´Ü¾î ¹®Àڷθ¸ ±¸¼ºµÈ Å°¿¡´Â ÀοëºÎÈ£¸¦ »ý·«Çصµ µË´Ï´Ù. ¾î¶² Ç¥Çö½Äµµ Å°·Î »ç¿ëÇÒ ¼ö´Â ÀÖÁö¸¸, º¯¼ö¸¦ Å°·Î »ç¿ëÇÏ·Á¸é, ¹Ýµå½Ã °ýÈ£·Î µÑ·¯½Î¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, {(KeyVar): Value}°ú {GetKey(): Value}´Â ¸ðµÎ À¯È¿ÇÕ´Ï´Ù.

Ç׸ñÀ» ¿­¶÷ÇÕ´Ï´Ù:

Value := Array[Key]

Ç׸ñÀ» ÇÒ´çÇÕ´Ï´Ù:

Array[Key] := Value

Ç׸ñÀ» Á¦°ÅÇÕ´Ï´Ù:

RemovedValue := Array.Delete(Key)

Ç׸ñÀ» ¿­°ÅÇÕ´Ï´Ù:

array := {ten: 10, twenty: 20, thirty: 30}
For key, value in array
    MsgBox %key% = %value%

¿¬°ü ¹è¿­Àº Áß°£ Áß°£ ºñ¿ö¼­ ¸¸µé ¼ö ÀÖ½À´Ï´Ù - Áï, {1:"a",1000:"b"}´Â ¿ÀÁ÷ µÎ °³ÀÇ Å°-°ª ½Ö¸¸ µé¾î ÀÖ½À´Ï´Ù. 1000°³°¡ ¾Æ´Õ´Ï´Ù.

AutoHotkey v1.x¿¡¼­ ´Ü¼ø ¹è¿­°ú ¿¬°ü ¹è¿­Àº °°Àº °ÍÀÔ´Ï´Ù. ±×·¸Áö¸¸ []¸¦ ´Ü¼ø ¹è¿­·Î °£ÁÖÇÏ´Â °ÍÀÌ ±×ÀÇ ¸ñÀûÀ» ¸íÈ®ÇÏ°Ô º¸¿©ÁÖ´Â µ¥ µµ¿òÀÌ µÇ°í, ¹Ì·¡ ¹öÀüÀÇ ¿ÀÅäÇÖÅ°¿¡ ½ºÅ©¸³Æ®°¡ ÀÛµ¿ÇÒ °¡´É¼ºÀ» ³ô¿©ÁÝ´Ï´Ù. ¾ÕÀ¸·Î´Â ´Ü¼ø ¹è¿­°ú ¿¬°ü ¹è¿­ »çÀÌ¿¡ Â÷ÀÌ°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù.

°´Ã¼

Ư¼ºÀ» ¿­¶÷ÇÕ´Ï´Ù:

Value := Object.Property

Ư¼ºÀ» ¼³Á¤ÇÕ´Ï´Ù:

Object.Property := Value

¸Þ½îµå¸¦ È£ÃâÇÕ´Ï´Ù:

ReturnValue := Object.Method(Parameters)

°è»êÇÑ ¸Þ½îµå À̸§À¸·Î ¸Þ½îµå¸¦ È£ÃâÇÕ´Ï´Ù:

ReturnValue := Object[MethodName](Parameters)

COM °´Ã¼ÀÇ Æ¯¼º°ú »ç¿ëÀÚ-Á¤ÀÇ °´Ã¼´Â ¸Å°³º¯¼ö¸¦ ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù:

Value := Object.Property[Parameters]
Object.Property[Parameters] := Value

°ü·Ã Ç׸ñ: Object, File Object, Func Object, COM object

¾Ë·ÁÁø ÇÑ°è:

°´Ã¼ Ç®¾îÁÖ±â

½ºÅ©¸³Æ®´Â ¸í½ÃÀûÀ¸·Î °´Ã¼¸¦ Ç®¾îÁÖÁö ¾Ê½À´Ï´Ù. °´Ã¼¸¦ °¡¸®Å°´Â ¸¶Áö¸· ÂüÁ¶°¡ »ç¶óÁö¸é, ±× °´Ã¼´Â ÀÚµ¿À¸·Î ÇØÁ¦µË´Ï´Ù. º¯¼ö¿¡ ÀúÀåµÈ ÂüÁ¶´Â ±× º¯¼ö°¡ ´Ù¸¥ °ª¿¡ ÇÒ´çµÇ¸é ÀÚµ¿À¸·Î ÇØÁ¦µË´Ï´Ù. ¿¹¸¦ µé¾î:

obj := {}  ; °´Ã¼¸¦ »ý¼ºÇÕ´Ï´Ù.
obj := ""  ; ¸¶Áö¸· ÂüÁ¶¸¦ ÇØÁ¦ÇÕ´Ï´Ù. ±×·¯¹Ç·Î °´Ã¼°¡ ÇعæµË´Ï´Ù.

ºñ½ÁÇÏ°Ô, ¶Ç´Ù¸¥ °´Ã¼ÀÇ Çʵ忡 ÀúÀåµÈ ÂüÁ¶Á¡Àº ±× Çʵ尡 ¶Ç´Ù¸¥ °ª¿¡ ÇÒ´çµÇ°Å³ª ±× °´Ã¼·ÎºÎÅÍ Á¦°ÅµÉ ¶§ ÀÚµ¿À¸·Î Ç®¾îÁý´Ï´Ù. ÀÌ°ÍÀº ¹è¿­¿¡µµ Àû¿ëµË´Ï´Ù. ¹è¿­Àº ½ÇÁ¦·Î °´Ã¼ÀÔ´Ï´Ù.

arr := [{}]  ; °´Ã¼¸¦ ´ã°í ÀÖ´Â ¹è¿­À» »ý¼ºÇÕ´Ï´Ù.
arr[1] := {}  ; µÎ ¹ø° °´Ã¼¸¦ »ý¼ºÇÕ´Ï´Ù. ¹¬½ÃÀûÀ¸·Î ù °´Ã¼¸¦ Ç®¾îÁÖ°í ÀÖ½À´Ï´Ù.
arr.Remove(1)  ; µÎ ¹ø° °´Ã¼¸¦ Á¦°ÅÇÏ°í Ç®¾îÁÝ´Ï´Ù.

ÇÑ °´Ã¼¸¦ °¡¸®Å°´Â ¸ðµç ÂüÁ¶°¡ ÇØÁ¦µÇ¾î¾ß ºñ·Î¼­ ±× °´Ã¼°¡ ÇعæµÉ ¼ö ÀÖ½À´Ï´Ù. ±×·¡¼­ ¼øȯ ÂüÁ¶°¡ ÀÖ´Â °´Ã¼´Â ÀÚµ¿À¸·Î Ç®¾îÁöÁö ¾Ê½À´Ï´Ù. ¿¹¸¦ µé¸é, x.child°¡ y¸¦ °¡¸®Å°°í y.parent°¡ x¸¦ °¡¸®Å²´Ù¸é, x¿Í y¸¦ ¼Ò°ÅÇÏ´Â °Í¸¸À¸·Î´Â ÃæºÐÇÏÁö ¾Ê½À´Ï´Ù. ¿Ö³ÄÇÏ¸é ºÎ¸ð °´Ã¼¿¡ ¿©ÀüÈ÷ ÀÚ¼ÕÀ» °¡¸®Å°´Â ÂüÁ¶°¡ µé¾îÀÖ°í ±× ¹Ý´ëµµ ¸¶Âù°¡ÁöÀ̱⠶§¹®ÀÔ´Ï´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é, ¼øȯ ÂüÁ¶¸¦ Á¦°ÅÇØ¾ß ÇÕ´Ï´Ù.

x := {}, y := {}             ; °´Ã¼¸¦ µÎ °³ »ý¼ºÇÕ´Ï´Ù.
x.child := y, y.parent := x  ; ¼øȯ ÂüÁ¶¸¦ »ý¼ºÇÕ´Ï´Ù.

y.parent := ""               ; ¼øȯ ÂüÁ¶¸¦ ¸ÕÀú Á¦°ÅÇØ¾ß °´Ã¼°¡ ÇعæµÉ ¼ö ÀÖ½À´Ï´Ù.
x := "", y := ""             ; À§ÀÇ ÁÙÀÌ ¾ø´Ù¸é, ÀÌ Áٷδ °´Ã¼¸¦ Ç®¾îÁÙ ¼ö ¾ø½À´Ï´Ù.

´õ ÀÚ¼¼ÇÑ ³»¿ë°ú °í±Þ »ç¿ë¹ýÀº ÂüÁ¶ Ƚ¼ö ¼¼±â¸¦ º¸½Ê½Ã¿À.

³íÆò

±¸¹®

¸ðµç À¯ÇüÀÇ °´Ã¼´Â ¹è¿­ ±¸¹®(°¢°ýÈ£)°ú °´Ã¼ ±¸¹® (Á¡)À» Áö¿øÇÕ´Ï´Ù.

°Ô´Ù°¡, °´Ã¼ ÂüÁ¶´Â Ç¥Çö½Ä¿¡ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù:

°´Ã¼°¡ ¿¹»óÄ¡ ¸øÇÑ ¹®¸Æ¿¡¼­ »ç¿ëÁßÀ̸é, ±× °´Ã¼´Â ºó ¹®ÀÚ¿­·Î Ãë±ÞµË´Ï´Ù. ¿¹¸¦ µé¾î, MsgBox %object% ´Â ºó MsgBox¸¦ º¸¿©ÁÖ°í object + 1´Â ºó ¹®ÀÚ¿­À» »êÃâÇÕ´Ï´Ù. ÀÌ ÇàÀ§´Â ¹Ù²ð ¼ö ÀÖÀ¸¹Ç·Î ¿©±â¿¡ ÀÇÁ¸ÇÏ¸é ¾È µË´Ï´Ù.

¸Þ½îµå-È£Ãâ ´ÙÀ½¿¡ °ð¹Ù·Î ÇÒ´ç ¿¬»êÀÚ°¡ ¿À¸é, ¸Å°³º¯¼ö·Î Ư¼ºÀ» ÇÒ´çÇÏ´Â °Í°ú µ¿µîÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½Àº ¼­·Î µ¿µîÇÕ´Ï´Ù:

obj.item(x) := y
obj.item[x] := y

x.y += 1¿Í --arr[1]°°Àº º¹ÇÕ ¼­¼ú¹®À» Áö¿øÇÕ´Ï´Ù.

[v1.1.20+]: Ư¼ºÀ» ¼³Á¤Çϰųª ȹµæÇÒ ¶§ ¸Å°³º¯¼ö¸¦ »ý·«ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, x[,2]. ½ºÅ©¸³Æ®´Â À̸¦ ÀÌ¿ëÇÏ¿© Ư¼º°ú ¸ÞŸ-ÇÔ¼öÀÇ ¸Å°³º¯¼ö¿¡ ±âº» °ªµéÀ» Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸Þ½îµå À̸§µµ x[](a)ó·³ ¿ÏÀüÈ÷ »ý·« °¡´ÉÇÕ´Ï´Ù. ½ºÅ©¸³Æ®´Â À̸¦ ÀÌ¿ëÇÏ¿© __Call ¸ÞŸ-ÇÔ¼öÀÇ ¸Å°³º¯¼ö¿¡ ±âº» °ªÀ» Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿Ö³ÄÇÏ¸é ±×·¸Áö ¾ÊÀ¸¸é °ªÀÌ Á¦°øµÇÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù. ÀÌ°ÍÀº x.(a)¿Í ´Ù¸£¸ç, x[""](a)°ú µ¿µîÇÑ °Í¿¡ ÁÖ¸ñÇϽʽÿÀ. COM °´Ã¼¸¦ È£ÃâÇÒ ¶§ Ư¼ºÀ̳ª ¸Þ½îµå À̸§ÀÌ »ý·«µÇ¸é, ±×ÀÇ "±âº» ¸â¹ö"°¡ È£ÃâµË´Ï´Ù.

Å°

[], {} ¶Ç´Â new ¿¬»êÀÚ·Î »ý¼ºµÈ °´Ã¼¿¡ ¾î´À °ªÀ» »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö´Â ¾à°£ Á¦ÇÑÀÌ ÀÖ½À´Ï´Ù :

È®Àå »ç¿ë¹ý

ÇÔ¼ö ÂüÁ¶ [v1.1.00+]

º¯¼ö func¿¡ ÇÔ¼ö À̸§ÀÌ µé¾î ÀÖ´Ù¸é, ±× ÇÔ¼ö´Â µÎ °¡Áö ¹æ¹ýÀ¸·Î È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù: %func%() ¶Ç´Â func.(). ±×·¸Áö¸¸, ÀÌ·¸°Ô ÇÏ·Á¸é ¸Å¹ø ÇÔ¼ö À̸§À» °áÁ¤ÇØ¾ß Çϴµ¥, ÇÔ¼ö°¡ ¿©·¯¹ø È£ÃâµÈ´Ù¸é È¿À²ÀûÀÌÁö ¸øÇÕ´Ï´Ù. ¼öÇ༺´ÉÀ» °³¼±Çϱâ À§ÇØ, ½ºÅ©¸³Æ®´Â ÇÔ¼ö¿¡ ´ëÇÑ ÂüÁ¶¸¦ ¿­¶÷ÇØ ±×°ÍÀ» ÀúÀåÇØ ³ªÁß¿¡ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù:

Func := Func("MyFunc")

ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº ±¸¹®À» »ç¿ëÇÏ¿© ÂüÁ¶·Î È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù:

RetVal := %Func%(Params)     ; v1.1.07+À» ¿ä±¸ÇÕ´Ï´Ù
RetVal := Func.Call(Params)  ; v1.1.19+À» ¿ä±¸ÇÕ´Ï´Ù
RetVal := Func.(Params)      ; ±ÇÀåÇÏÁö ¾Ê½À´Ï´Ù

ÇÔ¼ö ÂüÁ¶ÀÇ Ãß°¡ Ư¼ºµé¿¡ °üÇÑ Á¤º¸´Â Func Object¸¦ ÂüÁ¶ÇϽʽÿÀ.

¹è¿­ÀÇ ¹è¿­

¿ÀÅäÇÖÅ°´Â "´Ù-Â÷¿ø" ¹è¿­À» Áö¿øÇÕ´Ï´Ù. ´Ù¸¥ ¹è¿­ ¾È¿¡ ¹è¿­À» Åõ¸íÇÏ°Ô ÀúÀåÇÏ¸é µË´Ï´Ù. ¿¹¸¦ µé¾î, Å×À̺íÀº ÇàÀÇ ¹è¿­·Î Ç¥ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹Ý¸é¿¡ °¢ Çà ÀÚü´Â ¿­ÀÇ ¹è¿­ÀÔ´Ï´Ù. ±× °æ¿ì, xÇà y¿­ÀÇ ³»¿ëÀº ¾Æ·¡ÀÇ ¹æ¹ýÁß Çϳª¸¦ »ç¿ëÇÏ¿© ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù:

table[x][y] := content  ; A
table[x, y] := content  ; B

table[x]°¡ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é, A¿Í B´Â µÎ °¡Áö Á¡¿¡¼­ ´Ù¸¨´Ï´Ù:

table[a, b, c, d] := value¿Í °°Àº ´Ù-Â÷¿ø ÇÒ´çÀº ´ÙÀ½°ú °°ÀÌ Ã³¸®µË´Ï´Ù:

´ÙÀ½ ÇàÀ§´Â ¿ÀÁ÷ ½ºÅ©¸³Æ®·Î-¸¸µç °´Ã¼¿¡¸¸ Àû¿ëµË´Ï´Ù. Á» ´õ Àü¹®È­µÈ À¯ÇüÀÇ °´Ã¼, COM °´Ã¼³ª COM ¹è¿­Àº Àû¿ëµÇÁö ¾Ê½À´Ï´Ù.

ÇÔ¼ö ¹è¿­

ÇÔ¼ö ¹è¿­Àº ´Ü¼øÈ÷ ÇÔ¼ö À̸§À̳ª ÂüÁ¶¸¦ ´ã°í ÀÖ´Â ¹è¿­ÀÔ´Ï´Ù. ¿¹¸¦ µé¾î:

array := [Func("FirstFunc"), Func("SecondFunc")]

; °¢ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù, "foo"¸¦ ¸Å°³º¯¼ö·Î °Ç³Ù´Ù:
Loop 2
    array[A_Index].("foo")

; °¢ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ¹¬½ÃÀûÀ¸·Î ¹è¿­ ÀÚü¸¦ ¸Å°³º¯¼ö·Î °Ç³Ù´Ù:
Loop 2
    array[A_Index]()

FirstFunc(param) {
    MsgBox % A_ThisFunc ": " (IsObject(param) ? "object" : param)
}
SecondFunc(param) {
    MsgBox % A_ThisFunc ": " (IsObject(param) ? "object" : param)
}

ÇÏÀ§-ȣȯÀ» À§ÇØ, array[A_Index]¿¡ ÇÔ¼ö ÂüÁ¶°¡ ¾Æ´Ï¶ó ÇÔ¼ö À̸§ÀÌ µé¾î ÀÖ´Ù¸é, µÎ ¹ø° ÇüÅ´ ¹è¿­(array)À» ¸Å°³º¯¼ö·Î °Ç³×Áö ¾Ê½À´Ï´Ù. ±×·¸Áö¸¸, array[A_Index]°¡ array.base[A_Index]À¸·ÎºÎÅÍ »ó¼ÓµÇ¾ú´Ù¸é, ¹è¿­(array)ÀÌ ¸Å°³º¯¼ö·Î °Ç³×Áý´Ï´Ù.

¸ÂÃã °´Ã¼

½ºÅ©¸³Æ®·Î ¸¸µç °´Ã¼´Â ¹Ì¸® Á¤ÀÇµÈ ±¸Á¶¸¦ °¡Áú ÇÊ¿ä°¡ ¾ø½À´Ï´Ù. ´ë½Å¿¡, °¢ °´Ã¼´Â Ư¼º°ú ¸Þ½îµå¸¦ ±×ÀÇ base °´Ã¼·ÎºÎÅÍ »ó¼Ó¹Þ¾Æ¾ß ÇÕ´Ï´Ù (±×·¸Áö ¾ÊÀ¸¸é "ÇÁ·ÎÅäŸÀÔ" ¶Ç´Â "class"¶ó°í ¾Ë·ÁÁø). Ư¼º°ú ¸Þ½îµå´Â ¾ðÁ¦µçÁö °´Ã¼¿¡ Ãß°¡ÇÒ ¼öµµ (Á¦°ÅÇÒ ¼öµµ) ÀÖ½À´Ï´Ù. ÀÌ·± º¯°æÀº À̷κÎÅÍ ÆÄ»ýµÈ ¸ðµç °´Ã¼¿¡ ¿µÇâÀ» ¹ÌĨ´Ï´Ù. º¸´Ù º¹ÀâÇÏ°í ÀüÈ­µÈ »óȲÀ» À§ÇØ, º£À̽º °´Ã¼´Â ÀÚ½ÅÀ» »ó¼Ó¹ÞÀº °´Ã¼µéÀÇ Ç¥ÁØ ÇàÀ§¸¦ ¿À¹ö¶óÀ̵å ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸ÞŸ-ÇÔ¼ö¸¦ Á¤ÀÇÇØ ¿À¹ö¶óÀ̵å ÇÕ´Ï´Ù.

Base °´Ã¼´Â ±×³É Æò¹üÇÑ °´Ã¼À̸ç, ÀüÇüÀûÀ¸·Î µÎ °¡Áö ¹æ½ÄÀ¸·Î »ý¼ºµË´Ï´Ù:

class baseObject {
    static foo := "bar"
}
; ¶Ç´Â
baseObject := {foo: "bar"}

°´Ã¼¸¦ ¶Ç´Ù¸¥ °´Ã¼·ÎºÎÅÍ ÆÄ»ý½ÃÄÑ »ý¼ºÇϱâ À§ÇØ, ½ºÅ©¸³Æ®´Â base Ư¼º¿¡ ÇÒ´çÇϰųª new Å°¿öµå¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù:

obj1 := Object(), obj1.base := baseObject
obj2 := {base: baseObject}
obj3 := new baseObject
MsgBox % obj1.foo " " obj2.foo " " obj3.foo

¾ðÁ¦µçÁö ÇÑ °´Ã¼ÀÇ base¸¦ ÀçÇÒ´çÇÒ ¼ö ÀÖ½À´Ï´Ù. °´Ã¼°¡ »ó¼Ó¹ÞÀº ¸ðµç Ư¼º°ú ¸Þ½îµå¸¦ È¿°úÀûÀ¸·Î ±³Ã¼ÇÕ´Ï´Ù.

ÇÁ·ÎÅäŸÀÔ

ÇÁ·ÎÅäŸÀÔ ¶Ç´Â base °´Ã¼´Â ´Ù¸¥ °´Ã¼¿Í ¸¶Âù°¡Áö·Î ±¸¼ºÇÏ°í Á¶ÀÛÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, Ư¼º Çϳª¿Í ¸Þ½îµå Çϳª¸¦ °¡Áø Æò¹üÇÑ °´Ã¼´Â ´ÙÀ½°ú °°ÀÌ ±¸¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù:

; °´Ã¼¸¦ »ý¼ºÇÑ´Ù.
thing := {}
; Store a value.
thing.foo := "bar"
; ÇÔ¼ö ÂüÁ¶¸¦ ÀúÀåÇÔÀ¸·Î½á ¸Þ½îµå¸¦ »ý¼ºÇÑ´Ù.
thing.test := Func("thing_test")
; ¸Þ½îµå¸¦ È£ÃâÇÑ´Ù.
thing.test()

thing_test(this) {
   MsgBox % this.foo
}

thing.test()°¡ È£ÃâµÇ¸é, thing´Â ÀÚµ¿À¸·Î ¸Å°³º¯¼ö ¸®½ºÆ®ÀÇ Ã¹¹ø°·Î »ðÀԵ˴ϴÙ. ±×·¸Áö¸¸, ÇÏÀ§ ȣȯÀ» À§ÇØ, ÀÌ·± ÀÏÀº ÇÔ¼ö°¡ (ÂüÁ¶°¡ ¾Æ´Ï¶ó) À̸§À¸·Î (º£À̽º °´Ã¼·ÎºÎÅÍ »ó¼Ó¹Þ´Â °ÍÀÌ ¾Æ´Ï¶ó) Á÷Á¢ÀûÀ¸·Î °´Ã¼¿¡ ÀúÀåµÉ °æ¿ì¿¡¸¸ ÀϾ´Ï´Ù. °ü·ÊÀûÀ¸·Î ÇÔ¼ö´Â °´Ã¼ÀÇ À¯Çü°ú ¸Þ½îµåÀÇ À̸§À» °áÇÕÇØ Áþ½À´Ï´Ù.

°´Ã¼´Â ¶Ç´Ù¸¥ °´Ã¼°¡ ±×·ÎºÎÅÍ ÆÄ»ýÇØ ³ª°¡¸é ÇÁ·ÎÅäŸÀÔ(prototype) ¶Ç´Â º£À̽º(base)°¡ µË´Ï´Ù:

other := {}
other.base := thing
other.test()

ÀÌ °æ¿ì, other´Â foo¸¦ »ó¼Ó¹Þ°í test´Â thingÀ¸·ÎºÎÅÍ »ó¼ÓÀ» ¹Þ½À´Ï´Ù. ÀÌ·± »ó¼Ó °ü°è´Â ¿ªµ¿ÀûÀÔ´Ï´Ù. ±×·¡¼­ thing.foo°¡ º¯°æµÇ¸é, ±× º¯°æÀÌ other.foo¿¡ ¹Ý¿µµË´Ï´Ù. ½ºÅ©¸³Æ®°¡ other.foo¿¡ ÇÒ´çÇϸé, ±× °ªÀº other¿¡ ÀúÀåµË´Ï´Ù. thing.foo¿¡ º¯°æÀ» ´õ °¡ÇÏ´õ¶óµµ other.foo¿¡´Â ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê½À´Ï´Ù. other.test()°¡ È£ÃâµÇ¸é, ±×ÀÇ this ¸Å°³º¯¼ö¿¡´Â thingÀÌ ¾Æ´Ï¶ó other¸¦ °¡¸®Å°´Â ÂüÁ¶°¡ µé¾î°©´Ï´Ù.

Ŭ·¡½º [v1.1.00+]

¾î¿øÀ¸·Î ¸»ÇÏÀÚ¸é "Ŭ·¡½º"¶õ °øÅëÀÇ Æ¯¼ºÀ̳ª ¼Ó¼ºÀ» °¡Áö°í ÀÖ´Â °ÍµéÀÇ ÇÑ ¹üÁÖ ¶Ç´Â ÁýÇÕÀÔ´Ï´Ù. base °´Ã¼³ª prototype °´Ã¼´Â °´Ã¼ ÁýÇÕ¿¡ ´ëÇÏ¿© Ư¼º°ú ÇàÀ§¸¦ Á¤ÀÇÇϱ⠶§¹®¿¡, Ŭ·¡½º(class) °´Ã¼¶ó°í ºÎ¸¦ ¼öµµ ÀÖ½À´Ï´Ù. ÆíÀǸ¦ À§ÇØ, º£À̽º °´Ã¼´Â ¾Æ·¡¿¡ º¸¿©ÁÖ´Â ¹Ù¿Í °°ÀÌ "class" Å°¿öµå¸¦ »ç¿ëÇÏ¿© Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù:

class ClassName extends BaseClassName
{
    InstanceVar := Expression
    static ClassVar := Expression

    class NestedClass
    {
        ...
    }

    Method()
    {
        ...
    }

    Property[]  ; °¢°ýÈ£´Â ¼±ÅÃÀûÀÌ´Ù
    {
        get {
            return ...
        }
        set {
            return ... := value
        }
    }
}

½ºÅ©¸³Æ®°¡ ÀûÀçµÉ ¶§, ÀÌ ÄÚµå´Â °´Ã¼¸¦ Çϳª ±¸¼ºÇÏ°í ±×°ÍÀ» Àü¿ª º¯¼ö (¶Ç´Â v1.1.05+À̶ó¸é ¼öÆÛ-Àü¿ª º¯¼ö) ClassName¿¡ ÀúÀåÇÕ´Ï´Ù. v1.1.05 ÀÌÀüÀ̶ó¸é, ÀÌ Å¬·¡½º¸¦ ÇÔ¼ö ¾È¿¡¼­ ÂüÁ¶ÇÏ·Á¸é, ±× ÇÔ¼ö°¡ assume-globalÀÌ ¾Æ´Ñ ÇÑ, global ClassName¿Í °°Àº ¼±¾ðÀÌ ÇÊ¿äÇÕ´Ï´Ù. extends BaseClassName°¡ ÀÖÀ¸¸é, BaseClassNameÀº ¹Ýµå½Ã ¶Ç´Ù¸¥ Ŭ·¡½ºÀÇ ¿ÏÀüÇÑ À̸§À̾î¾ß ÇÕ´Ï´Ù (±×·¯³ª v1.1.11¿¡¼­´Â Á¤ÀÇµÈ ¼ø¼­´Â ¹®Á¦°¡ µÇÁö ¾Ê½À´Ï´Ù). °¢ Ŭ·¡½ºÀÇ ¿ÏÀüÇÑ À̸§ÀÌ object.__Class¿¡ ÀúÀåµË´Ï´Ù.

ÀÌ ¹®¼­ ¾È¿¡¼­ Ŭ·¡½º("class")¶ó´Â ´Ü¾î´Â ±× ÀÚü·Î º¸Åë class Å°¿öµå·Î ±¸¼ºµÈ Ŭ·¡½º °´Ã¼¸¦ ÀǹÌÇÕ´Ï´Ù.

Ŭ·¡½º Á¤ÀÇ´Â º¯¼ö ¼±¾ð, ¸Þ½îµå Á¤ÀÇ, ³»Æ÷ Ŭ·¡½º Á¤ÀǸ¦ Æ÷ÇÔÇÒ ¼ö ÀÖ½À´Ï´Ù.

½Çü º¯¼ö [v1.1.01+]

½Çü º¯¼ö´Â Ŭ·¡½ºÀÇ °¢ ½Çü°¡ ÀڽŸ¸ÀÇ Å¬·¡½º »çº»À» °¡Áø °ÍÀÔ´Ï´Ù. º¸ÅëÀÇ ÇÒ´çó·³ ¼±¾ðµÇÁö¸¸, this. Á¢µÎ»ç°¡ »ý·«µÇ¾î ÀÖ½À´Ï´Ù (Ŭ·¡½º ¸öü ¾È¿¡¼­ Á÷Á¢ÀûÀ¸·Î »ç¿ëµÉ °æ¿ì¿¡¸¸ »ý·«ÇÕ´Ï´Ù):

InstanceVar := Expression

ÀÌ·± ¼±¾ðÀº Ŭ·§ÀÇ »õ ½Çü°¡ new Å°¿öµå·Î »ý¼ºµÉ ¶§¸¶´Ù ¸Å¹ø Æò°¡µË´Ï´Ù. ¸Þ½îµå À̸§ __InitÀº ÀÌ·± ¸ñÀûÀ» À§ÇØ ¿¹¾àµÇ¾î ÀÖÀ¸¸ç, ´Ù¸¥ ½ºÅ©¸³Æ®¿¡¼­ »ç¿ëÇÏ¸é ¾È µË´Ï´Ù. __New() ¸Þ½îµå´Â º£À̽º Ŭ·¡½º¿¡ Á¤ÀÇµÈ ¼±¾ðÀ» Æ÷ÇÔÇÏ¿© ±× ¸ðµç ¼±¾ðÀÌ Æò°¡µÈ ÈÄ¿¡ È£ÃâµË´Ï´Ù. Ç¥Çö½ÄÀº ´Ù¸¥ ½Çü º¯¼ö¿Í ¸Þ¼Òµå¿¡ this¸¦ ÅëÇÏ¿© Á¢±ÙÇÒ ¼ö ÀÖÁö¸¸, ¸ðµç ´Ù¸¥ º¯¼ö ÂüÁ¶´Â Àü¿ªÀûÀ̶ó°í °£Áֵ˴ϴÙ.

½Çü º¯¼ö¿¡ Á¢±ÙÇÏ·Á¸é (¸Þ½îµå ¾È¿¡¼­µµ ¸¶Âù°¡Áö·Î), ¾ðÁ¦³ª ¸ñÇ¥ °´Ã¼¸¦ ÁöÁ¤ÇÕ´Ï´Ù; ¿¹¸¦ µé¾î, this.InstanceVar.

[v1.1.08+]: ÀÌ Å¬·¡½º¿¡ x°¡ ¹Ì¸® ¼±¾ðµÇ¾î ÀÖ´Ù¸é x.y := z¿Í °°Àº ¼±¾ðµµ Áö¿øµË´Ï´Ù. ¿¹¸¦ µé¾î, x := {}, x.y := 42´Â x¸¦ ¼±¾ðÇÏ°í ¶Ç this.x.y¸¦ ÃʱâÈ­ÇÕ´Ï´Ù.

Á¤Àû/Ŭ·¡½º º¯¼ö [v1.1.00.01+]

Á¤Àû/Ŭ·¡½º º¯¼ö´Â Ŭ·¡½º ÀÚü¿¡ ¼ÓÇÏÁö¸¸, (ÇÏÀ§-Ŭ·¡½º¸¦ Æ÷ÇÔÇÏ¿©) ÆÄ»ý °´Ã¼°¡ »ó¼Ó¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù. ½Çü º¯¼öó·³ ¼±¾ðµÇÁö¸¸, static Å°¿öµå¸¦ »ç¿ëÇÕ´Ï´Ù:

static ClassVar := Expression

Á¤Àû ¼±¾ðÀº ¿ÀÁ÷ ÀÚµ¿-½ÇÇà ¼½¼Ç Àü¿¡ ÇÑ ¹ø¸¸ Æò°¡µË´Ï´Ù. ±×¸®°í ¼ø¼­´ë·Î ½ºÅ©¸³Æ®¿¡ ³ªÅ¸³³´Ï´Ù. °¢ ¼±¾ðÀº °ªÀ» object Ŭ·¡½º¿¡ ÀúÀåÇÕ´Ï´Ù. Ç¥Çö½Ä ¾ÈÀÇ ¸ðµç º¯¼ö ÂüÁ¶´Â Àü¿ªÀûÀ̶ó°í °£Áֵ˴ϴÙ.

Ŭ·¡½º º¯¼ö¿¡ Á¢±ÙÇÏ·Á¸é, ¾ðÁ¦³ª Ŭ·¡½º³ª ÆÄ»ý °´Ã¼¸¦ ÁöÁ¤ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ClassName.ClassVar.

[v1.1.08+]: ÀÌ Å¬·¡½º¿¡ x°¡ ¹Ì¸® Á¤ÀǵǾî ÀÖ´Ù¸é static x.y := z¿Í °°Àº Ç¥Çöµµ Áö¿øÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, static x := {}, x.y := 42´Â x¸¦ ¼±¾ðÇÏ°í ¶Ç ClassName.x.y¸¦ ÃʱâÈ­ÇÕ´Ï´Ù.

³»Æ÷ Ŭ·¡½º

³»Æ÷ Ŭ·¡½º Á¤ÀǴ Ŭ·¡½º °´Ã¼¸¦ ¶Ç´Ù¸¥ Àü¿ª º¯¼ö°¡ ¾Æ´Ï¶ó ¶Ç´Ù¸¥ Ŭ·¡½º °´Ã¼ ¾È¿¡ ÀúÀåµÇµµ·Ï Çã¿ëÇÕ´Ï´Ù. À§ÀÇ ¿¹Á¦¿¡¼­, class NestedClass´Â °´Ã¼¸¦ ±¸¼ºÇÏ°í ±×°ÍÀ» ClassName.NestedClass¿¡ ÀúÀåÇÕ´Ï´Ù. ÇÏÀ§-Ŭ·¡½º´Â NestedClass¸¦ »ó¼Ó¹Þ°Å³ª ÀÚ½ÅÀÇ ³»Æ÷ Ŭ·¡½º·Î ±×°ÍÀ» ¿À¹ö¶óÀ̵åÇÒ ¼ö ÀÖ½À´Ï´Ù (ÀÌ °æ¿ì new this.NestedClass¸¦ »ç¿ëÇÏ¿© ÀûÀýÇÑ Å¬·¡½º¸¦ ½ÇüȭÇÒ ¼ö ÀÖ½À´Ï´Ù).

class NestedClass
{
    ...
}

¸Þ½îµå

¸Þ½îµå Á¤ÀÇ´Â ÇÔ¼ö Á¤ÀÇ¿Í ¸ð½ÀÀÌ ¶È °°½À´Ï´Ù. °¢ ¸Þ½îµå´Â ¼ûÀº ¸Å°³º¯¼ö·Î this°¡ Àִµ¥, ÀÌ°ÍÀº ÀüÇüÀûÀ¸·Î Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó¹ÞÀº °´Ã¼¸¦ °¡¸®Å°´Â ÂüÁ¶Á¡À» ´ã°í ÀÖ½À´Ï´Ù. ±×·¸Áö¸¸, ¸Þ½îµå°¡ ¾î¶»°Ô È£ÃâµÇ´Â °¡¿¡ µû¶ó Ŭ·¡½º ÀÚü³ª »ó¼Ó¹ÞÀº Ŭ·¡½º¸¦ °¡¸®Å°´Â ÂüÁ¶Á¡À» ´ãÀ» ¼öµµ ÀÖ½À´Ï´Ù. ¸Þ½îµå´Â ÀÌ Å¬·¡½º °´Ã¼¿¡ ÂüÁ¶·Î ÀúÀåµË´Ï´Ù.

Method()
{
    ...
}

¸Þ½îµå ¾È¿¡¼­, ÀÇ»ç-Å°¿öµå base¸¦ »ç¿ëÇϸé, ÆÄ»ý Ŭ·¡½º ¾È¿¡ ¿À¹ö¶óÀ̵åµÈ ¼öÆÛ-Ŭ·¡½ºÀÇ ¸Þ½îµå³ª Ư¼º¿¡ Á¢±ÙÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, À§¿¡ Á¤ÀÇµÈ Å¬·¡½º¿¡¼­ base.Method()´Â BaseClassName¿¡ Á¤ÀÇµÈ Method ¹öÀüÀ» È£ÃâÇÕ´Ï´Ù. ¸ÞŸ-ÇÔ¼ö´Â È£ÃâµÇÁö ¾Ê½À´Ï´Ù; ±×·¸Áö ¾ÊÀ¸¸é, base.Method()´Â ¸¶Ä¡ BaseClassName.Method.(this)ó·³ ÇàÀ§ÇÕ´Ï´Ù. ´Ù½Ã ¸»ÇØ,

base´Â ´ÙÀ½¿¡ Á¡. ¶Ç´Â °¢°ýÈ£ []°¡ µû¶ó¿À¸é Ưº°ÇÑ Àǹ̸¦ °¡Áý´Ï´Ù. ±×·¡¼­ obj := base, obj.Method()¿Í °°Àº ÄÚµå´Â ÀÛµ¿ÇÏÁö ¾Ê½À´Ï´Ù. ½ºÅ©¸³Æ®´Â baseÀÇ Æ¯º°ÇÑ ÇàÀ§¸¦ ºÒ´ÉÀ¸·Î ¸¸µé ¼ö ÀÖ½À´Ï´Ù. °Å±â¿¡´Ù ºñ¾îÀÖÁö-¾ÊÀº °ªÀ» ÇÒ´çÇÏ¸é µË´Ï´Ù; ±×·¸Áö¸¸, ÀÌ°ÍÀº ±ÇÀåÇÏÁö ¾Ê½À´Ï´Ù. ¿Ö³ÄÇÏ¸é º¯¼ö base´Â ²À ºñ¾î ÀÖ¾î¾ß ÇÕ´Ï´Ù. ½ºÅ©¸³Æ®°¡ #NoEnv¸¦ »©¸ÔÀ¸¸é ¼öÇ༺´ÉÀÌ ÀúÇ쵃 ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù.

Properties [v1.1.16+]

Ư¼º Á¤ÀÇ´Â ½ºÅ©¸³Æ®°¡ ƯÁ¤ÇÑ Å°¸¦ ¼³Á¤Çϰųª ¿­¶÷ÇÒ ¶§¸¶´Ù ¸Þ½îµå¸¦ ½ÇÇàÇϵµ·Ï Çã¿ëÇÕ´Ï´Ù.

Property[]
{
    get {
        return ...
    }
    set {
        return ... := value
    }
}

Property´Â ±×³É È£ÃâÇÏ´Â µ¥ »ç¿ëµÇ´Â Ư¼ºÀÇ À̸§ÀÏ »ÓÀÔ´Ï´Ù. ¿¹¸¦ µé¸é, obj.Property´Â getÀ» È£ÃâÇÏ´Â ¹Ý¸é¿¡ obj.Property := value´Â setÀ» È£ÃâÇÕ´Ï´Ù. getÀ̳ª set ¾È¿¡¼­, this´Â ¿äû ÁßÀÎ °´Ã¼¸¦ °¡¸®Åµ´Ï´Ù. set ¾È¿¡¼­, value¿¡´Â ÇÒ´çµÈ °ªÀÌ ´ã±é´Ï´Ù.

¸Å°³º¯¼ö´Â Ư¼º À̸§ÀÇ ¿À¸¥ÂÊ¿¡ °¢°ýÈ£·Î µÑ·¯½Î °Ç³Ú ¼ö ÀÖ½À´Ï´Ù. Ư¼ºÀ» Á¤ÀÇÇÒ ¶§¿Í È£ÃâÇÒ ¶§ ¸ðµÎ ¸¶Âù°¡ÁöÀÔ´Ï´Ù. °¢°ýÈ£¸¦ »ç¿ëÇÏ´Â ¿Ü¿¡µµ, Ư¼ºÀÇ ¸Å°³º¯¼ö´Â ¸Þ½îµåÀÇ ¸Å°³º¯¼ö¿Í °°Àº ¹æ½ÄÀ¸·Î Á¤Àǵ˴ϴ٠- ¼±ÅÃÀû, ByRef ±×¸®°í °¡º¯ ¸Å°³º¯¼ö¸¦ Áö¿øÇÕ´Ï´Ù.

getÀ̳ª setÀÇ ¹Ýȯ°ªÀº ÇØ´ç Ư¼ºÀ» ¿äûÇÑ ÇÏÀ§-Ç¥Çö½ÄÀÇ °á°ú°¡ µË´Ï´Ù. ¿¹¸¦ µé¾î, val := obj.Property := 42´Â setÀÇ ¹Ýȯ °ªÀ» val¿¡ ÀúÀåÇÕ´Ï´Ù.

°¢ Ŭ·¡½º´Â Ư¼ºÀÇ Àý¹Ý¸¸ ¶Ç´Â µÑ ´Ù ¿ÂÀüÇÏ°Ô Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù (Ư¼º=¼Ó¼º). Ŭ·¡½º°¡ Ư¼ºÀ» ¿À¹ö¶óÀ̵å Çϸé base.Property¸¦ »ç¿ëÇÏ¿© ÀÚ½ÅÀÇ ±âº» Ŭ·¡½º¿¡ Á¤ÀÇµÈ Æ¯¼º¿¡ Á¢±ÙÇÒ ¼ö ÀÖ½À´Ï´Ù. getÀ̳ª setÀÌ Á¤ÀǵǾî ÀÖÁö ¾ÊÀ¸¸é, ±âº» Ŭ·¡½º°¡ ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù. setÀÌ Á¤ÀǵǾî ÀÖÁö ¾Ê°í ¸ÞŸ-ÇÔ¼ö³ª ±âº» Ŭ·¡½º¿¡ ÀÇÇÏ¿© 󸮵ÇÁö ¾ÊÀº °æ¿ì, °ªÀ» °´Ã¼¿¡ ÀúÀåÇÏ¸é ±× Æ¯¼ºÀÌ ºÒ´ÉÀÌ µÇ´Â È¿°ú°¡ ÀÖ½À´Ï´Ù.

³»ºÎÀûÀ¸·Î, get°ú setÀº µÎ °³ÀÇ ´Ù¸¥ ¸Þ½îµåÀÔ´Ï´Ù. ±×·¡¼­ º¯¼ö¸¦ °øÀ¯ÇÒ ¼ö ¾ø½À´Ï´Ù (this¿¡ ÀúÀåÇÑ º¯¼ö´Â °¡´ÉÇÕ´Ï´Ù).

¸ÞŸ-ÇÔ¼ö´Â °´Ã¼ÀÇ ¸Þ½îµå¿Í Ư¼º¿¡ Á¢±ÙÀ» º¸´Ù ³Ð°Ô Á¦¾îÇÕ´Ï´Ù. ±×·¯³ª ´õ º¹ÀâÇÏ°í ¿¡·¯¸¦ ÀÏÀ¸Å°´Â °æÇâÀÌ ´õ ³ô½À´Ï´Ù.

±¸¼º°ú Æı«

ÆÄ»ý °´Ã¼°¡ new Å°¿öµå·Î »ý¼ºµÉ ¶§¸¶´Ù [requires v1.1.00+], ±×ÀÇ ±â¹Ý Ŭ·¡½º¿¡ Á¤ÀÇµÈ __New ¸Þ½îµå°¡ È£ÃâµË´Ï´Ù. ÀÌ ¸Þ½îµå´Â ¸Å°³º¯¼ö¸¦ ¹Þ¾Æ, ±× °´Ã¼¸¦ ÃʱâÈ­ÇÏ°í new ¿¬»êÀÚÀÇ °á°ú¸¦ °ªÀ» µ¹·ÁÁÜÀ¸·Î½á ¿À¹ö¶óÀ̵åÇÒ ¼ö ÀÖ½À´Ï´Ù. °´Ã¼°¡ Æı«µÉ ¶§, __Delete°¡ È£ÃâµË´Ï´Ù. ¿¹¸¦ µé¾î:

m1 := new GMem(0, 20)
m2 := {base: GMem}.__New(0, 30)

class GMem
{
    __New(aFlags, aSize)
    {
        this.ptr := DllCall("GlobalAlloc", "uint", aFlags, "ptr", aSize, "ptr")
        if !this.ptr
            return ""
        MsgBox % "New GMem of " aSize " bytes at address " this.ptr "."
        return this  ; 'new' ¿¬»êÀÚ¸¦ »ç¿ëÇϸé ÀÌ ÁÙÀº »ý·«ÇÒ ¼ö ÀÖ´Ù.
    }

    __Delete()
    {
        MsgBox % "Delete GMem at address " this.ptr "."
        DllCall("GlobalFree", "ptr", this.ptr)
    }
}

__Delete´Â "__Class"¸¦ Å°·Î °¡Áö´Â °´Ã¼¿¡ È£ÃâµÇÁö ¾Ê½À´Ï´Ù. Ŭ·¡½º °´Ã¼°¡ ÀÌ Å°¸¦ ±âº»°ªÀ¸·Î °¡Áý´Ï´Ù.

¸ÞŸ-ÇÔ¼ö

¸Þ½îµå ±¸¹®:
class ClassName {
    __Get([Key, Key2, ...])
    __Set([Key, Key2, ...], Value)
    __Call(Name [, Params...])
}

ÇÔ¼ö ±¸¹®:
MyGet(this [, Key, Key2, ...])
MySet(this [, Key, Key2, ...], Value)
MyCall(this, Name [, Params...])

ClassName := { __Get: Func("MyGet"), __Set: Func("MySet"), __Call: Func("MyCall") }

¸ÞŸ-ÇÔ¼ö´Â ¸ñÇ¥ °´Ã¼ ¾È¿¡ Å°¸¦ ¿äûÇßÁö¸¸ ¾È¿¡¼­ ¹ß°ßÇÒ ¼ö ¾øÀ» ¶§ ÀϾ ÇàÀ§¸¦ Á¤ÀÇÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, obj.key¿¡ °ªÀÌ ÇÒ´çµÇÁö ¾Ê¾Ò´Ù¸é, __Get ¸ÞŸ-ÇÔ¼ö¸¦ ¿äûÇÕ´Ï´Ù. ºñ½ÁÇÏ°Ô, obj.key := value´Â __Set¸¦ ¿äûÇÏ°í obj.key()´Â __Call¸¦ È£ÃâÇÕ´Ï´Ù. ÀÌ ¸ÞŸ-ÇÔ¼öµé (¶Ç´Â ¸Þ½îµåµé)Àº obj.base, obj.base.base µîµî¿¡ Á¤ÀÇÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

½ºÅ©¸³Æ®°¡ ¸ñÇ¥ °´Ã¼ ¾È¿¡ Á¸ÀçÇÏÁö ¾Ê´Â Å°¸¦ ¿­¶÷Çϰųª ¼³Á¤Çϰųª ¶Ç´Â È£ÃâÇϸé, º£À̽º °´Ã¼°¡ ´ÙÀ½°ú °°ÀÌ ¿äûµË´Ï´Ù:

ÀÏÄ¡ÇÏ´Â Å°¸¦ ¸ÞŸ-ÇÔ¼ö°¡ °´Ã¼¿¡ ÀúÀåÇÏÁö¸¸ ¹Ýȯ(return)ÇÏÁö ¾ÊÀ¸¸é, ±× ÇàÀ§´Â ¸¶Ä¡ Å°°¡ óÀ½ºÎÅÍ ±× °´Ã¼¿¡ Á¸ÀçÇÑ °Í°ú °°½À´Ï´Ù. __SetÀ» »ç¿ëÇÏ´Â ¿¹Á¦´Â ¹è¿­ÀÇ ¹è¿­ ¼­ºê-Ŭ·¡½ÌÇϱ⸦ ÂüÁ¶ÇϽʽÿÀ.

¿¬»êÀÌ ¿©ÀüÈ÷ 󸮵ÇÁö ¾Ê¾Ò´Ù¸é, ÀÌ°ÍÀÌ ³»Àå ÇÔ¼öÀÎÁö ¾Æ´Ï¸é ³»Àå Ư¼ºÀÎÁö Á¡°ËÇϽʽÿÀ:

¿©ÀüÈ÷ ¿¬»êÀÌ Ã³¸®µÇÁö ¾Ê¾Ò´Ù¸é,

¾Ë·ÁÁø ÇÑ°è:

µ¿Àû Ư¼º

__Get°ú __Set¸¦ »ç¿ëÇÏ¿© °ªµéÀ» ƯÁ¤ ¹æ½ÄÀ¸·Î °è»êÇϰųª Á¦ÇÑÇÒ ¼ö Àִ Ư¼ºÀ» ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, R, G, B ±×¸®°í RGB Ư¼ºÀ» °¡Áö°í "Color" °´Ã¼¸¦ ±¸Çö ÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¿¡¼­ ¿ÀÁ÷ RGB °ª¸¸ ½ÇÁ¦·Î ÀúÀåµË´Ï´Ù:

red  := new Color(0xff0000), red.R -= 5
cyan := new Color(0x00ffff)

MsgBox % "red: " red.R "," red.G "," red.B " = " red.RGB
MsgBox % "cyan: " cyan.R "," cyan.G "," cyan.B " = " cyan.RGB

class Color
{
    __New(aRGB)
    {
        this.RGB := aRGB
    }

    __Get(aName)
    {
        if (aName = "R")
            return (this.RGB >> 16) & 255
        if (aName = "G")
            return (this.RGB >> 8) & 255
        if (aName = "B")
            return this.RGB & 255
    }

    __Set(aName, aValue)
    {
        if aName in R,G,B
        {
            aValue &= 255

            if      (aName = "R")
                this.RGB := (aValue << 16) | (this.RGB & ~0xff0000)
            else if (aName = "G")
                this.RGB := (aValue << 8)  | (this.RGB & ~0x00ff00)
            else  ; (aName = "B")
                this.RGB :=  aValue        | (this.RGB & ~0x0000ff)

            ; 'Return'À» »ç¿ëÇÏ¿© »õ Å°-°ª ½ÖÀÌ ¸¸µé¾îÁöÁö ¾Ê¾ÒÀ½À» ¾Ë·Á¾ß ÇÕ´Ï´Ù.
            ; ¶ÇÇÑ 'x := clr[name] := val'¿¡¼­ ¹«¾ùÀ» 'x'¿¡ ÀúÀåÇÒÁö Á¤ÀÇÇÕ´Ï´Ù:
            return aValue
        }
    }
}

ÇÔ¼ö·Î¼­ÀÇ °´Ã¼

obj.func(param)¿Í °°ÀÌ È£ÃâÇϸé, obj.func´Â ÇÔ¼ö À̸§À̳ª °´Ã¼¸¦ ´ãÀ» ¼ö ÀÖ½À´Ï´Ù. obj.func¿¡ °´Ã¼°¡ µé¾î ÀÖ´Ù¸é, ±× °´Ã¼´Â ±× ¸Þ½îµå À̸§ ´ë½Å¿¡ (obj.func)[obj]()ó·³ obj·Î ¿äûÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ëºÎºÐÀÇ °æ¿ì obj.func[obj]´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. ´ë½Å¿¡ obj.func's __Call ¸ÞŸ-ÇÔ¼ö°¡ ¿äûµË´Ï´Ù. À̸¦ ÀÌ¿ëÇÏ¸é ¾Æ·¡ ¿¹Á¦¿¡ º¸¿©ÁÖ´Â ¹Ù¿Í °°ÀÌ ÇÔ¼ö È£ÃâÀÇ ÇàÀ§¸¦ Ãß»óÀûÀÎ ¹æ½ÄÀ¸·Î ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù:

; ÇÔ¼ö ¹è¿­À» À§ÇÑ ÇÁ·ÎÅäŸÀÔÀ» »ý¼ºÇÑ´Ù.
FuncArrayType := {__Call: "FuncType_Call"}
; ÇÔ¼ö ¹è¿­À» »ý¼ºÇÑ´Ù.
funcArray := {1: "One", 2: "Two", base: FuncArrayType}
; ¹è¿­À» ¸Þ½îµå·Î »ç¿ëÇÏ´Â °´Ã¼¸¦ »ý¼ºÇÑ´Ù.
obj := {func: funcArray}
; ¸Þ½îµå¸¦ È£ÃâÇÑ´Ù.
obj.func("foo", "bar")

FuncType_Call(func, obj, params*)
{
    ; ÇÔ¼ö ¸®½ºÆ®¸¦ È£ÃâÇÑ´Ù.
    Loop % ObjMaxIndex(func)
        func[A_Index](params*)
}

One(param1, param2) {
    ListVars
    Pause
}
Two(param1, param2) {
    ListVars
    Pause
}

ÀÌ Å×Å©´ÐÀ» »ç¿ëÇÏ¸é ¸ÞŸ-ÇÔ¼öó·³ ÇàÀ§ÇÏ´Â °´Ã¼¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ÀÌÀü ¼½¼Ç¿¡¼­ ´Ù·é Ư¼º°ú ºñ½ÁÇÏ°Ô µ¿Àû Ư¼ºµéÀ» Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù. (±×·¸Áö¸¸, ÀÌ ¿¹Á¦´Â Ư¼º Áö¿øÀ¸·Î ´ëüµÇ¾úÀ½À» ÁÖÀÇÇϽʽÿÀ.) ¿¹¸¦ µé¾î:

blue := new Color(0x0000ff)
MsgBox % blue.R "," blue.G "," blue.B

class Properties
{
    __Call(aTarget, aName, aParams*)
    {
        ; ÀÌ Æ¯¼º °´Ã¼¿¡ ÀÌ Àý¹Ý-Ư¼º¿¡ ´ëÇÑ Á¤ÀÇ°¡ µé¾î ÀÖ´Ù¸é, ±×°ÍÀ» È£ÃâÇÕ´Ï´Ù. 
        ; this.HasKey(aName)¸¦ »ç¿ëÇÏÁö ¾Êµµ·Ï ÁÖÀÇÇÕ´Ï´Ù. ÀÌ°ÍÀ» »ç¿ëÇϸé __Call ¾ÈÀ¸·Î Àç±Í°¡ ÀϾ´Ï´Ù.
        if IsObject(aTarget) && ObjHasKey(this, aName)
            return this[aName].(aTarget, aParams*)
    }
}

class Color
{
    __New(aRGB)
    {
        this.RGB := aRGB
    }

    class __Get extends Properties
    {
        R() {
            return (this.RGB >> 16) & 255
        }
        G() {
            return (this.RGB >> 8) & 255
        }
        B() {
            return this.RGB & 255
        }
    }

    ;...
}

¹è¿­ÀÇ ¹è¿­À» ¼­ºê-Ŭ·¡½ÌÇϱâ

table[x, y] := content¿Í °°ÀÌ ´ÙÁß-¸Å°³º¯¼ö ÇÒ´ç ¶§¹®¿¡ ¹¬½ÃÀûÀ¸·Î »õ·Î¿î °´Ã¼°¡ »ý¼ºµÉ ¶§, ±× »õ °´Ã¼´Â º¸Åë º£À̽º°¡ ¾ø°í ±×·¯¹Ç·Î ¸ÂÃã ¸Þ½îµåµµ ¾ø°í Ưº°ÇÑ ÇàÀ§µµ ¾ø½À´Ï´Ù. __Set´Â ¾Æ·¡¿¡ º¸¿©ÁÖ´Â ¹Ù¿Í °°ÀÌ ÀÌ·± °´Ã¼µéÀ» ÃʱâÈ­ÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

x := {base: {addr: Func("x_Addr"), __Set: Func("x_Setter")}}

; °ªÀ» ÇÒ´çÇÑ´Ù. ¹¬½ÃÀûÀ¸·Î x_Setter¸¦ »ç¿ëÇÏ¿© ÇÏÀ§-°´Ã¼¸¦ ¸¸µç´Ù.
x[1,2,3] := "..."

; °ªÀ» ¿­¶÷ÇÏ°í ¿¹Á¦ ¸Þ½îµå¸¦ È£ÃâÇÑ´Ù.
MsgBox % x[1,2,3] "`n" x.addr() "`n" x[1].addr() "`n" x[1,2].addr()

x_Setter(x, p1, p2, p3) {
    x[p1] := new x.base
}

x_Addr(x) {
    return &x
}

x_Setter´Â ³× °³ÀÇ Çʼö ¸Å°³º¯¼ö°¡ Àֱ⠶§¹®¿¡, µÎ °³ ÀÌ»óÀÇ Å°°¡ ÀÖÀ» °æ¿ì¿¡¸¸ È£ÃâµË´Ï´Ù. À§ÀÇ ÇÒ´çÀÌ ÀϾ ¶§, ´ÙÀ½°ú °°Àº ÀÏÀÌ ÀϾ´Ï´Ù:

±âº» º£À̽º °´Ã¼

ºñ-°´Ã¼ °ªÀÌ °´Ã¼ ±¸¹®°ú ÇÔ²² »ç¿ëµÉ ¶§, ±âº» º£À̽º °´Ã¼°¡ ¿äûµË´Ï´Ù. ÀÌ°ÍÀº µð¹ö±ë¿¡ »ç¿ëÇϰųª ¶Ç´Â ¹®ÀÚ¿­À̳ª, ¼ýÀÚ, ±×¸®°í/¶Ç´Â º¯¼ö¿¡ ´ëÇÏ¿© °´Ã¼-·ùÀÇ ÇàÀ§¸¦ Àü¿ªÀûÀ¸·Î Á¤ÀÇÇϴµ¥ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ±âº» º£À̽º´Â ºñ-°´Ã¼ °ªÀ» °¡Áö°í .base¸¦ »ç¿ëÇÏ¿© Á¢±ÙÀÌ °¡´ÉÇÕ´Ï´Ù; ¿¹¸¦ µé¸é, "".base. ±âº» º£À̽º´Â "".base := Object()ó·³ ¼³Á¤(set)ÇÒ ¼ö ¾øÁö¸¸, ±âº» º£À̽º´Â "".base.base := Object()ó·³ ±× ÀÚü·Î º£À̽º°¡ ÀÖ½À´Ï´Ù.

ÀÚµ¿ º¯¼ö ÃʱâÈ­

set ¿¬»êÀÇ ¸ñÇ¥·Î ºó º¯¼ö°¡ »ç¿ëµÉ ¶§, Á÷Á¢ÀûÀ¸·Î __Set meta-ÇÔ¼ö¿¡ °Ç³×Áý´Ï´Ù. ±×·¡¼­ »õ °´Ã¼¸¦ º¯¼ö¿¡ »ðÀÔÇÒ ±âȸ°¡ ÀÖ½À´Ï´Ù. °£·«ÇÏ°Ô Çϱâ À§ÇØ, ´ÙÀ½ ¿¹Á¦´Â ´ÙÁß ¸Å°³º¯¼ö¸¦ Áö¿øÇÏÁö ¾Ê½À´Ï´Ù; ¹°·Ð °¡º¯ ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é °¡´ÉÇÕ´Ï´Ù.

"".base.__Set := Func("Default_Set_AutomaticVarInit")

empty_var.foo := "bar"
MsgBox % empty_var.foo

Default_Set_AutomaticVarInit(ByRef var, key, value)
{
    if (var = "")
        var := Object(key, value)
}

ÀÇ»ç-Ư¼º

°´Ã¼ÀÇ "»çÅÁ ±¸¹®"À» ¹®ÀÚ¿­°ú ¼ýÀÚ¿¡ Àû¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

"".base.__Get := Func("Default_Get_PseudoProperty")
"".base.is    := Func("Default_is")

MsgBox % A_AhkPath.length " == " StrLen(A_AhkPath)
MsgBox % A_AhkPath.length.is("integer")

Default_Get_PseudoProperty(nonobj, key)
{
    if (key = "length")
        return StrLen(nonobj)
}

Default_is(nonobj, type)
{
    if nonobj is %type%
        return true
    return false
}

³»Àå ÇÔ¼öµµ ¿ª½Ã »ç¿ëÇÒ ¼ö ÀÖÁö¸¸, ÀÌ °æ¿ì °ýÈ£¸¦ »©¸ÔÀ¸¸é ¾È µË´Ï´Ù. ÁÖÀÇÇϽʽÿÀ:

"".base.length := Func("StrLen")
MsgBox % A_AhkPath.length() " == " StrLen(A_AhkPath)

µð¹ö±ë

°ªÀ» °´Ã¼Ã³·³ Ãë±ÞµÇµµ·Ï Çã¿ëÇÏ¸é ¹Ù¶÷Á÷ÇÏÁö ¾Ê½À´Ï´Ù. ºñ-°´Ã¼ °ªÀÌ ¿äûµÉ ¶§¸¶´Ù °æ°í »óÀÚ°¡ ³ªÅ¸³¯ ¼ö ÀÖ½À´Ï´Ù:

"".base.__Get := "".base.__Set := "".base.__Call := Func("Default__Warn")

empty_var.foo := "bar"
x := (1 + 1).is("integer")

Default__Warn(nonobj, p1="", p2="", p3="", p4="")
{
    ListLines
    MsgBox ºñ-°´Ã¼ °ªÀÌ ºÎÀûÀýÇÏ°Ô ¿äûµÇ¾ú½À´Ï´Ù.`n`nƯÈ÷: %nonobj%
}

±¸Çö

ÂüÁ¶È½¼ö-¼¼±â

¿ÀÅäÇÖÅ°´Â ±âº»ÀûÀÎ ÂüÁ¶È½¼ö-¼¼±â ¸ÅÄ¿´ÏÁòÀ» »ç¿ëÇÏ¿© ÇÑ °´Ã¼°¡ »ç¿ëÇÏ´Â ÀÚ¿øÀÌ ´õ ÀÌ»ó ÂüÁ¶µÇÁö ¾ÊÀ» ¶§ ÀÚµ¿À¸·Î ÇØÁ¦ÇÕ´Ï´Ù. ½ºÅ©¸³Æ® ÀúÀÚ´Â ÀÌ ¸ÞÄ¿´ÏÁòÀ» ¸í½ÃÀûÀ¸·Î ¿äûÇÏ¸é ¾È µË´Ï´Ù. ´Ü °´Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ°¡ °ü¸®µÇÁö ¾Ê¾Æ¼­ Á÷Á¢ ó¸®ÇÒ °æ¿ì´Â Á¦¿ÜÇÕ´Ï´Ù. ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â ObjAddRef¸¦ ÂüÁ¶ÇϽʽÿÀ.

; °´Ã¼ÀÇ ÂüÁ¶ Ƚ¼ö¸¦ Áõ°¡½ÃÄÑ "»ì¾Æ ÀÖµµ·Ï À¯ÁöÇÑ´Ù":
ObjAddRef(address)
...
; °³Ã¼ÀÇ ÂüÁ¶ Ƚ¼ö¸¦ °¨¼Ò½ÃÄÑ ÇØÁ¦µÇµµ·Ï ÇÑ´Ù:
ObjRelease(address)

±×·¸Áö¸¸, ObjAddRef´Â Object(obj)¸¦ ÅëÇÏ¿© ÁÖ¼Ò¸¦ ÃÖÃʷΠȹµæÇÒ ¶§´Â »ç¿ëÇÒ ÇÊ¿ä°¡ ¾ø½À´Ï´Ù.

ÀϹÝÀûÀ¸·Î ÇÑ °´Ã¼ÀÇ ÁÖ¼ÒÀÇ °¢ »õ »çº»Àº °´Ã¼ ÂüÁ¶·Î °£ÁÖÇØ¾ß ÇÕ´Ï´Ù. ´Ü, ±× ½ºÅ©¸³Æ®°¡ ObjAddRef ±×¸®°í/¶Ç´Â ObjRelease¸¦ ÀûÀýÇÏ°Ô È£ÃâÇÒ Ã¥ÀÓÀÌ ÀÖ´Â °æ¿ì´Â ¿¹¿ÜÀÔ´Ï´Ù. ¿¹¸¦ µé¸é, x := address¿Í °°Àº °ÍÀ» ÅëÇÏ¿© ÁÖ¼Ò°¡ º¹»çµÉ ¶§¸¶´Ù, ObjAddRef °¡ È£ÃâµÇ¾î ÂüÁ¶ Ƚ¼ö¸¦ Áõ°¡½ÃÄÑ¾ß ÇÕ´Ï´Ù. ºñ½ÁÇÏ°Ô, ½ºÅ©¸³Æ®°¡ ±× °´Ã¼ÀÇ ÁÖ¼ÒÀÇ Æ¯º°ÇÑ »çº»°úÀÇ ÀÛ¾÷ÀÌ ³¡³¯ ¶§¸¶´Ù, ObjRelease¸¦ È£ÃâÇØ¾ß ÇÕ´Ï´Ù. ÀÌ·¸°Ô ÇÏ¸é ±×ÀÇ ¸¶Áö¸· ÂüÁ¶°¡ »ç¶óÁú ¶§ È®½ÇÇÏ°Ô °´Ã¼°¡ ÇØÁ¦µË´Ï´Ù - ±× Àü¿¡´Â ÇØÁ¦µÇÁö ¾Ê½À´Ï´Ù.

°´Ã¼ÀÇ ¸¶Áö¸· ÂüÁ¶°¡ ÇØÁ¦µÉ ¶§ Äڵ带 ½ÇÇàÇÏ·Á¸é, __Delete ¸ÞŸ-ÇÔ¼ö¸¦ ±¸ÇöÇÕ´Ï´Ù.

¾Ë·ÁÁø ÇÑ°è:

ÇÁ·Î±×·¥ÀÌ Á¾·áÇÒ ¶§ °´Ã¼°¡ »ç¿ëÇÏ´Â ¸Þ¸ð¸®¸¦ ¿î¿µÃ¼Á¦°¡ ¿ä±¸ÇÔ¿¡µµ ºÒ±¸ÇÏ°í, ±× °´Ã¼¸¦ °¡¸®Å°´Â ¸ðµç ÂüÁ¶°¡ Ç®¸®Áö ¾Ê´Â ÇÑ, __Delete´Â È£ÃâµÇÁö ¾Ê½À´Ï´Ù. ÀÌ°ÍÀº Àӽà ÆÄÀÏ°ú °°ÀÌ, ¿î¿µ üÁ¦°¡ ÀÚµ¿À¸·Î ¿ä±¸ÇÏÁö ¾Ê´Â ´Ù¸¥ ÀÚ¿øÀ» Ç®¾î¹ö¸®¸é ¹®Á¦°¡ µÉ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù.

°´Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ

¾î¶² °æ¿ì´Â DllCallÀ» ÅëÇÏ¿© °´Ã¼¸¦ ¿ÜºÎ Äڵ忡 °Ç³Ú ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ¶Ç´Â ±×°ÍÀ» ÀÌÁø µ¥ÀÌÅÍ ±¸Á¶·Î ÀúÀåÇÏ¿© ³ªÁß¿¡ ¿­¶÷ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. °´Ã¼ÀÇ ÁÖ¼Ò´Â x := &obj·Î ¿­¶÷ÇÒ ¼ö ÀÖ½À´Ï´Ù; ±×·¸Áö¸¸, º¯¼ö obj°¡ ¼Ò°ÅµÇ¸é, ±× °´Ã¼´Â ÀÏÂî±â ÇØÁ¦µÇ¾î ¹ö¸± ¼ö ÀÖ½À´Ï´Ù. ÀÌ·± ÀÏÀÌ ÀϾÁö ¾Êµµ·Ï È®ÀÎÇÏ·Á¸é, À§¿¡ º¸¿©ÁØ ¹Ù¿Í °°ÀÌ ObjAddRef¸¦ »ç¿ëÇϰųª ¾Æ·¡¿¡ º¸¿©ÁÖ´Â ¹Ù¿Í °°ÀÌ Object() ÇÔ¼ö¸¦ »ç¿ëÇÕ´Ï´Ù:

address := Object(object)

°Ô´Ù°¡, ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÁÖ¼Ò¸¦ ´Ù½Ã ÂüÁ¶·Î º¯È¯ÇÒ ¼ö ÀÖ½À´Ï´Ù:

object := Object(address)

¾î´À °æ¿ìµç °´Ã¼ÀÇ ÂüÁ¶-Ƚ¼ö´Â ÀÚµ¿À¸·Î Áõ°¡µË´Ï´Ù. ±×·¡¼­ °´Ã¼´Â ³Ê¹« À̸£°Ô ÇØÁ¦µÇÁö ¾Ê½À´Ï´Ù.

ÀÌ ÇÔ¼ö´Â ¿¹¸¦ µé¾î COM °´Ã¼ ·¡ÆÛ³ª ÆÄÀÏ °´Ã¼¿Í °°ÀÌ Object()·Î »ý¼ºµÇÁö ¾ÊÀº °´Ã¼¿¡µµ ¶È °°ÀÌ Àû¿ëµÇ´Â °Í¿¡ ÁÖ¸ñÇϽʽÿÀ.