46. params 가변 인자: 오버로드 해석과 호출당 배열 할당

난이도 중 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C#
// 문제 46 — params 가변 인자: 오버로드 해석과 호출당 배열 할당
//
// 주제: params 매개변수는 컴파일러가 어떻게 처리하는가? params 오버로드와 일반
//   오버로드가 함께 있을 때 어떤 것이 선택되는가? 각 호출은 힙에 배열을 새로 할당하는가?
//
// 과제:
//   1) 아래 Which(...) 각 호출이 출력하는 문자열을 예측하라.
//   2) 각 호출에서 "새 배열이 힙에 할당되는지" 를 예측하고 이유를 설명하라
//      (인자 0개, 명시적 배열 전달 포함).
//   3) params object[] 에 값 형식을 넘길 때 무슨 일이 일어나는지(Log 호출) 설명하라.

using System;

public static class VarargDemo
{
    public static string Which(int a, int b) => "exact(int,int)";
    public static string Which(params int[] xs) => $"params(len={xs.Length})";

    public static void Log(string fmt, params object[] args)
    {
        Console.WriteLine($"{fmt} / argc={args.Length}");
    }

    public static void Run()
    {
        Console.WriteLine(Which(1, 2));                 // (1)
        Console.WriteLine(Which(1, 2, 3));              // (2)
        Console.WriteLine(Which());                     // (3)
        Console.WriteLine(Which(new int[] { 1, 2 }));   // (4)

        Log("hit", 42, "orc");                          // (5)
    }
}
내 리뷰 · C#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.