Menu
Coddy logo textTech

'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.WriteLinestring.Format과 같은 메서드에서 이 키워드를 볼 수 있습니다.

challenge icon

챌린지

쉬움

어떤 개수의 값이라도 처리할 수 있도록 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를 호출한 뒤, 그 결과도 출력합니다.

예를 들어, 입력이 Scores85,90,78인 경우 출력은 다음과 같아야 합니다:

Hello params world!
Scores: 85, 90, 78

Combine이 어떻게 임의의 개수의 문자열을 직접 받아들이는지, 그리고 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));  // 60

params에 대한 규칙:

  • 메서드는 하나의 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를 사용하세요
        // 그리고 결과를 출력하세요
        
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨