C#

[C#] 메소드

콩스프 2023. 9. 21. 21:51

메소드 (Method)

  • 일련의 코드를 하나의 이름 아래 묶는 것
  • 묶은 코드는 메소드의 이름을 불러주는 것만으로 실행
  • C/C++에서는 함수(Function), 파스칼에서는 프로시져(Procedure) 등으로 부름

 

메소드 선언

  • 클래스 내부에 선언
  • 메소드 선언 필수 요소
    • 반환 형식 (==출력)
    • 메소드 이름
    • 매개변수 목록 (==입력)
  • 결과를 반환할 때 return 문 사용
    : 메소드가 선언되기 전 위치로 실행흐름 이동
class 클래스의_이름
{
    한정자 반환_형식 메소드의_이름 ( 매개_변수_목록 )
    {
        // 실행하고자 하는 코드1
        // 실행하고자 하는 코드2
        // ...
        // 실행하고자 하는 코드n
        return 메소드의_결과;
    }
}

 

 

메소드 선언 EX)

class Calculator
{
    public static int Plus( int a, int b )
    {
        Console.WriteLine("Input : {0}, {1}", a, b);
        int result = a + b;
        return result;
    }
}

 

메소드 호출 EX)

int x = Calculator.Plus(3,4); //x는 7
int y = Calculator.Plus(5,6); //y는 11
int z = Calculator.Plus(7,8); //z는 15
  • 3,4 ➡ 메소드의 입장에서는 매개변수 (Parameter)
           ➡ 메소드를 호출하는 입장에서는 인수 (Argument)

 

return

  • 호출자에게 결과를 반환
  • 프로그램의 제어를 즉시 호출자에게 이동시킴
    * 메소드 중간에 호출하는 경우 메소드에 실행되지 않은 코드가 생길 수 있음
  • 반환형식과 일치하는 데이터를 반환해야 함
  • 메소드가 void 형식인 경우 반환값 없이 사용 가능
void PrintProfile(string name, string phone)
{
    if(name == "")
    {
        Console.WriteLine("이름을 입력해주세요.");
        return;
    }
    Console.WriteLine("Name:{0}, Phone:{1}", name, phone);
}

 

 

Pass by reference

  • 매개변수가 인수를 참조
  • ref 키워드를 이용하여 선언 / 호출
  • ref 키워드 : 인수의 값이 수정되지 않아도 컴파일러가 에러를 출력하지 않음

 

Pass by value EX)

public static void Swap(int a, int b)
{
    int temp = b;
    b = a;
    a = temp;
}

static void Main(String[] args)
{
    int x = 3;
    int y = 4;
    
    Swap(x, y);
}
  • 값이 복사되어 전달됨
  • x와 y에는 영향이 없음

 

Pass by reference EX)

public static void Swap( ref int a, ref int b)
{
    int temp = b;
    b = a;
    a = temp;
}

static void Main(String[] args)
{
    int x = 3;
    int y = 4;
    
    Swap( ref x, ref y);
}
  • 호출할 때도 ref 키워드를 이용하여 호출
  • a와 b가 x,  y를 직접 참조하게 됨

 

 

출력 전용 매개변수

  • 메소드는 out 키워드로 한정한 매개변수에 결과를 입력해야 함
  • out 키워드 : 인수의 값이 수정되지 않으면 컴파일러가 에러를 출력하지 않음
  • return 값은 하나의 값만 반환하지만 출력전용 매개변수를 사용하면 복수 개를 반환할 수 있음
void Divide(int a, intb, out int quotient, out int remainder)
{
    quotient = a / b;
    remainder = a % b;
}

int a=20;
int b=3;
int c;
int d;

Divide(a,b,out c, out d);
Console.WriteLine("Quotient : {0}, Remainder {1}", c, d);

 

 

메소드 오버로딩

  • 하나의 메소드 이름에 여러 버전의 구현을 올리는 것
  • 로직이 동일한데, 데이터의 형식만 다를 때 사용
  • Overloading : 과적하다
//[1]
int Plus(int a, int b)
{
    return a+b;
}

//[2]
double Plus(double a, double b)
{
    return a+b;
}

int result1 = Plus( 1,2 );		//[1] 호출

double result2 = Plus( 3.1, 2.4 );	//[2] 호출

 

 

가변길이 인수

  • 개수를 유연하게 조절할 수 있는 인수
  • params 키워드와 배열을 이용하여 선언
  • 데이터 형식이 같다면 가변길이 인수를 통해 오버로딩 대신 사용
// [ 선 언 ]
int Sum(params int[] args)
{
    int sum = 0;
    for(int i=0; i<args.Length; i++)
    {
        sum += args[i];
    }
    return sum;
}

// [ 호 출 ]
int total = 0;

total = Sum(1,2);
total = Sum(1,2,3);
total = Sum(1,2,3,4,5,6,7,8,9,10);

 

 

명명된 인수

  • Named Argument
  • 메소드 호출시 매개 변수의 이름을 명시하여 매개변수에 데이터를 바인드 하는 기능
static void PrintProfile(string name, string phone)
{
    Console.WriteLine("Name:{0}, Phone:{1}", name, phone);
}

static void Main(string[] args)
{
    PrintProfile(name:"박찬호", phone:"010-123-1234");
}

 

 

선택적 인수

  • 메소드 선언시 매개 변수에 기본 값을 할당
  • 호출자가 인수를 입력하지 않는 경우 메소드는 기본값이 할당된 매개변수 사용
  • 호출자는 해당 매개 변수에 대한 인수 입력 여부 선택이 가능해짐
// [ 선 언 ]
void MyMethod(int a=0, int b=0)
{
    Console.WriteLine("{0}, {1}", a, b);
}

// [ 호 출 ]
MyMethod(3); //매개변수 b 생략
MyMethod(3,4);