다음을 통해 공유


메서드(C# 프로그래밍 가이드)

메서드는 일련의 문을 포함하는 코드 블록입니다. 프로그램에서는 메서드를 호출하고 필요한 메서드 인수를 지정하여 메서드에 포함된 문을 실행합니다. C#에서 실행되는 모든 명령은 메서드의 컨텍스트에서 수행됩니다. Main 메서드는 모든 C# 응용 프로그램의 진입점이며 프로그램이 시작되면 CLR(공용 언어 런타임)에 의해 호출됩니다.

참고

이 항목에서는 명명된 메서드에 대해 설명합니다.익명 함수에 대 한 내용은 익명 함수(C# 프로그래밍 가이드).

메서드 시그니처

메서드는 클래스 또는 구조체에서 public, private와 같은 액세스 수준과 abstract, sealed와 같은 선택적 한정자, 반환 값, 메서드 이름 및 메서드 매개 변수를 지정하여 선언합니다. 이러한 부분을 메서드의 시그니처라고 합니다.

참고

메서드 오버로드를 위해 메서드의 반환 형식은 메서드 시그니처의 일부로 처리되지 않습니다.그러나 대리자와 해당 대리자가 가리키는 메서드 사이의 호환성을 결정할 때는 반환 형식도 메서드 시그니처의 일부로 처리됩니다.

메서드 매개 변수는 괄호로 묶어 쉼표로 구분합니다. 빈 괄호는 메서드에 매개 변수가 필요하지 않음을 의미합니다. 다음 클래스에는 3개의 메서드가 포함되어 있습니다.

abstract class Motorcycle
{
    // Anyone can call this. 
    public void StartEngine() {/* Method statements here */ }

    // Only derived classes can call this. 
    protected void AddGas(int gallons) { /* Method statements here */ }

    // Derived classes can override the base class implementation. 
    public virtual int Drive(int miles, int speed) { /* Method statements here */ return 1; }

    // Derived classes must implement this. 
    public abstract double GetTopSpeed(); 
}

메서드 액세스

개체의 메서드를 호출하는 것은 필드에 액세스하는 것과 같습니다. 개체 이름 뒤에 마침표를 추가하고 메서드의 이름과 괄호를 차례로 추가합니다. 인수는 쉼표로 구분하여 괄호 안에 나열합니다. 따라서 다음 예제와 같이 Motorcycle 클래스의 메서드를 호출할 수 있습니다.

class TestMotorcycle : Motorcycle
{

    public override double GetTopSpeed()
    {
        return 108.4;
    }

    static void Main()
    {

        TestMotorcycle moto = new TestMotorcycle();

        moto.StartEngine();
        moto.AddGas(15);
        moto.Drive(5, 20);
        double speed = moto.GetTopSpeed();
        Console.WriteLine("My top speed is {0}", speed);            
    }
}

메서드 매개 변수 VS. 인수

메서드 정의에서는 필요한 모든 매개 변수의 이름과 형식을 지정합니다. 호출하는 코드에서는 메서드를 호출할 때 각 매개 변수에 대해 인수라고 하는 구체적인 값을 제공합니다. 인수는 매개 변수 형식과 호환되어야 하지만 호출하는 코드에서 인수 이름을 사용하는 경우 이 이름은 메서드에 정의된 매개 변수 이름과 같지 않아도 됩니다. 예를 들면 다음과 같습니다.

public void Caller()
{
    int numA = 4;
    // Call with an int variable. 
    int productA = Square(numA);

    int numB = 32;
    // Call with another int variable. 
    int productB = Square(numB);

    // Call with an integer literal. 
    int productC = Square(12);

    // Call with an expression that evaulates to int.
    productC = Square(productA * 3);
}

int Square(int i)
{
    // Store input argument in a local variable. 
    int input = i;
    return input * input;
}

VS 참조에 의해 전달. 값으로 전달

기본적으로 값 형식을 메서드에 전달할 때는 개체 자체가 아닌 복사본이 전달됩니다. 따라서 인수를 변경해도 호출하는 메서드의 원래 복사본에는 영향을 미치지 않습니다. ref 키워드를 사용하여 값 형식을 참조로 전달할 수 있습니다. 자세한 내용은 값 형식 매개 변수 전달(C# 프로그래밍 가이드)을 참조하십시오. 기본 제공 값 형식의 목록을 보려면 값 형식 표(C# 참조)를 참조하십시오.

개체에 대 한 참조는 참조 형식의 개체를 메서드에 전달 하면 전달 됩니다. 즉, 메서드가 개체 자체는 있지만 개체의 위치를 나타내는 인수를 받습니다. 이 참조를 사용 하 여 개체의 멤버를 변경 하는 경우 변경 객체를 값으로 전달 하는 경우에 호출 메서드에 인수에 반영 됩니다.

참조 형식을 사용 하 여 만들는 class 는 다음 예제와 같이 키워드입니다.

public class SampleRefType
{
    public int value;
}

이제이 형식의 메서드를 기반으로 개체를 전달 하는 경우 참조 개체에 전달 됩니다. 다음 예제에서는 형식의 개체로 전달 SampleRefType 메서드에 ModifyObject.

public static void TestRefType()
{
    SampleRefType rt = new SampleRefType();
    rt.value = 44;
    ModifyObject(rt);
    Console.WriteLine(rt.value);
}
static void ModifyObject(SampleRefType obj)
{
    obj.value = 33;
}

메서드에 인수가 값으로 전달 한다는 점에서 예제에서는 이전 예와 동일한 작업을 수행 합니다. 그러나 참조 형식이 사용 되므로 결과가 다릅니다. 변경 됩니다 수정 ModifyObject 에 value 매개 변수의 필드 obj도 변경의 value 인수 필드 rt에서 TestRefType 메서드. TestRefType 메서드는 33의 출력을 표시 합니다.

참조 형식은 값 및 참조로 전달 하는 방법에 대 한 자세한 내용은 참조 하십시오 참조 형식 매개 변수 전달(C# 프로그래밍 가이드)참조 형식(C# 참조).

반환 값

메서드는 호출자에게 값을 반환할 수 있습니다. 반환 형식(메서드 이름 앞에 나열된 형식)이 void가 아니면 메서드에서는 return 키워드를 사용하여 값을 반환할 수 있습니다. return 키워드 다음에 반환 형식에 맞는 값을 지정한 문을 사용하면 메서드 호출자에게 해당 값이 반환됩니다. return 키워드는 메서드의 실행을 중지시키는 데에도 사용합니다. 반환 형식이 void인 경우, 값을 지정하지 않은 return 문을 사용하여 메서드의 실행을 중지시킬 수 있습니다. return 키워드가 없으면 메서드의 실행은 코드 블록의 끝에 도달해야 중지됩니다. void가 아닌 반환 형식을 사용하는 메서드에서는 return 키워드를 사용하여 값을 반환해야 합니다. 예를 들어, 다음 두 메서드에서는 return 키워드를 사용하여 정수를 반환합니다.

class SimpleMath
{
    public int AddTwoNumbers(int number1, int number2)
    {
        return number1 + number2;
    }

    public int SquareANumber(int number)
    {
        return number * number;
    }
}

호출하는 메서드는 메서드에서 반환된 값을 사용하기 위해 동일한 형식의 값을 적절하게 사용할 수 있는 모든 위치에서 메서드 호출 자체를 사용할 수 있습니다. 변수에 반환 값을 할당할 수도 있습니다. 예를 들어 다음 두 코드 예제의 실행 결과는 동일합니다.

int result = obj.AddTwoNumbers(1, 2);
result = obj.SquareANumber(result);
// The result is 9.
Console.WriteLine(result);
result = obj.SquareANumber(obj.AddTwoNumbers(1, 2));
// The result is 9.
Console.WriteLine(result);

이 경우 지역 변수를 사용 하 여 result, 저장할 값은 선택적입니다. 지역 변수를 사용하면 코드의 가독성이 높아질 수도 있고 메서드 전체 범위에 대해 인수의 원래 값을 저장해야 할 때에도 유용할 수 있습니다.

자세한 내용은 return(C# 참조)을 참조하십시오.

비동기 메서드

비동기 기능을 사용 하 여 명시적 콜백을 사용 하거나 여러 메서드 또는 람다 식을 수동으로 코드를 분할 하지 않고도 비동기 메서드를 호출할 수 있습니다. 비동기 기능이 도입 된 Visual Studio 2012.

메서드를 표시 하는 경우는 비동기 한정자를 사용할 수 있습니다에서 기다립니다 연산자 메서드를. Await 식 async 메서드에서 컨트롤에 도달 하면 호출자에 게 제어를 반환 하 고 바뀌게 된 작업이 완료 될 때까지 메서드가 진행 일시 중단 됩니다. 작업이 완료 되 면 실행 메서드를 다시 시작할 수 있습니다.

참고

아직 완료 되지 않은 첫 번째 바뀌게 개체 발견 되거나 비동기 메서드의 끝에 가져옵니다 때 비동기 메서드 호출자에 게 반환 둘 중 먼저 발생 합니다.

비동기 메서드 반환 형식으로 사용할 수 있습니다 Task, Task, 또는 void입니다. Void 반환 형식이 void 반환 형식이 필요한 곳은 주로 이벤트 처리기를 정의 하려면 사용 됩니다. Void를 반환 하는 비동기 메서드를 갖 수 없습니다, 그리고 및 void를 반환 하는 메서드의 호출자가 메서드에서 throw 하는 예외를 catch 할 수 없습니다.

다음 예제에서 DelayAsync 의 반환 형식을 사용 하는 비동기 메서드는 Task. DelayAsync가 return 정수를 반환 하는 명령문입니다. 따라서 메서드 선언 DelayAsync 의 반환 형식이 있어야 합니다 Task<int>. 반환 형식 이므로 Task<int>, 평가 await 식에서 DoSomethingAsync 다음에서 설명 하는 정수를 생성: int result = await delayTask.

startButton_Click 메서드에 void 반환 형식을 사용 하는 비동기 메서드 예제입니다. 때문에 DoSomethingAsync 는 비동기 메서드를 호출 하기 위해 작업입니다 DoSomethingAsync 다음 문에서 볼 수 있듯이 갖 될 해야 합니다: await DoSomethingAsync();. startButton_Click 메서드를 정의할 수 있는 async 한정자 메서드가 있기 때문에 await 식.

// using System.Diagnostics; 
// using System.Threading.Tasks; 

// This Click event is marked with the async modifier. 
private async void startButton_Click(object sender, RoutedEventArgs e)
{
    await DoSomethingAsync();
}

private async Task DoSomethingAsync()
{
    Task<int> delayTask = DelayAsync();
    int result = await delayTask;

    // The previous two statements may be combined into 
    // the following statement. 
    //int result = await DelayAsync();

    Debug.WriteLine("Result: " + result);
}

private async Task<int> DelayAsync()
{
    await Task.Delay(100);
    return 5;
}

// Output: 
//  Result: 5

모든 비동기 메서드를 선언할 수 없습니다 ref 또는 아웃 매개 변수가 있지만 이러한 매개 변수가 있는 메서드를 호출할 수 있습니다.

비동기 메서드에 대 한 자세한 내용은 Async 및 Await를 사용한 비동기 프로그래밍(C# 및 Visual Basic), 비동기 프로그램의 제어 흐름(C# 및 Visual Basic), 및 비동기 반환 형식(C# 및 Visual Basic).

반복기

목록 또는 배열 등의 컬렉션에서 사용자 지정 반복을 수행 하는 반복기입니다. 반복기를 사용 하는 수익률 반환 문은 각 요소는 한 번에 반환 합니다. 경우는 수익률 반환 문에 도달, 코드에서 현재 위치 기억 됩니다. 다음에 반복기가 호출 되 면 해당 위치에서 실행이 다시 시작 됩니다.

사용 하 여 클라이언트 코드에서 반복기를 호출을 foreach 문.

The return type of an iterator can be IEnumerable, IEnumerable, IEnumerator, or IEnumerator.

자세한 내용은 반복기(C# 및 Visual Basic)을 참조하십시오.

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요. C# 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.

참고 항목

참조

클래스 및 구조체(C# 프로그래밍 가이드)

액세스 한정자(C# 프로그래밍 가이드)

정적 클래스 및 정적 클래스 멤버(C# 프로그래밍 가이드)

상속(C# 프로그래밍 가이드)

추상 및 봉인 클래스와 클래스 멤버(C# 프로그래밍 가이드)

params(C# 참조)

return(C# 참조)

out(C# 참조)

ref(C# 참조)

매개 변수 전달(C# 프로그래밍 가이드)

개념

C# 프로그래밍 가이드