API Basic Sub ko - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
Sub / Call / Exit Sub / End Sub
ClassicUO โข Basic
Sub๋ ์ฌ๋ฌ ๋ฌธ์ฅ์ ์ด๋ฆ ์๋ ํ๋ก์์ ๋ก ๋ฌถ์ต๋๋ค. ์์ดํ ์ฒ๋ฆฌ, ๊ฒ์ฆ, ๋ง๋ฌด๋ฆฌ ์์ ์ ์ฌ์ฌ์ฉํ ๋ ์ ์ฉํฉ๋๋ค. ํธ์ถ์ ํ์ฌ ์คํฌ๋ฆฝํธ์์ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ฉฐ ๋ณ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ํ์ง ์์ต๋๋ค.
์ ํํ ๊ตฌ๋ฌธ
Sub name(parameters)
statements
End Sub
name(arguments)
Call name(arguments)
Call name arguments
Call name
Exit Sub
Return
Return expression
๋งค๊ฐ๋ณ์
nameโ ์ด๋ฆ์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. ์ง์ ์์ฑํ ํธ์ถ์๋ UO.๋ฅผ ๋ถ์ด์ง ์์ผ๋ฉฐ ๋ชจ๋ ๋ฉค๋ฒ๋ Tools.Work(...)๋ก ํธ์ถํฉ๋๋ค. Public/Private ์ ๊ทผ ๊ท์น์ Basic.Module ๋ฐ Basic.Visibility๋ฅผ ์ฐธ๊ณ ํ์ธ์.parameters / argumentsโ ๋งค๊ฐ๋ณ์๋ ๊ดํธ ์์ ์ ์ธํ๊ณ ์ธ์๋ฅผ ์ ์ธ ์์๋๋ก ์ ๋ฌํฉ๋๋ค. ๊ธฐ๋ณธ์ ByRef์ด๋ฉฐ ByVal์ ๊ฐ ๋ณต์ฌ, Optional์ ์๋ตํ ๊ฐ, ๋ง์ง๋ง ParamArray๋ ์ถ๊ฐ ์ธ์ ๋ฌถ์์ ์ฒ๋ฆฌํฉ๋๋ค. ํ์, ๋ฐฐ์ด, ๊ณต์ ์ฐธ์กฐ, ๋์ฐ๊ธฐ๋ ๋ค์ฏ ๋งค๊ฐ๋ณ์ ์ฅ์์ ์ค๋ช ํฉ๋๋ค.statements / End Subโ ๋ณธ๋ฌธ์ ๋น์ด ์์ด๋ ๋์ง๋ง End Sub๋ก ๋ซ์์ผ ํฉ๋๋ค. ์ฌ๊ท๋ฅผ ํฌํจํ์ฌ ํธ์ถ๋ง๋ค ๋ณ๋์ ์ง์ญ ๋ณ์๋ฅผ ๊ฐ์ง๋๋ค. ํ๋ก์์ ๋ ํ์ผ์ด๋ ๋ชจ๋ ์์ค์ ์ ์ธํ๋ฉฐ ๋ค๋ฅธ ํ๋ก์์ ์์ ์ ์ธํ์ง ์์ต๋๋ค.Callโ name(arguments)์์ Call์ ์ ํ ์ฌํญ์ ๋๋ค. Call name arguments๋ ๊ดํธ ์๋ ์ธ์๋ ํ์ฉํ๊ณ Call name์ ๋งค๊ฐ๋ณ์ ์์ด ํธ์ถํฉ๋๋ค. Call์ ๋ฐํ๊ฐ์ ๋ฒ๋ฆฝ๋๋ค. ์ธ์ ํํ์์ ์๋ฏธ๋ ๊ทธ๋๋ก์ด๋ฉฐ ์ฌ์ฉ์ ์ด๋ฆ์ UO.๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.Exit Sub / Returnโ Exit Sub ๋๋ ํํ์ ์๋ Return์ ํ์ฌ ํธ์ถ์ ๋๋ ๋๋ค. Sub ์์ Return expression์ Basic ํธํ ํ์ฅ์ด๋ฉฐ ์ผ๋ฐ VB.NET Sub์๋ ์์ต๋๋ค. Sub ์์์ Exit Function์ ์ฐ๋ฉด ๋ก๋ ์ค๋ฅ์ ๋๋ค.
๋ฐํ๊ฐ
End Sub, Exit Sub, ๋น Return์ Unit์ ๋ฐํํฉ๋๋ค. ์๋ฏธ ์๋ ๊ฒฐ๊ณผ๊ฐ ์๋ค๋ ๋ป์ด๋ฉฐ ์ฑ๊ณต ํ๋๊ทธ๋ ID๊ฐ ์๋๋๋ค. ๊ธฐ์กด Basic Sub๋ Return expression์ผ๋ก ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค. ByRef๋ ๋ณ๋๋ก ํธ์ถ์์ ๋ณ์๋ฅผ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ ๊ณ์ฐ์ฉ ๋์ฐ๋ฏธ์๋ Function์ ๊ถ์ฅํฉ๋๋ค.
๋์
- ์ค๋น ๋จ๊ณ๋ ํธํ ์ ์ธ๊ณผ Call ํ์์ ์ ๊ทํํ๊ณ ๋ธ๋ก์ ๊ฒ์ฆํ๋ฉฐ ์ด๋ฆ์ ํด์ํฉ๋๋ค. ์ง์ ์ ์ ์ธ์๋ฅผ ๊ณ์ฐํ๊ณ ์ฐ๊ฒฐํฉ๋๋ค. ํธ์ถ์ ์ค๋น๋ ๋ช ๋ น์ ์ฌ์ฌ์ฉํ์ง๋ง ์ง์ญ ๊ฐ์ ๊ณต์ ํ์ง ์์ต๋๋ค.
- ์ธํฐํ๋ฆฌํฐ๋ ํธ์ถ ๋ฒ์๋ฅผ ๋ง๋ค๊ณ ๋ณธ๋ฌธ์ ์คํํ ๋ค ํธ์ถ ๋ค์ ๋ฌธ์ฅ์ผ๋ก ๋์์ต๋๋ค. ์ ์ ์ข ๋ฃ์ Exit Sub๋ ๋ฒ์ด๋๋ Finally๋ฅผ ์คํํ ๋ค์ ๋งค๊ฐ๋ณ์ ๋์ฐ๊ธฐ๋ฅผ ์๋ฃํฉ๋๋ค. ์์ธ๋ ํ์ฑ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ก ์ ๋ฌ๋๋ฉฐ ์คํจํ ํธ์ถ์ ์ฑ๊ณต์ ๋ปํ์ง ์์ต๋๋ค.
- ์ผ์ ์ค์ง์ ์ ์ง ๊ฒ์ฌ๋ ์ ์ง๋ฉ๋๋ค. ์ ์ค๋ ๋, ์๋ ์ง์ฐ, ์๊ฐ ์ ํ์ ์๊ธฐ์ง ์์ต๋๋ค. ์ฌ๊ท์๋ ์ข ๋ฃ ์กฐ๊ฑด์ด ํ์ํฉ๋๋ค. Sub ์ด๋ฆ์ ๋์ ํด๋ ๋ฐํ ๊ฒฐ๊ณผ๊ฐ ์ค์ ๋์ง ์์ผ๋ฏ๋ก ๊ทธ ์ฉ๋์๋ Function์ ์ฌ์ฉํฉ๋๋ค.
- ์ค์ฒฉ ์คํฌ๋ฆฝํธ ํ๋ก์์ ํธ์ถ์ ์ฝ๋ฐฑ๊ณผ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํฌํจํด 32ํ๋ ์์ผ๋ก ์ ํ๋ฉ๋๋ค. ์ด๊ณผํ๋ฉด ์ก์ ์ ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๊น์ ์ฒ๋ฆฌ๋ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ธ์. ๋ฐํ์ด๋ ์ค๋ฅ ์ ํ๋ ์์ด ํด์ ๋์ด ์ดํ ํธ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค.
์์
1. ์ธ ๊ฐ์ง ํธ์ถ ํ์
# total์ 4๋ก ์์ํฉ๋๋ค. AddAmount๋ total์ ByRef๋ก ๋ฐ๊ณ ์๋ตํ amount๋ 1, ๋ช
์ํ 3๊ณผ 2๋ ByVal์
๋๋ค. ๊ดํธ ์๋ Call, ๊ดํธ ์๋ Call, ์ผ๋ฐ ํธ์ถ์ ๊ฐ์ ๋์ฐ๋ฏธ๋ฅผ ์คํํฉ๋๋ค. Main์ 4+1+3+2=10์ ๋ช
์์ ์ผ๋ก ๋ฐํํฉ๋๋ค.
Option Explicit On
Sub AddAmount(ByRef total, Optional ByVal amount=1)
total += amount
End Sub
Sub Main()
Dim total=4
Call AddAmount(total)
Call AddAmount total, 3
AddAmount(total, 2)
Return total
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
total์ 4๋ก ์์ํฉ๋๋ค. AddAmount๋ total์ ByRef๋ก ๋ฐ๊ณ ์๋ตํ amount๋ 1, ๋ช ์ํ 3๊ณผ 2๋ ByVal์ ๋๋ค. ๊ดํธ ์๋ Call, ๊ดํธ ์๋ Call, ์ผ๋ฐ ํธ์ถ์ ๊ฐ์ ๋์ฐ๋ฏธ๋ฅผ ์คํํฉ๋๋ค. Main์ 4+1+3+2=10์ ๋ช ์์ ์ผ๋ก ๋ฐํํฉ๋๋ค.
2. ๊ณต๊ฐ ์ง์ ์ ๊ณผ ๋น๊ณต๊ฐ ๋์ฐ๋ฏธ
# Batches.SumInto๋ total์ ByRef๋ก ๋ฐ๊ณ 3,-9,4๋ฅผ values์ ๋ชจ์๋๋ค. For Each๊ฐ AppendAmount๋ฅผ ํธ์ถํฉ๋๋ค. ์์ ๊ฒ์ฌ๋ ๋์ฐ๋ฏธ๋ง ์ข
๋ฃํ๋ฏ๋ก -9๋ฅผ ๊ฑด๋๋ฐ๊ณ ๋ฐ๋ณต์ ๊ณ์ํฉ๋๋ค. ์ด๊ธฐ๊ฐ 2์์ 2+3+4=9๊ฐ ๋ฉ๋๋ค. ์ธ๋ถ์์๋ ๊ณต๊ฐ๋ ์ ์ฒด ๋ชจ๋ ์ด๋ฆ์ผ๋ก ํธ์ถํฉ๋๋ค.
Option Explicit On
Module Batches
Private Sub AppendAmount(ByRef total, ByVal value)
If value < 0 Then
Exit Sub
End If
total += value
End Sub
Public Sub SumInto(ByRef total, ParamArray values)
For Each value In values
AppendAmount(total, value)
Next
End Sub
End Module
Sub Main()
Dim total=2
Batches.SumInto(total, 3, -9, 4)
Return total
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
Batches.SumInto๋ total์ ByRef๋ก ๋ฐ๊ณ 3,-9,4๋ฅผ values์ ๋ชจ์๋๋ค. For Each๊ฐ AppendAmount๋ฅผ ํธ์ถํฉ๋๋ค. ์์ ๊ฒ์ฌ๋ ๋์ฐ๋ฏธ๋ง ์ข ๋ฃํ๋ฏ๋ก -9๋ฅผ ๊ฑด๋๋ฐ๊ณ ๋ฐ๋ณต์ ๊ณ์ํฉ๋๋ค. ์ด๊ธฐ๊ฐ 2์์ 2+3+4=9๊ฐ ๋ฉ๋๋ค. ์ธ๋ถ์์๋ ๊ณต๊ฐ๋ ์ ์ฒด ๋ชจ๋ ์ด๋ฆ์ผ๋ก ํธ์ถํฉ๋๋ค.
3. ์กฐ๊ธฐ ์ข ๋ฃ์ ์ ๋ฆฌ
# Finish๋ trace=1์ ์ค์ ํ๊ณ ์ข
๋ฃํ์ฌ trace=99๋ฅผ ์คํํ์ง ์์ต๋๋ค. Finally๊ฐ 2๋ฅผ ๋ง๋ถ์ฌ trace=12๋ฅผ ByRef๋ก ๋๋ ค์ค๋๋ค. LegacyValue๋ Basic Sub์ Return 7์ ๋ณด์ฌ ์ค๋๋ค. Main์ 12*10+7=127์ ๋ฐํํฉ๋๋ค. trace ์ซ์๋ ์์ ์์ ์ ํ ๊ฐ์ด๋ฉฐ ๊ฒ์ ๊ฒฐ๊ณผ ์ฝ๋๊ฐ ์๋๋๋ค.
Option Explicit On
Sub Finish(ByRef trace)
Try
trace=1
Exit Sub
trace=99
Finally
trace=trace*10+2
End Try
End Sub
Sub LegacyValue()
Return 7
End Sub
Sub Main()
Dim trace=0
Call Finish(trace)
Return trace*10+LegacyValue()
End Sub
๋งค๊ฐ๋ณ์ ๋ฐ ์คํ ์ค๋ช :
Finish๋ trace=1์ ์ค์ ํ๊ณ ์ข ๋ฃํ์ฌ trace=99๋ฅผ ์คํํ์ง ์์ต๋๋ค. Finally๊ฐ 2๋ฅผ ๋ง๋ถ์ฌ trace=12๋ฅผ ByRef๋ก ๋๋ ค์ค๋๋ค. LegacyValue๋ Basic Sub์ Return 7์ ๋ณด์ฌ ์ค๋๋ค. Main์ 12*10+7=127์ ๋ฐํํฉ๋๋ค. trace ์ซ์๋ ์์ ์์ ์ ํ ๊ฐ์ด๋ฉฐ ๊ฒ์ ๊ฒฐ๊ณผ ์ฝ๋๊ฐ ์๋๋๋ค.