C#

[C#]익명 타입(Anonymous Type)

DevStory 2022. 2. 5.

익명 타입(Anonymous Type)이란?

익명 타입은 C# 3.0에서 추가된 키워드로 타입이 지정되지 않은 변수를 var 키워드로 선언할 수 있습니다. 익명 타입으로 변수를 선언하는 경우 변수 초기화 값을 기반으로 컴파일러가 변수의 타입을 자동으로 결정합니다.

var str = "str";
Console.WriteLine(str.GetType());
// System.String

변수 str은 익명 타입으로 선언되었지만, 초기화 값이 문자열이므로 컴파일러가 변수 str을 문자열 타입이라고 결정합니다. GetType() 메서드를 사용하여 str의 타입이 String인 것을 확인할 수 있습니다.

 

이번 포스팅은 익명 타입에 대해 설명합니다.

 


익명 타입으로 변수 선언 및 주의사항

익명 타입은 암시적 유형으로 초기화하지 않으면 사용할 수 없습니다. 즉, 다음과 같이 변수를 선언 후 나중에 값을 할당하는 경우 오류가 발생합니다.

var str;
str = "string value";

오류 내용

 

익명 타입으로 선언된 변수에는 null값으로 초기화할 수 없습니다.

var str = null;

오류 내용

 

컴파일러가 타입을 자동으로 결정하므로 타입이 다른 값으로 변경하는 경우 오류가 발생합니다.

var intValue = 10;
intValue = "ABC";

오류 내용

 

다음은 익명 타입으로 변수를 선언하고 GetType() 메서드로 컴파일러가 자동으로 할당한 타입을 확인하는 예제입니다.

class Program
{
    static void Main(string[] args)
    {
        var intValue = 10;
        Console.WriteLine("intValue.GetType():" + intValue.GetType());

        var strValue = "string";
        Console.WriteLine("strValue.GetType():" + strValue.GetType());

        var boolValue = true;
        Console.WriteLine("boolValue.GetType():" + boolValue.GetType());

        var doubleValue = 50.20;
        Console.WriteLine("doubleValue.GetType():" + doubleValue.GetType());

        var objectVale = new{ name = "Tom", age = 20 };
        Console.WriteLine("objectVale.GetType():" + objectVale.GetType());

        var arrayIntValue = new[] { 1, 2, 3 };
        Console.WriteLine("arrayIntValue.GetType():" + arrayIntValue.GetType());

        var arrayStringValue = new[] { "A", "B", "C" };
        Console.WriteLine("arrayStringValue.GetType():" + arrayStringValue.GetType());
    }
}

실행 결과

익명 타입으로 배열과 객체를 초기화하는 경우 new 키워드를 사용해야 한다는 엄격한 규칙이 존재합니다.

 

익명 타입으로 객체와 배열로 초기화하는 경우 객체는 속성으로 배열은 인덱스로 접근하여 값을 확인할 수 있습니다. 다음은 익명 타입인 객체와 배열의 값을 확인하는 예제입니다.

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("*****Anoymous Type Object*****");

        var objectVale = new { name = "Tom", age = 20 };
        Console.WriteLine("objectVale.name: " + objectVale.name);
        Console.WriteLine("objectVale.age: " + objectVale.age);

        Console.WriteLine("\n*****Anoymous Type Array*****");

        var arrayStringValue = new[] { "A", "B", "C" };
        Console.WriteLine("arrayStringValue.[0]: " + arrayStringValue[0]);
        Console.WriteLine("arrayStringValue.[1]: " + arrayStringValue[1]);
        Console.WriteLine("arrayStringValue.[2]: " + arrayStringValue[2]);
    }
}

실행 결과

 

익명 타입은 지역 변수에서 사용 가능하며, 메서드 매개변수의 타입으로 익명 타입을 설정할 수 없습니다.

static void PrintConsole(var value)
{
    Console.WriteLine(value);
}

오류 내용

반응형

반복문에서 사용

익명 타입은 반복문에서도 사용할 수 있습니다.

class Program
{
    static void Main(string[] args)
    {
        ArrayList arr = new ArrayList() { 1, "A", 2, "B"};

        Console.WriteLine("*****for loop*****");
        for (var loop = 0; loop < arr.Count; loop++)
        {
            Console.WriteLine(arr[loop]);
        }

        Console.WriteLine("\n*****foreach loop*****");
        foreach (var item in arr)
        {
            Console.WriteLine(item);
        }
    }
}

실행 결과


읽기 전용 속성만 포함

익명 타입의 속성은 읽기 전용이므로 객체로 초기화 후 값을 변경할 수 없습니다.

var objectVale = new { name = "Tom", age = 20 };
objectVale.name = 10;

오류 내용

 

객체를 제외한 int, string, boolean 같은 기본 타입과 배열은 값 변경 가능합니다.

var arrayStringValue = new[] { "A", "B", "C" };
arrayStringValue.SetValue("ABC", 0);
arrayStringValue[1] = "BBB";

var str = 10;
str = 20;

익명 타입의 특징

  • 익명 타입은 최상위 클래스인 System.Object에서 파생되었습니다.
  • 익명 타입의 프로퍼티는 읽기 전용이므로 값을 변경할 수 없습니다.
  • 이벤트, 메서드, 클래스 멤버를 포함하지 않습니다.
  • 익명 타입은 선언과 초기화를 한 번에 수행해야 합니다.
  • 초기화 값을 기반으로 컴파일러가 타입을 결정합니다.
  • null 값으로 초기화 불가능합니다.
  • 주로 LINQ의 반환 결과를 받기 위해 사용됩니다.
  • 메서드의 인수로 사용할 수 없습니다.
반응형

댓글