[This is C#] Chapter 6. 메소드로 코드 간추리기
Table of Contents
이것이 C#이다 책을 읽고 공부한 노트입니다.
메소드 #
- 메소드(Method)
- C와 C++에서의 함수(Function)나 파스칼에서의 프로시저(Procedure)와 같은 것이다.
- 매개변수(Parameter)
- 메소드가 호출자에게서 전달받은 값을 받는 변수.
- 인수(Argument)
- 호출자가 매개변수에 넘기는 값.
class Cal
{
public static int Plus(int a, int b) // a, b는 매개변수
{
return a + b;
}
}
class MainApp
{
static void Main(string[] args)
{
Cal.Plus(4, 5); // 4, 5는 인수
}
}
참조에 의한 전달 #
ref
키워드를 메소드의 매개변수 앞에 사용한다. 그리고 호출할 때ref
키워드를 인수 앞에 사용한다.
class MainApp
{
static void Swap(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int x = 1, y = 2;
Swap(ref x, ref y);
Console.WriteLine("{0}, {1}", x, y); // 2, 1
}
}
참조 반환값 #
ref
키워드를 메소드의 반환값 앞에 사용한다. 그리고return
문이 반환하는 변수 앞에도 사용한다.- 참조로 반환되는 결과를 담는 지역 변수를 참조 지역 변수(Ref local)라고 한다.
class Product
{
private int price = 100;
public ref int GetPrice()
{
return ref price;
}
public void PrintPrice()
{
Console.WriteLine(price);
}
}
class MainApp
{
static void Main(string[] args)
{
Product product = new Product();
// 참조 지역 변수 pref
ref int pref = ref product.GetPrice();
pref = 200;
product.PrintPrice(); // 200
}
}
출력 전용 매개변수 #
- 두 개 이상의 결과를 요구하는 메소드는 어떻게 만들까?
ref
보다 좀 더 안전한out
을 사용한다.
- 출력 전용 매개변수는
out
키워드를 사용한다.- 해당 매개변수에 결과를 저장하지 않으면 컴파일러가 에러 메시지를 출력한다.
out
으로 전달된 값을 사용할 수 없다.- 해당 매개변수로 전달할 변수들을 미리 선언할 필요는 없다. (아래 코드의
c
,d
의 경우)
static void Divide(int a, int b, out int quotient, out int remainder)
{
quotient = a / b;
remainder = a % b;
}
static void Main(string[] args)
{
int a = 20, b = 3;
Divide(a, b, out int c, out int d);
Console.WriteLine("{0}, {1}", c, d); // 6, 2
}
메소드 오버로딩 #
-
메소드 오버로딩(Overloading)
- 하나의 메소드 이름으로 여러 개를 구현한 것이다.
-
방법
- 메소드의 이름을 같게 한다.
- 메소드의 파라미터를 다르게 한다.
가변 개수의 인수 #
- 개수가 유연하게 변할 수 있는 인수이다.
params
키워드와 배열을 이용해서 선언한다.
static int Sum(params int[] args)
{
int sum = 0;
for (int i = 0; i < args.Length; i++)
sum += args[i];
return sum;
}
static void Main(string[] args)
{
int sum = Sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Console.WriteLine(sum); // 55
}
명명된 인수 #
- 메소드를 호출할 때 인수의 이름에 근거해서 데이터를 할당할 수 있는 기능이다.
- 인수가 너무 많아서 어느 매개변수에 어느 인수를 할당하고 있는지 분간이 어려운 경우에 도움이 될 수 있겠다.
static void PrintProfile(string name, string phone)
{
Console.WriteLine($"{name}, {phone}");
}
static void Main(string[] args)
{
PrintProfile(name: "박찬호", phone: "000-0000-0000"); // 박찬호, 000-0000-0000
}
선택적 인수 #
- 매개변수에 기본값을 줄 수 있다. 그리고 기본값을 가진 매개변수는 메소드를 호출할 때 인수를 생략할 수 있다.
- 주의할 점은, 이러한 선택적 인수는 항상 필수 인수 뒤에 와야 한다는 것이다.
static void PrintProfile(string name, string phone = "")
{
Console.WriteLine($"{name}, {phone}");
}
static void Main(string[] args)
{
PrintProfile(name: "박찬호"); // 박찬호,
}
로컬 함수 #
- 로컬 함수는 메소드 안에서 선언되고, 선언된 메소드 안에서만 사용되는 특별한 함수이다.
class SomeClass
{
public void SomeMethod()
{
int count = 0;
SomeLocalFunction(1, 2);
void SomeLocalFunction(int a, int b)
{
//...
count++; // 지역 변수를 사용할 수 있다.
}
}
}