본문 바로가기

C#

C# 가변 인자(params)와 성능 이슈

C#에서 가변 인자(params)를 사용하면 메서드 호출 시 인자의 개수를 유동적으로 조절할 수 있어 편리합니다. 하지만 이 편리함이 때로는 성능 저하로 이어질 수 있어 주의가 필요합니다.

1. params의 기본 동작

params 키워드는 내부적으로 배열을 생성하여 인자를 전달합니다. 예를 들어, 다음 코드를 살펴보겠습니다.

void PrintNumbers(params int[] numbers)
{
    foreach (var num in numbers)
    {
        Console.WriteLine(num);
    }
}

이때 호출 시 인자가 여러 개라면 컴파일러가 새 배열을 만들어 전달합니다.

2. 성능 이슈 원인

params 배열을 매번 생성하면, 특히 자주 호출되는 핫스팟 코드에서는 GC 부담과 할당 비용이 발생할 수 있습니다. 따라서 성능에 민감하다면 주의해야 합니다.

3. 최적화 팁

- 가능한 정적 크기 배열 전달이나 오버로드 메서드 활용
- 호출 빈도가 높은 경우 고정 개수 오버로드 메서드 작성
- params 사용이 필요한 경우 호출 빈도를 줄이거나, 구조 변경 고려

4. 예제 비교

아래 예시는 params 사용 시 배열 할당과, 배열 없이 직접 인자를 받는 오버로드를 보여줍니다.

void Log(params string[] messages)
{
    foreach (var msg in messages)
    {
        Console.WriteLine(msg);
    }
}

void Log(string message1, string message2)
{
    Console.WriteLine(message1);
    Console.WriteLine(message2);
}

고성능이 요구되는 상황에서는 두 번째 방식이 더 효율적입니다.

결론적으로, 편의를 위해 가변 인자를 사용하더라도 성능 이슈가 우려된다면 사용 빈도와 방법을 재검토하는 것이 좋습니다.