출처 :exclamation:

  • 본 내용은 C# 공부 내용이며 책과 강의를 정리한 내용입니다

강의 목표

  • 메소드란
  • 메소드 선언하기
  • 메소드 호출하기
  • 참조로 매게변수 전달하기
  • 출력전용 인수, 가변길이 인수, 명명된 인수, 선택적 인수


메소드 Method

  • 이련의 코드를 하나의 이름 아래 묶은 것
  • 묶은 코드는 메소드의 이름을 불러주는 것만으로 실행
  • c c++ 에서는 함수, 파스칼에서는 프로시져라고 부름

| 메소드 선언

클래스 내부에 선언
메소드 선언 필수 요소 세가지

| 반환형식 | 메소드이름 | 매개변수목록| |—|—|—|

class 클래스이름
{
  한정자 반환형식 메소드이름 (매개변수목록)
  {
    ...
    return 메소드결과;
  }
  
}

결과를 반환할때 return 사용 : return을 쓰게 되면 메소드가 실행되기 전 위치로 실행 흐름이 이동하게 된다



| 메소드 선언과 호출 예제

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

}

int x =  Calculator.Plus(3,4);
static 없었다면 
Calculator calc = new Calculator(~ ); 이런식으로 인스턴스 객체를 만든다음에 써야한다
int x = calc.Plus(3,4);

메소드입장에서는 매개변수이지만 메소드를 호출한 입장에서는 인수(Arguments) 라고 부른다



| return에 관하여

  • 호출자에게 결과를 반환
  • 프로그램 제어를 즉시 호출자에게 이동시킴
  • 반환형식과 일치하는 데이터를 반환해야함
  • void 면 반환이 없음
    ex. Console.WriteLine()



| 참조로 인수 전달하기 Pass by Reference

  • 매개변수가 인수를 참조
  • ref 키워드를 이용하여 선언 호출
  • 메소드 내부의 매개변수가 인수를 참조하도록 하는 방법
[a, b 값이 달라지지만 x, y 값에 영향을 미치지 않는다]
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); 
}

[a, b 값이 달라지고  x, y 값에 영향을 미친다]
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); 
}



| 출력 전용 매개변수

  • return 과 유사하지만 여러개를 반환할 수 있다
  • out 키워드 사용
  • out 하면 출력전용 매게변수가 됨
  • 참조로 인수 전달하기와 개념은 유사
[출력 전용 매개변수 VS 참조로 인수 전달하기]
ref 참조로 인수 전달하기는 인수 값이 수정되지 않아도 컴파일 에러를 출력하지 않음
out 출력 전용 매개변수를 사용하고 인수값이 수정되지않으면 컴파일러가 문제를 제기함
void Divide ( int a, int b, 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("{0},{1}",c,d);



| 메소드 오버로딩 :star:

  • 하나의 메소드 이름에 여러 버전의 구현을 올리는 것
  • overloading 과적하다
  • 이름이 같은 메소드가 있으면 원래 에러를 발생하지만 데이터 형식만 다른 경우 컴파일 에러 발생하지 않는다
  • 인수를 보고 어떤 버전을 호출해야겠다 판단함
[이걸 c#이 제공하는 이유]
int 끼리 더하는 PlusInt 메소드, double끼리 더하는 PlusDouble 가 있다면
그냥 더하는 기능은 같은데 매번 이름 짓기도 귀찮
메소드 사용하는 입장에서도 번거로움
로직이 동일하고 데이터 형식만 동일하다면 여러가지 이름을 짓느라 고생안해도 되고 이름 찾느라 고생안해도됨
int Plus(int a, int b)
{
  return a+b;
}
double Plus(double a, double b)
{
  return a+b;
}

int x = Plus(1,2);
double y = Plus(3.1,2.4);




| 가변길이 인수

  • 개수를 유연하게 조절할 수 있는 인수
  • 형식이 아니라 인수 개수가 다를 때쓰는 가변길이 인수
  • params배열 을 사용
int Sum(params int[] args)
{
  int sum = 0;
  for(int i=0;i<args.Length;i++)
  {
    sum += arg[i];
  }
  return sum;
}
int total =0;
total = Sum(1,2,3,4,5);
total = Sum(1,2,3);

| 명명 된 인수

  • 메소드 호출시 매게변수의 이름을 명시
  • 아얘 지정을 해버림
void My(int a, int b){
  console.WriteLine("{0},{1}",a,b)
}
static void Main(string[] args)
{
  My(a : 3, b: 4);
}

| 선택적 인수

  • 넣어도 되고 안넣어도 되는 인수
  • 인수에서 값을 안넣어주면 매개변수의 기본값을 할당하게 됨
  • 기본값을 할당해야함
  • 호출자가 인수를 입력하지 않은 경우에 대해 기본값을 활용하게됨
void My(int a=0, int b =0){
  console.WriteLine("{0},{1}",a,b)
}

my(3);

태그:

카테고리:

업데이트:

댓글남기기