'params' 키워드
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 47번째.
params 키워드를 사용하면 메서드가 동일한 형식의 인수를 가변적인 개수로 받을 수 있습니다. 호출자가 배열을 직접 생성할 필요 없이, 인수를 쉼표로 구분하여 직접 전달할 수 있습니다.
메서드 시그니처의 배열 매개변수 앞에 params를 작성하세요:
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
total += n;
return total;
}
// 이 모든 호출이 정상적으로 작동합니다.
Console.WriteLine(Sum(1, 2)); // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // 15
Console.WriteLine(Sum()); // 0 (빈 배열)컴파일러는 인자들을 자동으로 배열로 감쌉니다. 이미 배열이 있는 경우 기존 배열을 직접 전달할 수도 있습니다:
int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values)); // 60기억해야 할 몇 가지 규칙이 있습니다: 메서드는 하나의 params 매개변수만 가질 수 있으며, 목록에서 마지막 매개변수여야 합니다. 일반 매개변수와 결합할 수 있습니다:
public static void Log(string prefix, params object[] items)
{
foreach (var item in items)
Console.WriteLine(prefix + item);
}
Log("Item: ", "Apple", 42, true);params 키워드는 API를 더 유연하고 호출하기 편리하게 만들어 주며, 그렇기 때문에 Console.WriteLine 및 string.Format과 같은 메서드에서 이 키워드를 볼 수 있습니다.
챌린지
쉬움어떤 개수의 값이라도 처리할 수 있도록 params 키워드를 사용하는 유연한 메시지 포매터를 만들어 보겠습니다. 가변 인자를 사용하여 메시지 형식을 지정할 수 있는 유틸리티 클래스를 생성하여, params가 메서드를 어떻게 더 다재다능하고 호출하기 쉽게 만드는지 실습해 봅니다.
코드는 두 개의 파일로 구성됩니다:
MessageFormatter.cs:Formatting네임스페이스 안에params를 사용하는 두 개의 메서드를 가진MessageFormatter클래스를 생성합니다:Combine(params string[] parts)- 제공된 모든 문자열을 공백으로 연결하여 결과를 반환합니다.FormatList(string label, params int[] numbers)- 일반 매개변수와params배열을 결합합니다. 레이블 뒤에 콜론을 붙이고, 그 뒤에 쉼표로 구분된 모든 숫자를 반환해야 합니다 (예:Scores: 85, 90, 78).
Program.cs: 메인 파일에서 입력을 사용하여 두 메서드를 모두 시연합니다. 레이블 문자열을 읽은 다음, 쉼표로 구분된 정수 한 줄을 읽습니다.Combine을 사용하여 세 개의 고정된 단어를 결합하고,FormatList를 사용하여 레이블과 숫자를 표시합니다.
두 개의 입력을 받게 됩니다:
- 레이블 문자열 (예:
Scores) - 쉼표로 구분된 정수 목록 (예:
85,90,78,92)
먼저, "Hello", "params", "world!" 단어들로 Combine을 호출하고 결과를 출력합니다. 그런 다음 쉼표로 구분된 정수들을 배열로 파싱하고 레이블과 정수 배열을 사용하여 FormatList를 호출한 뒤, 그 결과도 출력합니다.
예를 들어, 입력이 Scores와 85,90,78인 경우 출력은 다음과 같아야 합니다:
Hello params world!
Scores: 85, 90, 78Combine이 어떻게 임의의 개수의 문자열을 직접 받아들이는지, 그리고 FormatList가 일반 매개변수와 params를 어떻게 혼합할 수 있는지 확인해 보세요. params 매개변수는 마지막에 위치하기만 하면 됩니다. 또한 기존 배열을 params 메서드에 전달할 수도 있는데, 파싱된 정수 배열을 전달할 때 바로 이 방식을 사용하게 됩니다!
치트 시트
params 키워드를 사용하면 호출자가 배열을 수동으로 생성할 필요 없이 메서드가 동일한 형식의 가변적인 개수의 인수를 수락할 수 있습니다:
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
total += n;
return total;
}
// 이 모든 호출이 작동합니다
Console.WriteLine(Sum(1, 2)); // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // 15
Console.WriteLine(Sum()); // 0 (빈 배열)기존 배열을 params 메서드에 직접 전달할 수 있습니다:
int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values)); // 60params에 대한 규칙:
- 메서드는 하나의
params매개변수만 가질 수 있습니다 - 목록에서 마지막 매개변수여야 합니다
- 일반 매개변수와 결합할 수 있습니다
public static void Log(string prefix, params object[] items)
{
foreach (var item in items)
Console.WriteLine(prefix + item);
}
Log("Item: ", "Apple", 42, true);직접 해보기
using System;
using Formatting;
class Program
{
public static void Main(string[] args)
{
// 입력 읽기
string label = Console.ReadLine();
string numbersInput = Console.ReadLine();
// TODO: "Hello", "params", "world!"와 함께 MessageFormatter.Combine을 사용하세요
// 그리고 결과를 출력하세요
// TODO: 쉼표로 구분된 정수들을 int 배열로 파싱하세요
// Hint: 문자열을 분할하고 각 부분을 int로 변환하세요
// TODO: label과 int 배열과 함께 MessageFormatter.FormatList를 사용하세요
// 그리고 결과를 출력하세요
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.