Sub 문(Visual Basic)Sub Statement (Visual Basic)

프로시저를 정의 하는 이름, 매개 변수 및 코드를 선언 Sub 합니다.Declares the name, parameters, and code that define a Sub procedure.

구문Syntax

[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]
    [ statements ]
    [ Exit Sub ]
    [ statements ]
End Sub

부분Parts

  • attributelist

    선택 사항입니다.Optional. 특성 목록을 참조 하십시오.See Attribute List.

  • Partial

    선택 사항입니다.Optional. 부분 메서드 정의를 나타냅니다.Indicates definition of a partial method. 부분 메서드를 참조 하세요.See Partial Methods.

  • accessmodifier

    선택 사항입니다.Optional. 다음 중 하나일 수 있습니다.Can be one of the following:

    Access levels in Visual Basic을 참조하세요.See Access levels in Visual Basic.

  • proceduremodifiers

    선택 사항입니다.Optional. 다음 중 하나일 수 있습니다.Can be one of the following:

  • Shared

    선택 사항입니다.Optional. 공유를 참조 하세요.See Shared.

  • Shadows

    선택 사항입니다.Optional. 그림자를 참조 하세요.See Shadows.

  • Async

    선택 사항입니다.Optional. Async를 참조 하세요.See Async.

  • name

    필수 요소.Required. 프로시저의 이름입니다.Name of the procedure. Declared Element Names을 참조하세요.See Declared Element Names. 클래스에 대 한 생성자 프로시저를 만들려면 프로시저의 이름을 키워드로 설정 합니다 Sub New .To create a constructor procedure for a class, set the name of a Sub procedure to the New keyword. 자세한 내용은 개체 수명: 개체가 만들어지고 소멸 되는 방법을 참조 하세요.For more information, see Object Lifetime: How Objects Are Created and Destroyed.

  • typeparamlist

    선택 사항입니다.Optional. 제네릭 프로시저에 대 한 형식 매개 변수 목록입니다.List of type parameters for a generic procedure. 형식 목록을 참조 하십시오.See Type List.

  • parameterlist

    선택 사항입니다.Optional. 이 프로시저의 매개 변수를 나타내는 지역 변수 이름 목록입니다.List of local variable names representing the parameters of this procedure. 매개 변수 목록을 참조 하세요.See Parameter List.

  • Implements

    선택 사항입니다.Optional. 이 프로시저에서 하나 이상의 Sub 프로시저를 구현 하 고 각각이 프로시저의 포함 하는 클래스 또는 구조체에 의해 구현 된 인터페이스에 정의 됨을 나타냅니다.Indicates that this procedure implements one or more Sub procedures, each one defined in an interface implemented by this procedure's containing class or structure. Implements 문을 참조 하세요.See Implements Statement.

  • implementslist

    Implements가 제공된 경우 필수입니다.Required if Implements is supplied. 구현할 Sub 프로시저 목록입니다.List of Sub procedures being implemented.

    implementedprocedure [ , implementedprocedure ... ]

    implementedprocedure에는 다음과 같은 구문과 요소가 있습니다.Each implementedprocedure has the following syntax and parts:

    interface.definedname

    부분Part DescriptionDescription
    interface 필수 요소.Required. 이 프로시저에 포함 된 클래스 또는 구조체에 의해 구현 된 인터페이스의 이름입니다.Name of an interface implemented by this procedure's containing class or structure.
    definedname 필수 요소.Required. 프로시저가 interface에 정의되는 이름입니다.Name by which the procedure is defined in interface.
  • Handles

    선택 사항입니다.Optional. 이 프로시저가 하나 이상의 특정 이벤트를 처리할 수 있음을 나타냅니다.Indicates that this procedure can handle one or more specific events. 핸들을 참조 하세요.See Handles.

  • eventlist

    Handles가 제공된 경우 필수입니다.Required if Handles is supplied. 이 프로시저가 처리 하는 이벤트 목록입니다.List of events this procedure handles.

    eventspecifier [ , eventspecifier ... ]

    eventspecifier에는 다음과 같은 구문과 요소가 있습니다.Each eventspecifier has the following syntax and parts:

    eventvariable.event

    부분Part DescriptionDescription
    eventvariable 필수 요소.Required. 이벤트를 발생 시키는 클래스 또는 구조체의 데이터 형식으로 선언 된 개체 변수입니다.Object variable declared with the data type of the class or structure that raises the event.
    event 필수 요소.Required. 이 프로시저가 처리 하는 이벤트의 이름입니다.Name of the event this procedure handles.
  • statements

    선택 사항입니다.Optional. 이 프로시저 내에서 실행할 문 블록입니다.Block of statements to run within this procedure.

  • End Sub

    이 프로시저의 정의를 종료 합니다.Terminates the definition of this procedure.

설명Remarks

모든 실행 코드는 프로시저 내에 있어야 합니다.All executable code must be inside a procedure. Sub호출 코드에 값을 반환 하지 않으려는 경우 프로시저를 사용 합니다.Use a Sub procedure when you don't want to return a value to the calling code. Function값을 반환 하려는 경우 프로시저를 사용 합니다.Use a Function procedure when you want to return a value.

Sub 프로시저 정의Defining a Sub Procedure

Sub모듈 수준 에서만 프로시저를 정의할 수 있습니다.You can define a Sub procedure only at the module level. 따라서 sub 프로시저의 선언 컨텍스트는 클래스, 구조체, 모듈 또는 인터페이스 여야 하며 소스 파일, 네임 스페이스, 프로시저 또는 블록일 수 없습니다.The declaration context for a sub procedure must, therefore, be a class, a structure, a module, or an interface and can't be a source file, a namespace, a procedure, or a block. 자세한 내용은 선언 컨텍스트 및 기본 액세스 수준을 참조하세요.For more information, see Declaration Contexts and Default Access Levels.

Sub프로시저는 기본적으로 공용 액세스입니다.Sub procedures default to public access. 액세스 한정자를 사용 하 여 액세스 수준을 조정할 수 있습니다.You can adjust their access levels by using the access modifiers.

프로시저에서 키워드를 사용 하는 경우 Implements 포함 하는 클래스 또는 구조체에는 Implements 또는 문 바로 다음에 오는 문이 있어야 합니다 Class Structure .If the procedure uses the Implements keyword, the containing class or structure must have an Implements statement that immediately follows its Class or Structure statement. Implements문에는에 지정 된 각 인터페이스가 포함 되어야 합니다 implementslist .The Implements statement must include each interface that's specified in implementslist. 그러나 인터페이스에서 Sub (의)를 정의 하는 이름은 definedname 이 프로시저 (에서)의 이름과 일치할 필요가 없습니다 name .However, the name by which an interface defines the Sub (in definedname) doesn't have to match the name of this procedure (in name).

Sub 프로시저에서 반환Returning from a Sub Procedure

프로시저에서 Sub 호출 코드로 반환 되 면 문을 호출한 문 뒤의 문을 사용 하 여 실행이 계속 됩니다.When a Sub procedure returns to the calling code, execution continues with the statement after the statement that called it.

다음 예에서는 프로시저에서 반환 하는 방법을 보여 줍니다 Sub .The following example shows a return from a Sub procedure.

Sub mySub(ByVal q As String)
    Return
End Sub

Exit SubReturn 문은 프로시저에서 즉각적인 종료를 발생 시킵니다 Sub .The Exit Sub and Return statements cause an immediate exit from a Sub procedure. 프로시저의 모든 위치에는 개수와 Exit Sub Return 문이 모두 표시 될 수 있으며 Exit Sub 문과 문을 혼합할 수 있습니다 Return .Any number of Exit Sub and Return statements can appear anywhere in the procedure, and you can mix Exit Sub and Return statements.

Sub 프로시저 호출Calling a Sub Procedure

Sub문에 프로시저 이름을 사용 하 여 프로시저를 호출한 다음 해당 이름을 괄호 안의 인수 목록에 따라 호출 합니다.You call a Sub procedure by using the procedure name in a statement and then following that name with its argument list in parentheses. 인수를 제공 하지 않는 경우에만 괄호를 생략할 수 있습니다.You can omit the parentheses only if you don't supply any arguments. 그러나 항상 괄호를 포함 하는 경우 코드를 더 쉽게 읽을 수 있습니다.However, your code is more readable if you always include the parentheses.

Sub프로시저와 프로시저는 Function 매개 변수를 포함 하 고 일련의 문을 수행할 수 있습니다.A Sub procedure and a Function procedure can have parameters and perform a series of statements. 그러나 프로시저는 Function 값을 반환 하며 Sub 프로시저는 그렇지 않습니다.However, a Function procedure returns a value, and a Sub procedure doesn't. 따라서 식에는 프로시저를 사용할 수 없습니다 Sub .Therefore, you can't use a Sub procedure in an expression.

프로시저를 호출할 때 키워드를 사용할 수 있지만 대부분의 경우에는 키워드를 사용 Call Sub 하지 않는 것이 좋습니다.You can use the Call keyword when you call a Sub procedure, but that keyword isn't recommended for most uses. 자세한 내용은 Call 문을 참조 하세요.For more information, see Call Statement.

때로는 산술 식을 다시 정렬 하 여 내부 효율성을 높이는 Visual Basic.Visual Basic sometimes rearranges arithmetic expressions to increase internal efficiency. 이러한 이유로 인수 목록에 다른 프로시저를 호출 하는 식이 포함 된 경우 해당 식이 특정 순서로 호출 된다고 가정 하면 안 됩니다.For that reason, if your argument list includes expressions that call other procedures, you shouldn't assume that those expressions will be called in a particular order.

비동기 Sub 프로시저Async Sub Procedures

비동기 기능을 사용 하면 명시적 콜백을 사용 하거나 여러 함수 또는 람다 식에서 수동으로 코드를 분할 하지 않고도 비동기 함수를 호출할 수 있습니다.By using the Async feature, you can invoke asynchronous functions without using explicit callbacks or manually splitting your code across multiple functions or lambda expressions.

비동기 한정자를 사용 하 여 프로시저를 표시 하는 경우 프로시저에서 wait 연산자를 사용할 수 있습니다.If you mark a procedure with the Async modifier, you can use the Await operator in the procedure. 제어가 Await 프로시저에서 식에 도달 하면 Async 제어가 호출자에 게 반환 되 고 대기 작업이 완료 될 때까지 프로시저의 진행률이 일시 중단 됩니다.When control reaches an Await expression in the Async procedure, control returns to the caller, and progress in the procedure is suspended until the awaited task completes. 작업이 완료 되 면 프로시저에서 실행을 다시 시작할 수 있습니다.When the task is complete, execution can resume in the procedure.

참고

Async아직 완료 되지 않은 첫 번째 대기 개체가 발생 하거나 프로시저 끝에 Async 도달 하는 경우 (어느 쪽이 든 먼저 발생 하는 경우) 프로시저가 호출자에 게 반환 됩니다.An Async procedure returns to the caller when either the first awaited object that’s not yet complete is encountered or the end of the Async procedure is reached, whichever occurs first.

한정자를 사용 하 여 함수 문을 표시할 수도 있습니다 Async .You can also mark a Function Statement with the Async modifier. Async함수는 또는의 반환 형식을 사용할 수 Task<TResult> 있습니다 Task .An Async function can have a return type of Task<TResult> or Task. 이 항목의 뒷부분에 나오는 예제에서는 Async 반환 형식이 인 함수를 보여 줍니다 Task<TResult> .An example later in this topic shows an Async function that has a return type of Task<TResult>.

Async``Sub프로시저는 주로 값을 반환할 수 없는 이벤트 처리기에 사용 됩니다.Async Sub procedures are primarily used for event handlers, where a value can't be returned. 프로시저는 Async Sub 대기 수 없으며 프로시저 호출자는 Async Sub 프로시저에서 throw 되는 예외를 catch 할 수 없습니다 Sub .An Async Sub procedure can't be awaited, and the caller of an Async Sub procedure can't catch exceptions that the Sub procedure throws.

Async프로시저에서 ByRef 매개 변수를 선언할 수 없습니다.An Async procedure can't declare any ByRef parameters.

프로시저에 대 한 자세한 내용은 Async Async 및 wait를 사용한 비동기 프로그래밍, 비동기 프로그램의 제어 흐름비동기 반환 형식을 참조 하세요.For more information about Async procedures, see Asynchronous Programming with Async and Await, Control Flow in Async Programs, and Async Return Types.

예제Example

다음 예에서는 문을 사용 하 여 Sub 프로시저의 본문을 형성 하는 이름, 매개 변수 및 코드를 정의 합니다 Sub .The following example uses the Sub statement to define the name, parameters, and code that form the body of a Sub procedure.

Sub ComputeArea(ByVal length As Double, ByVal width As Double)
    ' Declare local variable.
    Dim area As Double
    If length = 0 Or width = 0 Then
        ' If either argument = 0 then exit Sub immediately.
        Exit Sub
    End If
    ' Calculate area of rectangle.
    area = length * width
    ' Print area to Immediate window.
    Debug.WriteLine(area)
End Sub

예제Example

다음 예제에서 DelayAsyncAsync Function 반환 형식이 인입니다 Task<TResult> .In the following example, DelayAsync is an Async Function that has a return type of Task<TResult>. DelayAsync 에는 정수를 반환하는 Return 문이 포함됩니다.DelayAsync has a Return statement that returns an integer. 따라서의 함수 선언에는 DelayAsync 의 반환 형식이 있어야 합니다 Task(Of Integer) .Therefore, the function declaration of DelayAsync must have a return type of Task(Of Integer). 반환 형식이 이므로 Task(Of Integer) Await 의 식 계산에서 DoSomethingAsync 다음 문과 같이 정수가 생성 됩니다 Dim result As Integer = Await delayTask ..Because the return type is Task(Of Integer), the evaluation of the Await expression in DoSomethingAsync produces an integer, as the following statement shows: Dim result As Integer = Await delayTask.

프로시저는 startButton_Click 프로시저의 예입니다 Async Sub .The startButton_Click procedure is an example of an Async Sub procedure. 는 함수 이기 때문에 DoSomethingAsync Async 에 대 한 호출 작업은 DoSomethingAsync 다음 문과 같이 대기 되어야 합니다 Await DoSomethingAsync() ..Because DoSomethingAsync is an Async function, the task for the call to DoSomethingAsync must be awaited, as the following statement shows: Await DoSomethingAsync(). startButton_Click Sub 프로시저에 Async 식이 있으므로 한정자를 사용 하 여 프로시저를 정의 해야 합니다 Await .The startButton_Click Sub procedure must be defined with the Async modifier because it has an Await expression.

' Imports System.Diagnostics
' Imports System.Threading.Tasks

' This Click event is marked with the Async modifier.
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
    Await DoSomethingAsync()
End Sub

Private Async Function DoSomethingAsync() As Task
    Dim delayTask As Task(Of Integer) = DelayAsync()
    Dim result As Integer = Await delayTask

    ' The previous two statements may be combined into
    ' the following statement.
    ' Dim result As Integer = Await DelayAsync()

    Debug.WriteLine("Result: " & result)
End Function

Private Async Function DelayAsync() As Task(Of Integer)
    Await Task.Delay(100)
    Return 5
End Function

'  Output:
'   Result: 5

참고 항목See also