Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 메서드가 여러 값을 반환하는 방법: ValueTuple 완벽 가이드

C#에서는 튜플(Tuple)을 사용하여 하나의 메서드에서 여러 값을 반환할 수 있습니다. 튜플은 서로 관련이 있거나 없을 수도 있는 여러 값을 하나의 데이터 집합으로 저장할 수 있게 해주는 자료 구조입니다. 특히 C# 7.0(.NET Framework 4.7)부터 도입된 ValueTuple은 기존의 Tuple보다 개선된 형태로, 성능이 뛰어나고 프로그래머가 직접 지정한 이름으로 각 요소를 참조할 수 있다는 장점이 있습니다.

ValueTuple의 특징

ValueTuple은 기존 메서드에서 여러 값을 반환하기 위한 경량화된 메커니즘을 제공합니다. 별도의 클래스나 구조체를 정의하지 않고도 손쉽게 다중 반환 값을 처리할 수 있으며, System.ValueTuple NuGet 패키지를 통해 사용할 수 있습니다.

메서드 시그니처는 다음과 같이 작성합니다.

public (int, string, string) GetPerson() { }

예제 1: Item1, Item2, Item3으로 값 접근하기

아래 예제는 GetFruits() 메서드가 세 개의 값(int, string, string)을 반환하는 모습을 보여줍니다. 반환된 튜플의 각 요소는 fruits.Item1, fruits.Item2, fruits.Item3 형태로 접근할 수 있습니다.

using System;
namespace DemoApplication{
    class Program{
        public static void Main(){
            var fruits = GetFruits();
            Console.WriteLine($"Fruit Id: {fruits.Item1}, Name: {fruits.Item2}, Size: {fruits.Item3}");
            Console.ReadLine();
        }
        static (int, string, string) GetFruits(){
            return (Id: 1, FruitName: "Apple", Size: "Big");
        }
    }
}

출력 결과

Fruit Id: 1, Name: Apple, Size: Big

예제 2: 분해(Deconstruction)를 통한 개별 요소 접근

Item1, Item2처럼 기본 이름 대신 분해(deconstructing) 기법을 사용하면 튜플의 각 멤버를 의미 있는 변수 이름으로 바로 받을 수 있습니다. 코드의 가독성이 크게 향상되므로 실무에서 권장되는 방식입니다.

(int FruitId, string FruitName, string FruitSize) = GetFruits();

전체 코드는 다음과 같습니다.

using System;
namespace DemoApplication{
    class Program{
        public static void Main(){
            (int FruitId, string FruitName, string FruitSize) = GetFruits();
            Console.WriteLine($"Fruit Id: {FruitId}, Name: {FruitName}, Size: {FruitSize}");
            Console.ReadLine();
        }
        static (int, string, string) GetFruits(){
            return (Id: 1, FruitName: "Apple", Size: "Big");
        }
    }
}

출력 결과

Fruit Id: 1, Name: Apple, Size: Big

정리

C# 7.0 이상에서는 ValueTuple을 활용하면 out 매개변수나 별도의 클래스 정의 없이도 메서드에서 여러 값을 깔끔하게 반환할 수 있습니다. 기본 요소 이름(Item1, Item2...)으로 접근하거나, 분해 문법을 사용해 명명된 변수로 받는 두 가지 방식을 상황에 맞게 활용하면 코드의 가독성과 유지보수성을 모두 높일 수 있습니다.