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

Class / New / Me / Property

ClassicUO โ€ข Basic

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

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

[Public | Private] Class TypeName
    [Public | Private | Dim] field As FieldType
    Public Sub New([parameters]) ... End Sub
    [Public | Private] Sub Method([parameters]) ... End Sub
    [Public | Private] Function Method([parameters]) As ResultType ... End Function
    [Public | Private] [ReadOnly | WriteOnly] Property Name[()] As ValueType
        Get ... Return value / Name = value / Exit Property ... End Get
        Set(ByVal value As ValueType) ... End Set
    End Property
    Public Property AutoName As ValueType
End Class
Dim instance [As TypeName] = New TypeName(arguments)
instance.Property = expression
value = instance.Property
instance.Method(arguments)
With instance ... End With

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

  • TypeName / Public / Private โ€” TypeName์€ ํŒŒ์ผ ๋˜๋Š” Module ์ˆ˜์ค€์˜ ๊ณ ์œ ํ•œ ๋‹จ์ˆœ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๋ฐ–์—์„œ๋Š” ModuleName.TypeName์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Class ๊ธฐ๋ณธ๊ฐ’์€ Public์ด๋ฉฐ Private Class๋Š” ์ž์‹ ์˜ Module์—๋งŒ ๋ณด์ž…๋‹ˆ๋‹ค. ์ƒ์†, ์ธํ„ฐํŽ˜์ด์Šค, ์ œ๋„ค๋ฆญ, ์ค‘์ฒฉ ํด๋ž˜์Šค, Shared, ์˜ค๋ฒ„๋กœ๋“œ, ์†Œ๋ฉธ์ž, ์ธ์Šคํ„ด์Šค Event ์„ ์–ธ์€ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • field As FieldType / Me โ€” ํ•„๋“œ๋Š” As Integer, Double, Boolean, String, Object ๋˜๋Š” ์„ ์–ธ๋œ Enum/Structure/Class ํ˜•์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด Basic ํ˜•์‹ ๋ณ„์นญ๋„ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๋Š” ๊ธฐ๋ณธ Private์ด๋ฏ€๋กœ ์™ธ๋ถ€ ์ ‘๊ทผ์—๋Š” Public์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์€ ์ˆซ์ž/Boolean 0, String ๋นˆ ๋ฌธ์ž์—ด, Structure ์˜๊ฐ’ ํ•„๋“œ, Object/Class Nothing(Unit)์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ดˆ๊ธฐํ™”๋Š” Sub New์—์„œ ํ•ฉ๋‹ˆ๋‹ค. Me๋Š” ํ˜„์žฌ ์ธ์Šคํ„ด์Šค์ด๋ฉฐ ์žฌ์„ ์–ธยท์žฌ๋Œ€์ž…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ๋‹ค๋ฅธ ๋ฉค๋ฒ„ ์ด๋ฆ„์„ ๊ฐ€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • New / Sub New โ€” New TypeName(arguments)๋Š” ๋ณ„๋„ ํ•„๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  Public Sub New๋ฅผ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋ฉด New TypeName()๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๋Š” ํ•˜๋‚˜์ด๋ฉฐ ์ผ๋ฐ˜ Optional, ๊ธฐ๋ณธ๊ฐ’, ๋ช…๋ช…๋œ ์ธ์ˆ˜ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ์ž‘์„ฑ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ๋ฒˆ ํ‰๊ฐ€๋˜๋ฉฐ ์‹คํŒจํ•˜๋ฉด ์™„์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. As TypeName๋งŒ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” Nothing์ž…๋‹ˆ๋‹ค.
  • Sub / Function / arguments โ€” Sub/Function์€ instance.Method(...), ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋Š” Method(...)/Me.Method(...)๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Private์€ ๊ฐ™์€ Class ์ฝ”๋“œ์—์„œ๋งŒ ํ˜ธ์ถœํ•˜๋ฉฐ ๊ฐ™์€ ํ˜•์‹์˜ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜•์‹, ByVal/ByRef, Optional, ParamArray, ๋ช…๋ช…๋œ ์ธ์ˆ˜๋ฅผ ์ง€์›ํ•˜๋˜ ParamArray ์š”์†Œ์˜ ์ด๋ฆ„ ์ง€์ •์€ ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Function์€ ์„ ์–ธ ํ˜•์‹, Sub๋Š” Unit์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. TypeName.Method(...)์™€ instance.New(...)๋Š” ์ž˜๋ชป๋œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์˜ AddressOf์—๋Š” ํŒŒ์ผ/๋ชจ๋“ˆ ๋ž˜ํผ ํ”„๋กœ์‹œ์ €๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • Property / Get / Set โ€” Property Name[()] As ValueType์—๋Š” ์ธ๋ฑ์Šค ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ๋Š” ํ˜ธ์ถœ ๊ด„ํ˜ธ ์—†์ด instance.Name์ž…๋‹ˆ๋‹ค. Get์€ Return ๋˜๋Š” Name ๋Œ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  Exit Property๋Š” ๊ทธ ๊ฒฐ๊ณผ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ž…์€ Set(ByVal value As ValueType)์„ ์‹คํ–‰ํ•˜๋ฉฐ ๋งˆ์ง€๋ง‰ Get์„ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์†์„ฑ์€ Get/Set์„ ํ•˜๋‚˜์”ฉ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผ ๋ฒ”์œ„๋Š” Property์— ์ง€์ •ํ•˜๊ณ  Set์€ ๊ฐ™์€ ํ˜•์‹์˜ ๋ช…์‹œ์ ์ธ ByVal ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ReadOnly / WriteOnly / auto Property โ€” ๋ณธ๋ฌธ์ด ์žˆ๋Š” ReadOnly๋Š” Get๋งŒ, WriteOnly๋Š” Set๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ธˆ์ง€๋œ ์ ‘๊ทผ์€ ์žก์„ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ์ž๋™ ์†์„ฑ์€ Get/Set๊ณผ End Property ์—†์ด ๊ฐ’์„ ์ง์ ‘ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ReadOnly๋Š” ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ Sub New์—์„œ๋งŒ ๋Œ€์ž…ํ•  ์ˆ˜ ์žˆ๊ณ  Set ์—†๋Š” WriteOnly๋Š” ๋ฌดํšจ์ž…๋‹ˆ๋‹ค. ReadOnly๊ฐ€ Class ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋„ ์ฐธ์กฐ ๋Œ€์ƒ์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฉค๋ฒ„๋Š” ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ByVal / ByRef / With โ€” ByVal์€ ์ฐธ์กฐ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฉค๋ฒ„ ๋ณ€๊ฒฝ์€ ์›๋ณธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ต์ฒด๋Š” ํ˜ธ์ถœ์ž ๋ณ€์ˆ˜๋ฅผ ๊ต์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ByRef๋Š” ์—”์ง„์˜ copy-in/copy-out ๊ทœ์น™์— ๋”ฐ๋ผ ์ƒˆ ์ฐธ์กฐ๋„ ๋˜์”๋‹ˆ๋‹ค. ๋™๋“ฑ ๋น„๊ต๋Š” ๊ฐ์ฒด ๋™์ผ์„ฑ์ž…๋‹ˆ๋‹ค. With instance๋Š” ๊ฐ์ฒด๋ฅผ ํ•œ ๋ฒˆ ์บก์ฒ˜ํ•˜์—ฌ ํ•„๋“œยท์†์„ฑยท๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Class๋Š” ์ž๋™ IDisposable์ด ์•„๋‹ˆ๋ฏ€๋กœ Using์€ ์ง€์›๋˜๋Š” ๋ฆฌ์†Œ์Šค ๊ฐ์ฒด์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

New๋Š” Class ์ฐธ์กฐ๋ฅผ ๋‹ด์€ Object๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ UO ID/๊ทธ๋ž˜ํ”ฝ์ด ์•„๋‹™๋‹ˆ๋‹ค. Get/Function์€ ์„ ์–ธ ํ˜•์‹, Set/Sub/์„ ์–ธ์€ Unit์ž…๋‹ˆ๋‹ค. New ์—†๋Š” ๋ณ€์ˆ˜๋Š” Nothing์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ ๋™์ผ์„ฑ๊ณผ As Boolean์€ 1/True ๋˜๋Š” 0/False์ด๊ณ  Integer ์ˆ˜๋Ÿ‰์€ ์ž๋™ ์„ฑ๊ณต ํ”Œ๋ž˜๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Main ๊ฒฐ๊ณผ: "5:2:1", "1:0:6", "ore:1:replacement:0".

๋™์ž‘

  • SC032๋Š” Option Explicit ์—†์ด๋„ ์ž˜๋ชป๋œ ์„ ์–ธ์„ ์‹คํ–‰ ์ „์— ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋„: ํด๋ž˜์Šค 256๊ฐœ, ํด๋ž˜์Šค๋ณ„ ํ•„๋“œ/์†์„ฑ 256๊ฐœ์™€ ๋ฉ”์„œ๋“œ 256๊ฐœ, New/Get/Set์„ ํฌํ•จํ•œ ์ค‘์ฒฉ ํ˜ธ์ถœ 32๋‹จ๊ณ„. ๋Œ€์ž…/ByRef ๊ฒฝ๋กœ๋Š” 64๊ฐœ ๊ตฌ์„ฑ ์š”์†Œ๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ์ˆœํ™˜ ์ฐธ์กฐ๋Š” ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐยท๊ธฐ๋ณธ๊ฐ’์€ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜๊ณ  ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ €์žฅ์†Œ๋Š” ๊ฐ New๋งˆ๋‹ค ๋”ฐ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ๋Œ€์ƒ ๊ฒฝ๋กœ๋ฅผ ์˜ค๋ฅธ์ชฝ ์‹/์ธ์ˆ˜์˜ ๋ถ€์ˆ˜ ํšจ๊ณผ ์ „์— ์บก์ฒ˜ํ•˜์—ฌ ๊ฒฝ๋กœ์˜ ๊ฐ Get์„ ํ•œ ๋ฒˆ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์‹œ์ €๊ฐ€ ์ค‘๊ฐ„ ๋ณ€์ˆ˜๋ฅผ ๊ต์ฒดํ•ด๋„ ๋˜์“ฐ๊ธฐ ๋Œ€์ƒ์€ ์›๋ž˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๊ฐ’์€ ์„ ์–ธ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์žยท๋ฉ”์„œ๋“œยท์ ‘๊ทผ์ž ์˜ค๋ฅ˜๋Š” Try/Catch๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์ด์ „ ๋ณ€๊ฒฝ์€ ์ทจ์†Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ์‹œ ์ค‘์ง€ยท์ •์ง€ยท์†Œ์Šค ์œ„์น˜ยท๊นŠ์ด ์ œํ•œ์€ ์ผ๋ฐ˜ ์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. IDE๋งŒ ๋‹ซ์•„์„œ๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒ€์‚ฌ๊ธฐ๋Š” Get ์‹คํ–‰์ด๋‚˜ ์ˆœํ™˜ ํƒ์ƒ‰ ์—†์ด ํ˜•์‹๊ณผ ๋ฉค๋ฒ„ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Watch๋Š” ์ €์žฅ ํ•„๋“œ/์ž๋™ ์†์„ฑ์„ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ์ž Get, ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž„์˜ .NET ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์„ค๋ช…๋œ Basic ๋ถ€๋ถ„์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ

1. ๋…๋ฆฝ ๊ฐ์ฒด์™€ ๊ณต์œ  ์ฐธ์กฐ

# New Counter(label:="ore", start:=2)๋Š” String label๊ณผ Integer start๋ฅผ ์ „๋‹ฌํ•˜๊ณ  Label/stored๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. second์—๋Š” ๋…๋ฆฝ ํ•„๋“œ๊ฐ€ ์žˆ๊ณ  alias=first๋Š” ์ฐธ์กฐ ๋ณต์‚ฌ์ž…๋‹ˆ๋‹ค. Add(amount:=3)๋Š” Value.Set์œผ๋กœ ์Œ์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ์“ด ๋’ค Value.Get์˜ Integer๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. first=5, second=2, alias=first๋Š” 1/True์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
Option Explicit On
Class Counter
    Private stored As Integer
    Public Property Label As String
    Public Sub New(ByVal label As String, ByVal start As Integer)
        Me.Label = label
        stored = start
    End Sub
    Public Property Value As Integer
        Get
            Return stored
        End Get
        Set(ByVal value As Integer)
            If value < 0 Then
                Throw "Value must be non-negative"
            End If
            stored = value
        End Set
    End Property
    Public Function Add(ByVal amount As Integer) As Integer
        Me.Value = stored + amount
        Return Me.Value
    End Function
End Class

Sub Main()
    Dim first = New Counter(label:="ore", start:=2)
    Dim second = New Counter("wood", 2)
    Dim alias = first
    alias.Add(amount:=3)
    Return CStr(first.Value) & ":" & CStr(second.Value) & ":" & CStr(alias = first)
End Sub

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

New Counter(label:="ore", start:=2)๋Š” String label๊ณผ Integer start๋ฅผ ์ „๋‹ฌํ•˜๊ณ  Label/stored๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. second์—๋Š” ๋…๋ฆฝ ํ•„๋“œ๊ฐ€ ์žˆ๊ณ  alias=first๋Š” ์ฐธ์กฐ ๋ณต์‚ฌ์ž…๋‹ˆ๋‹ค. Add(amount:=3)๋Š” Value.Set์œผ๋กœ ์Œ์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ์“ด ๋’ค Value.Get์˜ Integer๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. first=5, second=2, alias=first๋Š” 1/True์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

2. ์ฝ๊ธฐยท์“ฐ๊ธฐ์™€ Boolean

# Limit=10์€ value=10์œผ๋กœ Set์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Remaining.Get์€ ๊ฒฐ๊ณผ ์ด๋ฆ„์— ๋Œ€์ž…ํ•˜๊ณ  Exit Property๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. TrySpend(cost:=4)๋Š” 4๋ฅผ ๋นผ๊ณ  1/True, cost=9๋Š” ๋‚จ์€ 6๋ณด๋‹ค ์ปค์„œ 0/False์ž…๋‹ˆ๋‹ค. Limit=-3์€ ์ €์žฅ ์ „์— ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ณ  Catch๋Š” Remaining=6์„ ์ฝ์Šต๋‹ˆ๋‹ค. Main์€ "1:0:6"์ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์€ ์—†์Šต๋‹ˆ๋‹ค.
Option Explicit On
Class Budget
    Private amount As Integer
    Public ReadOnly Property Remaining() As Integer
        Get
            Remaining = amount
            Exit Property
        End Get
    End Property
    Public WriteOnly Property Limit As Integer
        Set(ByVal value As Integer)
            If value < 0 Then
                Throw "Limit must be non-negative"
            End If
            amount = value
        End Set
    End Property
    Public Function TrySpend(ByVal cost As Integer) As Boolean
        If cost < 0 Then
            Throw "cost must be non-negative"
        End If
        If cost > amount Then
            Return False
        End If
        amount -= cost
        Return True
    End Function
End Class

Sub Main()
    Dim budget = New Budget()
    budget.Limit = 10
    Dim paid = budget.TrySpend(4)
    Dim refused = budget.TrySpend(9)
    Try
        budget.Limit = -3
    Catch problem
        Return CStr(paid) & ":" & CStr(refused) & ":" & CStr(budget.Remaining)
    End Try
    Return "unexpected"
End Sub

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

Limit=10์€ value=10์œผ๋กœ Set์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Remaining.Get์€ ๊ฒฐ๊ณผ ์ด๋ฆ„์— ๋Œ€์ž…ํ•˜๊ณ  Exit Property๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. TrySpend(cost:=4)๋Š” 4๋ฅผ ๋นผ๊ณ  1/True, cost=9๋Š” ๋‚จ์€ 6๋ณด๋‹ค ์ปค์„œ 0/False์ž…๋‹ˆ๋‹ค. Limit=-3์€ ์ €์žฅ ์ „์— ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ณ  Catch๋Š” Remaining=6์„ ์ฝ์Šต๋‹ˆ๋‹ค. Main์€ "1:0:6"์ด๋ฉฐ ์„œ๋ฒ„ ๋™์ž‘์€ ์—†์Šต๋‹ˆ๋‹ค.

3. Module, ByVal, ByRef ๊ต์ฒด

# Jobs.WorkItem(name)์€ String Name์„ ์ €์žฅํ•˜๊ณ  Done์€ 0์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. Tick(ByVal job)์€ ๊ณต์œ  Done์„ 1๋กœ ๋งŒ๋“ค์ง€๋งŒ ๋’ค์˜ "local" ๊ต์ฒด๋Š” ์ง€์—ญ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. Replace(ByRef job, ByVal name)์€ "replacement"๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ˜ธ์ถœ์ž ์ฐธ์กฐ๋ฅผ ๋˜์”๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ์ธ์ˆ˜๋ฅผ ์˜๋„์ ์œผ๋กœ ์—ญ์ˆœ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. original์€ "ore"/1์ด๊ณ  job์€ ์ƒˆ๋กœ์šด "replacement"/0์ž…๋‹ˆ๋‹ค. Module Jobs ์ „์ฒด๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.
Option Explicit On
Module Jobs
    Public Class WorkItem
        Public Property Name As String
        Public Done As Integer
        Public Sub New(ByVal name As String)
            Me.Name = name
        End Sub
    End Class
    Public Sub Tick(ByVal job As WorkItem)
        job.Done += 1
        job = New WorkItem("local")
    End Sub
    Public Sub Replace(ByRef job As WorkItem, ByVal name As String)
        job = New WorkItem(name)
    End Sub
End Module

Sub Main()
    Dim job As Jobs.WorkItem = New Jobs.WorkItem("ore")
    Dim original = job
    Jobs.Tick(job)
    Jobs.Replace(name:="replacement", job:=job)
    Return original.Name & ":" & CStr(original.Done) & ":" & job.Name & ":" & CStr(job.Done)
End Sub

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

Jobs.WorkItem(name)์€ String Name์„ ์ €์žฅํ•˜๊ณ  Done์€ 0์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. Tick(ByVal job)์€ ๊ณต์œ  Done์„ 1๋กœ ๋งŒ๋“ค์ง€๋งŒ ๋’ค์˜ "local" ๊ต์ฒด๋Š” ์ง€์—ญ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. Replace(ByRef job, ByVal name)์€ "replacement"๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ˜ธ์ถœ์ž ์ฐธ์กฐ๋ฅผ ๋˜์”๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ์ธ์ˆ˜๋ฅผ ์˜๋„์ ์œผ๋กœ ์—ญ์ˆœ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. original์€ "ore"/1์ด๊ณ  job์€ ์ƒˆ๋กœ์šด "replacement"/0์ž…๋‹ˆ๋‹ค. Module Jobs ์ „์ฒด๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ํ•จ์ˆ˜: ํ˜ธ์ถœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๊นŒ์ง€

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

1. ClassCatalog.Build / Complete

SC032๋Š” Option Explicit ์—†์ด๋„ ์ž˜๋ชป๋œ ์„ ์–ธ์„ ์‹คํ–‰ ์ „์— ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋„: ํด๋ž˜์Šค 256๊ฐœ, ํด๋ž˜์Šค๋ณ„ ํ•„๋“œ/์†์„ฑ 256๊ฐœ์™€ ๋ฉ”์„œ๋“œ 256๊ฐœ, New/Get/Set์„ ํฌํ•จํ•œ ์ค‘์ฒฉ ํ˜ธ์ถœ 32๋‹จ๊ณ„. ๋Œ€์ž…/ByRef ๊ฒฝ๋กœ๋Š” 64๊ฐœ ๊ตฌ์„ฑ ์š”์†Œ๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ์ˆœํ™˜ ์ฐธ์กฐ๋Š” ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐยท๊ธฐ๋ณธ๊ฐ’์€ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜๊ณ  ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ €์žฅ์†Œ๋Š” ๊ฐ New๋งˆ๋‹ค ๋”ฐ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

declarations -> unique typed members -> accessor validation -> prepared metadata; SC032 on invalid Class

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ClassCatalog.cs; ํ•จ์ˆ˜ ClassCatalog.Build / Complete.

2. ConstructClass

New TypeName(arguments)๋Š” ๋ณ„๋„ ํ•„๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  Public Sub New๋ฅผ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋ฉด New TypeName()๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๋Š” ํ•˜๋‚˜์ด๋ฉฐ ์ผ๋ฐ˜ Optional, ๊ธฐ๋ณธ๊ฐ’, ๋ช…๋ช…๋œ ์ธ์ˆ˜ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ์ž‘์„ฑ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ๋ฒˆ ํ‰๊ฐ€๋˜๋ฉฐ ์‹คํŒจํ•˜๋ฉด ์™„์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. As TypeName๋งŒ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” Nothing์ž…๋‹ˆ๋‹ค.

new instance -> independent field slots -> bind constructor arguments -> Sub New -> Object reference

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.Classes.cs; ํ•จ์ˆ˜ ConstructClass.

3. ClassObject.Member / Read

Property Name[()] As ValueType์—๋Š” ์ธ๋ฑ์Šค ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ๋Š” ํ˜ธ์ถœ ๊ด„ํ˜ธ ์—†์ด instance.Name์ž…๋‹ˆ๋‹ค. Get์€ Return ๋˜๋Š” Name ๋Œ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  Exit Property๋Š” ๊ทธ ๊ฒฐ๊ณผ๋‚˜ ๊ธฐ๋ณธ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ž…์€ Set(ByVal value As ValueType)์„ ์‹คํ–‰ํ•˜๋ฉฐ ๋งˆ์ง€๋ง‰ Get์„ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์†์„ฑ์€ Get/Set์„ ํ•˜๋‚˜์”ฉ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผ ๋ฒ”์œ„๋Š” Property์— ์ง€์ •ํ•˜๊ณ  Set์€ ๊ฐ™์€ ํ˜•์‹์˜ ๋ช…์‹œ์ ์ธ ByVal ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

check member visibility -> stored value OR Get frame -> declared value type

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/ClassObject.cs; ํ•จ์ˆ˜ ClassObject.Member / Read.

4. MemberAccess.Resolve / ClassObject.Write

๋Œ€์ƒ ๊ฒฝ๋กœ๋ฅผ ์˜ค๋ฅธ์ชฝ ์‹/์ธ์ˆ˜์˜ ๋ถ€์ˆ˜ ํšจ๊ณผ ์ „์— ์บก์ฒ˜ํ•˜์—ฌ ๊ฒฝ๋กœ์˜ ๊ฐ Get์„ ํ•œ ๋ฒˆ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์‹œ์ €๊ฐ€ ์ค‘๊ฐ„ ๋ณ€์ˆ˜๋ฅผ ๊ต์ฒดํ•ด๋„ ๋˜์“ฐ๊ธฐ ๋Œ€์ƒ์€ ์›๋ž˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๊ฐ’์€ ์„ ์–ธ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์žยท๋ฉ”์„œ๋“œยท์ ‘๊ทผ์ž ์˜ค๋ฅ˜๋Š” Try/Catch๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์ด์ „ ๋ณ€๊ฒฝ์€ ์ทจ์†Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

capture receiver once -> evaluate RHS/arguments -> coerce value -> Set OR stored slot

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/MemberAccess.cs; ํ•จ์ˆ˜ MemberAccess.Resolve / ClassObject.Write.

5. CallClassMethod / CallSubrutine

Sub/Function์€ instance.Method(...), ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋Š” Method(...)/Me.Method(...)๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. Private์€ ๊ฐ™์€ Class ์ฝ”๋“œ์—์„œ๋งŒ ํ˜ธ์ถœํ•˜๋ฉฐ ๊ฐ™์€ ํ˜•์‹์˜ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜•์‹, ByVal/ByRef, Optional, ParamArray, ๋ช…๋ช…๋œ ์ธ์ˆ˜๋ฅผ ์ง€์›ํ•˜๋˜ ParamArray ์š”์†Œ์˜ ์ด๋ฆ„ ์ง€์ •์€ ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Function์€ ์„ ์–ธ ํ˜•์‹, Sub๋Š” Unit์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. TypeName.Method(...)์™€ instance.New(...)๋Š” ์ž˜๋ชป๋œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์˜ AddressOf์—๋Š” ํŒŒ์ผ/๋ชจ๋“ˆ ๋ž˜ํผ ํ”„๋กœ์‹œ์ €๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

check method visibility -> bind named/positional arguments -> Me frame -> return -> ByRef copy-out

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.Classes.cs; ํ•จ์ˆ˜ CallClassMethod / CallSubrutine.

6. ClassObject.DisplayValue

์ผ์‹œ ์ค‘์ง€ยท์ •์ง€ยท์†Œ์Šค ์œ„์น˜ยท๊นŠ์ด ์ œํ•œ์€ ์ผ๋ฐ˜ ์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. IDE๋งŒ ๋‹ซ์•„์„œ๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒ€์‚ฌ๊ธฐ๋Š” Get ์‹คํ–‰์ด๋‚˜ ์ˆœํ™˜ ํƒ์ƒ‰ ์—†์ด ํ˜•์‹๊ณผ ๋ฉค๋ฒ„ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. Watch๋Š” ์ €์žฅ ํ•„๋“œ/์ž๋™ ์†์„ฑ์„ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ์ž Get, ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž„์˜ .NET ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์„ค๋ช…๋œ Basic ๋ถ€๋ถ„์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

debugger: type + member count; no getter calls and no traversal of reference cycles

ํ”„๋กœ์ ํŠธ ์†Œ์Šค: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/ClassObject.cs; ํ•จ์ˆ˜ ClassObject.DisplayValue.

New๋Š” Class ์ฐธ์กฐ๋ฅผ ๋‹ด์€ Object๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ UO ID/๊ทธ๋ž˜ํ”ฝ์ด ์•„๋‹™๋‹ˆ๋‹ค. Get/Function์€ ์„ ์–ธ ํ˜•์‹, Set/Sub/์„ ์–ธ์€ Unit์ž…๋‹ˆ๋‹ค. New ์—†๋Š” ๋ณ€์ˆ˜๋Š” Nothing์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ ๋™์ผ์„ฑ๊ณผ As Boolean์€ 1/True ๋˜๋Š” 0/False์ด๊ณ  Integer ์ˆ˜๋Ÿ‰์€ ์ž๋™ ์„ฑ๊ณต ํ”Œ๋ž˜๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Main ๊ฒฐ๊ณผ: "5:2:1", "1:0:6", "ore:1:replacement:0".


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

Basic