Post

[C#] Lec 04 - 메서드

[C#] Lec 04 - 메서드

메소드

  • 일련의 코드를 하나의 이름으로 묶은 것
  • 메소드 호출 만으로 복잡한 코드를 단순히 활용할 수 있음.
1
2
3
4
5
6
7
8
9
class 클래스의_이름
{
	한정자 반환_형식 메소드의_이름 (매개변수) //메소드에 입력하는 매개변수의 목록
	{//한정자 : 메소드의 속성을 수식
		실행_코드;
		return 메소드의_결과; 
		//반환 형식과 메소드의 결과 형식이 같아야 함.
	}
}
  • 클래스 내부에 메소드가 선언되어야 함.
  • 메소드의 선언에는 매개변수와 반환 형식이 필요하며, 메소드 호출 시 매개변수를 갑당 결과를 호출자에 반환하는 역할.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace Project
{
	class Calculator
	{
		static public int Sum(int i, int j)
		{
			return i+j;
		}
	}
	class Program
	{
		static void Main(string[] args)
		{
			int a=10, b=20;
			int c= Calculator.Sum(a, b); //30 출력.  Calculator 내부의 Sum 불러와야 하므로
			//Calculator.Sum(i,j) 활용
			//같은 namespace 내부에 있기 때문에 using 안해도 사용가능.
		}
	}
}
  • Sum(i,j)에서 Sum(a, b)이므로 따로 int i=a, int j=b를 할당하여 복사하는 역할을 함(매개변수가 대입시 암묵적 시행)
  • 매개변수는 값에 의한 전달(call by value)만을 시행하므로 전달된 변수와 호출에서 사용된 변수는 서로 별개의 변수로 관계가 없음.
  • 매개 변수 부분의 변수 종류를 맞춰주어야 함. 혹은 명시적 변환
  • 같은 class 내부의 경우 한정자에 private이 포함되어 있어도 사용가능.
  • static 함수 내에서는 static 함수만 불러올 수 있음. (컴파일할 때 메모리 상에 함수가 업로드 되어야 하므로.)
  • 매개 변수도 메소드 외부에서 내부로 데이터를 전달하는 매개체 역할을 할 뿐 근본적으로는 변수. 즉 한 변수를 다른 변수에 할당하면 변수가 담고 있는 데이터만 복사가 됨.

Return

  • Return 문은 원래 점프문의 한 종류. 프로그램을 호출자에게로 즉시 돌려놓는 역할
  • Return문은 method 어디에도 올 수 있으며, 그 즉시 method를 종결시키고 프로그램의 흐름을 호출자에게로 돌려줌

재귀문

1
2
3
4
5
6
7
8
9
10
11
12
13
static int Fibonacci(int a)
{
	if (a<=2)
	{
		return 1;
	}
	else
		return Fibonacci(n-1)+Fibonacci(n-2);
}
static void Main(string[] args)
{
	Console.WriteLine(Fibonacci(10));//55 출력
}

Main 문의 매개변수

  • Main문의 매개변수는 (string[] args)로 이를 사용하려면 args[0], args[1] 이런식으로 string 배열의 형태로 들어가게 됨.

Method - Call by reference

  • 값에 의한 전달의 경우 Swap 같은 부분 전달할 수 없음. → 참조에 의한 전달(call by reference)를 이용하여 ref 키워드 활용필요

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Calculator
{
	public static void swap (ref int a, ref int b)
    { // Ref를 이용하기 때문에 int a = x, int b = y가 아닌
	//ref int a = &x, ref int b = &y를 대입함.
	int temp = a;
		a = b;
		b = temp;
    }
}
class Program
{
	static void Main(string[] args)
	{
		int x = 3, y = 4;
		Calculator.swap(ref x, ref y);
		Console.WriteLine($"X={x}, Y={y}");
	}
}
  • 이 때 메모리에서는 원래 x와 y에 대한 변수의 주소가 01, 02라고 한다면, a에는 &01이, b에는 &02가 지정되며 두 값을 바꾸는 순간 주소를 통해 해당 값을 바꾸게 됨.

예제 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Calculator
{
	public static void Divide (int a, int b, ref int quotient, ref int remainder)
    {
		quotient = a/b;
		remainder = a%b;
    }
}
class Program
{
	static void Main(string[] args)
	{
		int x = 3, y = 4;
		int q = 0, r=0; //사실상 정의만 내려주면 됨, 값은 의미없음.
		Calculator.Divide(x, y, ref q, ref r);
		Console.WriteLine($"X={q}, Y={r}");
	}
}
  • 이렇게하면 ref를 통하여 변수를 출력할 수 있게 됨. 그러나 method의 정의에서 ref를 통한 출력값을 할당하지 않을 경우 런타임 오류를 발생시킬 수 있으므로 후술하는 out을 이용.

out 키워드를 활용한 call by reference

예제(앞선 몫, 나머지 method의 변형)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Calculator
{
	public static void Divide (int a, int b, out int quotient, out int remainder)
    {
		quotient = a/b;
		remainder = a%b; // if remainder가 method에서 정의되지 않을 경우
		//오류를 출력하게됨. 왜냐하면 remainder는 출력전용 ref 변수이므로.
    }
}
class Program
{
	static void Main(string[] args)
	{
		int x = 3, y = 4;
		int q = 0, r=0; //사실상 정의만 내려주면 됨, 값은 의미없음.
		Calculator.Divide(x, y, out q, out r);
		Console.WriteLine($"X={q}, Y={r}");
	}
}

메소드 오버로딩

  • 매개변수를 구분하여 같은 이름으로 여러 개의 메소드를 할당할 수 있음.
  • 코드의 일관성 유지, 생산성 높이는 역할

예제

1
2
3
4
5
6
7
8
9
10
11
class Calculator
{
	public static int Sum (int a, int b)
    {
		return a + b;
    }
	public static double Sum(double a, double b)
    {
		return a + b;
    }
}

선택적 매개변수

  • 선택적 매개변수는 매개변수에 default 값을 주는 방법으로 지정 가능. 이 때 항상 선택적 매개변수는 필수 매개변수 뒤에 와야 함.
  • 칸을 건너뛰어 선택적 매개변수를 입력하고 싶은 경우 , optionalint : 4) 이런식으로 입력

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Calculator
{
	public static int Sum (int a, int b, int c=0, int d = 0)
	{
		return a + b + c + d;
	}
}
class TestProject
	public static void Main(string[] args)
    {
		int a = Calculator.Sum() //사용 불가능. (필수 매개변수 missing)
		int b = CalCulator.Sum(1, 2) //사용가능
		int c = Calculator.Sum(1, 2, 3, 4) //사용가능
		int d = Calculator.Sum(1, 2, d:5) //사용가능.
    }
}
This post is licensed under CC BY 4.0 by the author.