C# 학습/C# 언어의 기초
C# 세미나 자료: 매개변수 (Parameters)
DevGourmet
2025. 4. 8. 01:25
1. 개요
C#에서 메서드에 값을 전달할 때 사용되는 **매개변수(parameter)**는 다양한 전달 방식과 수식어를 통해 유연하고 강력한 함수 호출이 가능합니다. 값 전달, 참조 전달, 선택적 매개변수, 명명된 인수 등 다양한 패턴은 실무에서 함수 사용의 유연성과 가독성을 크게 향상시킵니다.
본 세미나에서는 C#의 주요 매개변수 전달 방식과 수식어를 초급부터 고급까지 단계적으로 설명합니다.
2. 기본 전달 방식
2.1 인수를 값으로 전달 (Call by Value)
- 기본적인 전달 방식 (값 형식, 참조 형식 모두 사용 가능)
- 값이 복사되어 전달되므로, 원본은 변경되지 않음
void Increment(int x)
{
x += 1;
}
int a = 5;
Increment(a);
Console.WriteLine(a); // 5 (변경되지 않음)
3. 참조 전달
3.1 ref 수정자
- 변수를 참조로 전달 → 메서드 내부에서 직접 수정 가능
- 호출 전 반드시 초기화되어야 함
void Increment(ref int x)
{
x += 1;
}
int a = 5;
Increment(ref a);
Console.WriteLine(a); // 6 (값이 수정됨)
3.2 out 수정자
- 메서드 내에서 값을 반드시 설정해야 함
- 호출 시 초기화되어 있지 않아도 됨
void GetValues(out int a, out int b)
{
a = 10;
b = 20;
}
int x, y;
GetValues(out x, out y);
Console.WriteLine(x); // 10
3.3 참조 전달의 영향
- 참조형을 값으로 전달하면 참조 복사 (객체 변경은 가능, 참조 자체 변경은 불가)
- ref, out을 사용하면 참조 자체도 변경 가능
void Replace(ref string s)
{
s = "새 문자열";
}
string msg = "기존 문자열";
Replace(ref msg);
Console.WriteLine(msg); // "새 문자열"
4. 매개변수 수식어
4.1 params 수정자
- 가변 인수 목록 (배열처럼 전달됨)
void PrintNumbers(params int[] nums)
{
foreach (var n in nums)
Console.WriteLine(n);
}
PrintNumbers(1, 2, 3); // 가변 길이 인수 전달
- 반드시 마지막 매개변수에만 사용 가능
5. 선택적 매개변수 (Optional Parameters)
- 기본값을 지정하여 생략 가능
void Greet(string name = "손님")
{
Console.WriteLine($"안녕하세요, {name}님");
}
Greet(); // "안녕하세요, 손님님"
Greet("철수"); // "안녕하세요, 철수님"
6. 명명된 인수 (Named Arguments)
- 매개변수 이름을 명시하여 순서를 변경하거나 가독성 향상
void Log(string message, string level = "Info")
{
Console.WriteLine($"[{level}] {message}");
}
Log(message: "프로그램 시작", level: "Debug");
Log(level: "Error", message: "예외 발생");
- 선택적 매개변수와 함께 사용 시 유용
7. 결론
- 기본 전달은 값 복사, ref/out은 참조 전달로 동작함
- params로 가변 인자 처리, default로 선택적 매개변수 제공 가능
- 명명된 인수는 코드 가독성과 유지보수에 효과적
- 메서드 설계 시 유연성과 명확성을 고려하여 매개변수 수식어를 적절히 활용해야 함
8. Q&A
Q1. ref와 out의 가장 큰 차이는 무엇인가요?
A1. ref는 호출 전 초기화가 필요하고, out은 호출된 메서드에서 반드시 값을 설정해야 합니다.
Q2. 참조형 인수를 ref 없이 전달하면 변경 가능한가요?
A2. 객체 내부 값은 변경 가능하지만 참조 자체를 바꾸려면 ref가 필요합니다.
Q3. params를 중간에 넣을 수 있나요?
A3. 아니요. params 매개변수는 반드시 메서드 매개변수 목록의 마지막에 와야 합니다.
Q4. 선택적 매개변수는 어떤 타입에만 사용할 수 있나요?
A4. 모든 타입에 사용할 수 있으며, 값 형식은 기본값을 지정해야 하고 참조 형식은 null 가능