익명 타입(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의 반환 결과를 받기 위해 사용됩니다.
- 메서드의 인수로 사용할 수 없습니다.
'C#' 카테고리의 다른 글
[C#]IEnumerable 인터페이스란? (0) | 2022.02.06 |
---|---|
[C#]동적 변수(dynamic) (0) | 2022.02.05 |
[C#]StringBuilder 사용 방법 (1) | 2022.02.05 |
[C#]List 특정 값 존재하는지 체크하는 방법 (1) | 2022.01.24 |
[C#]Mutable과 Immutable(가변과 불변) (1) | 2022.01.18 |
댓글