C#

3. 메소드란?

루체도 2020. 1. 28. 20:56
class 클래스 명
{
  한정자 반환형식 메소드명(매개변수 목록)
  {
    메소드의 코드
    
    
    return 결과;
  }
}

 

메소드

- 객체 지향 프로그래밍 언어에서 사용하는 용어로 함수 혹은 프로시저라고도 불립니다.

  자세히 들어가면 의미 차이가 존재하지만 큰 맥락에서는 각 용어들이 같은 것을 지칭합니다.

- 메소드는 일련의 코드를 하나의 이름 아래 묶은 것입니다.
- 객체의 일을 처리하는 방법, 또는 방식이라고 생각하기

- 메소드는 매개 변수와 반환 형식을 가진 채 클래스 내부에서 존재한다.

- 코드의 반복을 방지해준다.

 

실제 메소드의 선언 예는 다음과 같다.

class Calc
{
  public static int Plus(int a, int b)
  {
     Console.WirteLine("Input : {0}, {1}",a, b);
     
     return a+b; 
  }

}

메소드 없이 Main에서 단순히 더하기를 한다고 한다면 중복되는 코드가 많아지게 된다.

static 한정자
C#에서 static은 메소드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정하는 한정자이다.
위 예제에서 Plus 메소들르 호출하려고 할 때 Calc의 인스턴스를 만들지 않고도 호출할 수가 있다.
ex)Calc.Plust(x,y);

 

값에 의한 매개변수 전달

public static void Main(string[] args)
{
  int x = 3;
  int y = 4;
  
  int result = Calc.Plus(x,y);
}

위의 Plus 예제 함수를 Main에서 이렇게 사용을 해봤습니다.

이렇게 매개 변수로 x,y를 넘겨주게 되면 넘겨진 데이터는 실제로 Plus 메소드 안으로 들어갈까?

아니다. 변수가 담고 있는 데이터만 복사가 될 뿐이다.

그래서 Plus메소드 안에서 넘겨받은 x,y 변수의 값을 변경해주어도 실제 Main에서 x,y 변수의 값은 변동되지 않는다. 

이처럼 메소드를 호출할 때 데이터를 복사해서 매개 변수에 넘기는 것을 "값에 의한 전달(Call by value)"라고 한다

 

참조에 의한 매개변수 전달

Call by Value는 매개변수로 넘겨받은 변수의 값을 변경하여도 실제 그 변수에 영향을 주지 않았다.  

변경하고 싶을 때는 Call by Reference 즉 참조에 의한 전달로 매개변수를 넘기면 된다.

참조에 의한 전달은 매개 변수가 메소드에 넘겨진 원본 변수를 직접 참조를 한다.

따라서 변경을 하면 매개 변수가 참조하고 있는 원본 변수에도 영향을 끼친다.

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


public static void Main(string[] args)
{
  int x = 3;
  int y = 4;
  
  Swap(ref x, ref y);
}

 

출력 전용 매개변수

C#에서는 출력 전용 매개 변수인 out 키워드를 제공을 한다.

void Divide(int a, int b, out int quotient, out int remainder)
{
  quotient = a / b;
  remainder = a % b;
}

out 키워드를 이용해서 매개 변수를 넘길 때는 메소드가 해당 매개 변수에 결과를 저장하지 않으면

컴파일러가 에러 메시지를 출력을 한다. 메소드를 호출하는 쪽에서는 초기화를 하지 않은 지역 변수를

메소드의 out 매개 변수로 넘겨 줄 수 있다. 왜냐면 컴파일러가 호출당하는 메소드에서 그 지역 변수를

할당할 것을 보장하기 때문이다.

 

 

메소드 오버로딩

하나의 메소드 이름에 여러 개의 구현을 올린다는 뜻

int Plus(int a, int b)
{
  return a + b;
}

double Plus(double a, double b)
{
  return a + b;
}

이렇게 오버로딩을 하면 컴파일러가 메소드 호출 코드에 사용되는 매개 변수의 수와 형식을 통해

어떤 버전이 호출될지를 찾아준다. 컴파일 타임에 이루어지므로 성능의 저하는 발생하지 않는다.

메소드 오버로딩은 메소드의 이름에 대한 고민을 덜어주며 코드를 일관성 있게 유지를 해준다.