API Basic Callbacks ko - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

AddressOf / callbacks

ClassicUO โ€ข Basic

AddressOf๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ Sub ๋˜๋Š” Function ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ ์ฆ‰์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ปฌ๋ ‰์…˜์— ์ €์žฅํ•˜์—ฌ ์ฒ˜๋ฆฌ ๊ทœ์น™์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ ๊ตฌ๋ฌธ

Dim callback = AddressOf ProcedureName
Dim callback As Object = AddressOf Tools.FunctionName
callback(arguments)
callback.Invoke(arguments)
Process(values, AddressOf Predicate)

๋งค๊ฐœ๋ณ€์ˆ˜

  • ProcedureName โ€” ์„ ์–ธ๋œ ํ”„๋กœ์‹œ์ € ์ด๋ฆ„์ด๋ฉฐ ํ•„์š”ํ•˜๋ฉด Module ์ด๋ฆ„์„ ๋ถ™์ž…๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜๋Š” ์„ ์–ธ์€ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„, ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” Private, ์˜ค๋ฒ„๋กœ๋“œ ์ด๋ฆ„์€ ์‹คํ–‰ ์ „์— ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. Basic ๋‚ด์žฅ ํ•จ์ˆ˜๋‚˜ UO ๋ช…๋ น์€ ๊ณ ์œ ํ•œ ์ด๋ฆ„์˜ ์Šคํฌ๋ฆฝํŠธ ๋ž˜ํผ๋ฅผ ๋งŒ๋“  ๋’ค ๊ทธ AddressOf๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„ ๋’ค์— ๊ด„ํ˜ธ๋ฅผ ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • callback / arguments โ€” callback์€ Object ๊ฐ’์ž…๋‹ˆ๋‹ค. callback(...)๊ณผ callback.Invoke(...)๋Š” ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ์—์„œ ๋™๊ธฐ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ์‹ค์ œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜ ์š”์†Œ๋ฅผ ๋จผ์ € ๋ณ€์ˆ˜์— ์ €์žฅํ•œ ๋’ค ํ˜ธ์ถœํ•˜์„ธ์š”. ์ธ์ˆ˜ ๊ณ„์‚ฐ ์ „์— ์ฐธ์กฐ๋ฅผ ๊ณ ์ •ํ•˜๋ฏ€๋กœ ์ธ์ˆ˜๊ฐ€ callback์„ ๋ฐ”๊พธ๋”๋ผ๋„ ์ด๋ฒˆ ํ˜ธ์ถœ ๋Œ€์ƒ์€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ByRef / ByVal / Optional / ParamArray โ€” ByVal์€ ๊ฐ’์ด๋‚˜ ์ฐธ์กฐ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ByRef๋Š” ๋ณ€๊ฒฝ์„ ๋‹ค์‹œ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. Optional์€ ์ƒ๋žตํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  ParamArray๋Š” ์œ„์น˜ ์ธ์ˆ˜๋ฅผ ๋ชจ์๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ์ธ์ˆ˜๋Š” ์œ„์น˜ ์ธ์ˆ˜ ๋’ค์— ์”๋‹ˆ๋‹ค. ParamArray ๊ฐ’์€ ์œ„์น˜ ์ธ์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ํ˜ธ์ถœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์ด๋ฆ„์ด๋‚˜ ๊ฐœ์ˆ˜๋Š” ์ธ์ˆ˜ ๋ถ€์ž‘์šฉ ์ „์— ์˜ค๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

AddressOf๋Š” Object ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ID, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ, Boolean ๋˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Function ํ˜ธ์ถœ์€ ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ Return ์‹์ด ์—†๋Š” Sub๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(Unit). IsPositive๋Š” 1/True ๋˜๋Š” 0/False๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ 1, 3์˜ Main์€ String, ์˜ˆ์ œ 2๋Š” Integer 15๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋™์ž‘

  • ์ฐธ์กฐ๋Š” ์ƒ์„ฑ ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์บก์ฒ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋žŒ๋‹ค๋‚˜ ํด๋กœ์ €๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋กœ๋“œ๋œ ์Šคํฌ๋ฆฝํŠธ์— ์†ํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„์ด๋‚˜ ๋‹ค์‹œ ๋กœ๋“œํ•œ ์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์ด์ „ ์ฐธ์กฐ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Public ํŒฉํ„ฐ๋ฆฌ๋Š” ์ž์‹ ์˜ Private ๋„์šฐ๋ฏธ ์ฐธ์กฐ๋ฅผ ์˜๋„์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ค€๋น„ ๋‹จ๊ณ„์—์„œ ์ด๋ฆ„๊ณผ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” AddressOf ์œ„์น˜๋งˆ๋‹ค ๋ถˆ๋ณ€ ์ฐธ์กฐ๋ฅผ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ๋งˆ๋‹ค ํ˜„์žฌ ๋ณ€์ˆ˜๋ฅผ ์ฝ๊ณ  ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ํ™•์ธํ•œ ๋’ค ์ธ์ˆ˜๋ฅผ ์ž‘์„ฑ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ๋ฒˆ์”ฉ ๊ณ„์‚ฐํ•˜์—ฌ ์ผ๋ฐ˜ ํ”„๋กœ์‹œ์ € ํ”„๋ ˆ์ž„์œผ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ByRef์™€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ์ง์ ‘ ํ˜ธ์ถœ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์Šค๋ ˆ๋“œ๋‚˜ ํƒ€์ด๋จธ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ •์ง€์™€ ์ทจ์†Œ๋Š” ์ผ๋ฐ˜ ๊ฒ€์‚ฌ ์ง€์ ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์ฝœ๋ฐฑ ์•ˆ์˜ ๋ฐ˜๋ณต๋ฌธ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋Š” ํ˜ธ์ถœ์ž์˜ Catch/Finally๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. Catch๊ฐ€ ๋น„์ƒ ์ •์ง€๋ฅผ ์‚ผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐจ๋‹จ๋˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ˜ธ์ถœ์—๋Š” ๊ณ ์œ ํ•œ ์ทจ์†Œ ์ œํ•œ์ด ๋‚จ์Šต๋‹ˆ๋‹ค.
  • ์ด ๊ธฐ๋Šฅ์€ Delegate ํ˜•์‹ ์„ ์–ธ, ๋žŒ๋‹ค, DLL ํ•จ์ˆ˜ ํฌ์ธํ„ฐ, ์˜ค๋ฒ„๋กœ๋“œ ์ฐธ์กฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. AddressOf์— UO.๋ฅผ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉฐ ๋ž˜ํผ ์•ˆ์˜ ๊ฒŒ์ž„ ๋ช…๋ น์—๋Š” UO.๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘์ฒฉ ์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์€ ์ฝœ๋ฐฑ๊ณผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ํฌํ•จํ•ด 32ํ”„๋ ˆ์ž„์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์ดˆ๊ณผํ•˜๋ฉด ์žก์„ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๊นŠ์€ ์ฒ˜๋ฆฌ๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋ฐ˜ํ™˜์ด๋‚˜ ์˜ค๋ฅ˜ ์‹œ ํ”„๋ ˆ์ž„์ด ํ•ด์ œ๋˜์–ด ์ดํ›„ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

1. ์กฐ๊ฑด ํ•จ์ˆ˜๋กœ ๋ชฉ๋ก ํ•„ํ„ฐ๋ง

# values๋Š” ์ž…๋ ฅ List์ด๊ณ  predicate๋Š” AddressOf IsPositive์ž…๋‹ˆ๋‹ค. FilterValues๋Š” ์ˆ˜๋งˆ๋‹ค predicate(number)๋ฅผ ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์–‘์ˆ˜ 4์™€ 7๋งŒ ๋‚จ์•„ selected.Count()=2, selected[0]=4์ด๋ฏ€๋กœ Main์€ "2:4"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋„์šฐ๋ฏธ๋Š” ์Šคํฌ๋ฆฝํŠธ์— ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ถ”๊ฐ€ API ๋ช…๋ น์ด ์•„๋‹™๋‹ˆ๋‹ค.
Option Explicit On
Function IsPositive(ByVal number) As Boolean
    Return number > 0
End Function

Function FilterValues(ByVal values, ByVal predicate)
    Dim result = List()
    For Each number In values
        If predicate(number) Then
            result.Add(number)
        End If
    Next
    Return result
End Function

Sub Main()
    Dim numbers = List()
    numbers.Add(-2)
    numbers.Add(4)
    numbers.Add(7)
    Dim selected = FilterValues(numbers, AddressOf IsPositive)
    Return CStr(selected.Count()) & ":" & CStr(selected[0])
End Sub

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์‹คํ–‰ ์„ค๋ช…:

values๋Š” ์ž…๋ ฅ List์ด๊ณ  predicate๋Š” AddressOf IsPositive์ž…๋‹ˆ๋‹ค. FilterValues๋Š” ์ˆ˜๋งˆ๋‹ค predicate(number)๋ฅผ ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์–‘์ˆ˜ 4์™€ 7๋งŒ ๋‚จ์•„ selected.Count()=2, selected[0]=4์ด๋ฏ€๋กœ Main์€ "2:4"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋„์šฐ๋ฏธ๋Š” ์Šคํฌ๋ฆฝํŠธ์— ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ถ”๊ฐ€ API ๋ช…๋ น์ด ์•„๋‹™๋‹ˆ๋‹ค.

2. ํ˜ธ์ถœ์ž์˜ ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ

# AddAmount์˜ total์€ ByRef, amount๋Š” ByVal์ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค. update(total)์€ 10์„ 11๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Invoke(amount:=4, total:=total)๋Š” ์ด๋ฆ„์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ 11์„ 15๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ByRef๊ฐ€ ์›๋ž˜ ๋ณ€์ˆ˜์— ๋‹ค์‹œ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. Sub๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ Main์€ Boolean์ด ์•„๋‹Œ Integer 15๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
Option Explicit On
Sub AddAmount(ByRef total As Integer, Optional ByVal amount = 1)
    total += amount
End Sub

Sub Main()
    Dim update = AddressOf AddAmount
    Dim total = 10
    update(total)
    update.Invoke(amount:=4, total:=total)
    Return total
End Sub

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์‹คํ–‰ ์„ค๋ช…:

AddAmount์˜ total์€ ByRef, amount๋Š” ByVal์ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค. update(total)์€ 10์„ 11๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Invoke(amount:=4, total:=total)๋Š” ์ด๋ฆ„์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ 11์„ 15๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ByRef๊ฐ€ ์›๋ž˜ ๋ณ€์ˆ˜์— ๋‹ค์‹œ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. Sub๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ Main์€ Boolean์ด ์•„๋‹Œ Integer 15๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

3. ๋น„๊ณต๊ฐœ ๊ทœ์น™๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

# Rules.Create๋Š” Private CheckedDouble ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€์—์„œ AddressOf Rules.CheckedDouble์„ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. operation(6)์€ 12๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. operation(-1)์€ ๋Œ€์ž… ์ „์— "negative"๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ result๋Š” 12๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. Catch๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  Finally๋Š” ":done"์„ ๋ถ™์ž…๋‹ˆ๋‹ค. Main์€ "12:negative:done"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. IDE๋ฅผ ๋‹ซ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฉˆ์ถ”์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Option Explicit On
Module Rules
    Private Function CheckedDouble(ByVal number) As Integer
        If number < 0 Then
            Throw "negative"
        End If
        Return number * 2
    End Function

    Public Function Create()
        Return AddressOf CheckedDouble
    End Function
End Module

Sub Main()
    Dim operation = Rules.Create()
    Dim result = operation(6)
    Dim message = ""
    Try
        result = operation(-1)
    Catch problem
        message = problem
    Finally
        message = message & ":done"
    End Try
    Return CStr(result) & ":" & message
End Sub

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ์‹คํ–‰ ์„ค๋ช…:

Rules.Create๋Š” Private CheckedDouble ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€์—์„œ AddressOf Rules.CheckedDouble์„ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. operation(6)์€ 12๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. operation(-1)์€ ๋Œ€์ž… ์ „์— "negative"๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ result๋Š” 12๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. Catch๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  Finally๋Š” ":done"์„ ๋ถ™์ž…๋‹ˆ๋‹ค. Main์€ "12:negative:done"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. IDE๋ฅผ ๋‹ซ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฉˆ์ถ”์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


en ยท ru ยท uk ยท fr ยท de ยท it ยท es ยท zh-tw ยท ja ยท ko

Basic