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

업데이트: 2007년 11월

메서드는 일련의 문을 포함하는 코드 블록입니다. 프로그램에서는 메서드를 호출하고 필요한 메서드 인수를 지정하여 메서드에 포함된 문을 실행합니다. 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);            
    }
}

메서드 매개 변수 및 인수

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

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;
}

참조로 전달 및 값으로 전달

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

참조 형식은 참조로 전달됩니다. 참조 형식의 개체를 메서드에 전달하는 경우 이 참조는 복사본을 가리키지 않고 원래 개체를 가리킵니다. 따라서 이 참조를 통해 변경한 내용은 호출하는 메서드에 반영됩니다. 다음 예제와 같이 참조 형식은 class 키워드를 사용하여 작성됩니다.

public class SampleRefType
{
    public int value;
}

이 형식을 기반으로 하는 개체를 메서드에 전달하면 개체가 참조로 전달됩니다. 예를 들면 다음과 같습니다.

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를 통해 수정한 내용이 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);
obj.SquareANumber(result);
obj.SquareANumber(obj.AddTwoNumbers(1, 2));

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

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

C# 언어 사양

자세한 내용은 C# 언어 사양에서 다음 단원을 참조하십시오.

  • 1.6.6 메서드

  • 10.6 메서드

참고 항목

개념

C# 프로그래밍 가이드

참조

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

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

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

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

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

params(C# 참조)

return(C# 참조)

out(C# 참조)

ref(C# 참조)

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