메서드는 클래스에 정의된 함수입니다. C#은 풍부한 매개변수 기능 — 선택적/명명된 인자, ref/out/in 한정자, params 배열 — 과 메서드 오버로딩(같은 이름이지만 매개변수가 다른 여러 메서드)을 지원합니다.
public int Add(int a, int b) => a + b; // 식 본문(간결함)
public string Greet(string name, string greeting = "Hello") // 기본 매개변수
{
return $"{greeting}, {name}";
}
Greet("Ann"); // "Hello, Ann"
Greet("Ann", greeting: "Hi"); // 명명된 인자
메서드는 반환 타입, 이름, 매개변수를 지정합니다. 기본 매개변수는 인자를 선택적으로 만들고, 명명된 인자는 이름으로 전달할 수 있게 합니다(더 명확하고, 선택적 인자를 건너뛸 수 있음).
// ref — 참조에 의한 전달(메서드가 호출자의 변수를 수정 가능)
void Increment(ref int x) { x++; }
int n = 5; Increment(ref n); // n은 이제 6
// out — 여러 값을 반환하기 위함(메서드 내에서 반드시 대입되어야 함)
bool TryParse(string s, out int result) { result = ...; return true; }
if (int.TryParse("42", out int value)) { } // 흔한 TryX 패턴
// in — 참조에 의해 전달하지만 읽기 전용(큰 struct의 성능을 위함)
void Process(in LargeStruct data) { }
out은 TryParse 패턴에서 널리 쓰이고(성공 플래그와 결과를 안전하게 반환), ref는 호출자의 변수를 수정할 수 있게 하며, in은 큰 struct를 복사 없이 효율적으로 전달합니다.
// params — 가변 개수의 인자
int Sum(params int[] numbers) => numbers.Sum();
Sum(1, 2, 3, 4); // 임의의 개수
// 오버로딩 — 같은 이름, 다른 매개변수
void Print(int x) { }
void Print(string s) { }
void Print(int x, int y) { }
Print(5); // int 버전 호출 — 인자 타입으로 해석됨
오버로딩은 여러 메서드가 이름을 공유하되 매개변수 타입/개수로 구별되게 합니다 — 컴파일러가 일치하는 것을 고릅니다. params는 가변 개수의 인자를 받습니다.
메서드는 C#에서 동작의 구성 요소이며, 풍부한 매개변수 기능을 이해하는 것은 유연하고 표현력 있는 코드를 작성하는 데 중요합니다.
메서드를 정의하는 방법(간결한 식 본문 구문 포함), 기본 및 명명된 매개변수(선택적 인자와 읽기 쉬운 호출을 위함)를 사용하는 방법, 메서드 오버로딩(같은 이름, 다른 매개변수 — 다양한 인자 타입을 처리하는 직관적인 API를 위함)을 적용하는 방법을 아는 것은 일상 지식입니다.
매개변수 한정자는 특히 이해하는 것이 중요합니다. **out**은 어디서나 쓰이는 TryParse 패턴(int.TryParse(s, out var result) — 예외 없이 성공 플래그와 결과를 안전하게 반환하는 흔하고 관용적인 C# 패턴)에서 널리 사용되고, **ref**는 호출자의 변수를 수정할 수 있게 하며, **in**은 성능을 위해 큰 struct를 참조로 전달합니다.
이를 이해하는 것 — 메서드, 매개변수 기능(선택적/명명된/params), 유연한 API를 위한 오버로딩, ref/out/in 한정자(특히 out 기반 TryParse 관용구) — 은 C# 메서드를 작성하는 데에도, 이러한 기능에 의존하는 많은 .NET API를 사용하는 데에도 기본입니다.
메서드와 그 매개변수는 모든 C# 코드의 중심이고, 오버로딩, 선택적 매개변수, TryX 패턴 같은 기능이 끊임없이 등장하므로, 이를 숙달하는 것은 효과적인 C# 개발을 위한 반드시 알아야 할 핵심 지식입니다.