암시적 형식 지역 변수(C# 프로그래밍 가이드)

명시적 형식을 제공하지 않고 지역 변수를 선언할 수 있습니다. var 키워드는 초기화 문의 오른쪽에 있는 식에서 변수의 형식을 유추하도록 컴파일러에 지시합니다. 유추된 형식은 기본 제공 형식, 무명 형식, 사용자 정의 형식 또는 .NET 클래스 라이브러리에 정의된 형식일 수 있습니다. var을 사용하여 배열을 초기화하는 방법에 대한 자세한 내용은 암시적으로 형식화된 배열을 참조하세요.

다음 예제에서는 var을 사용하여 지역 변수를 선언하는 다양한 방법을 보여 줍니다.

// i is compiled as an int
var i = 5;

// s is compiled as a string
var s = "Hello";

// a is compiled as int[]
var a = new[] { 0, 1, 2 };

// expr is compiled as IEnumerable<Customer>
// or perhaps IQueryable<Customer>
var expr =
    from c in customers
    where c.City == "London"
    select c;

// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };

// list is compiled as List<int>
var list = new List<int>();

var 키워드는 "variant"를 의미하지 않고 변수가 느슨하게 형식화되었거나 런타임에 바인딩되었음을 나타내지도 않습니다. 단지 컴파일러가 가장 적절한 형식을 결정하고 할당함을 의미합니다.

var 키워드는 다음과 같은 컨텍스트에서 사용할 수 있습니다.

  • 앞의 예제와 같이 지역 변수(메서드 범위에서 선언된 변수)에 대해 사용

  • for 초기화 문에서 사용

    for (var x = 1; x < 10; x++)
    
  • foreach 초기화 문에서 사용

    foreach (var item in list) {...}
    
  • using 문에서 사용

    using (var file = new StreamReader("C:\\myfile.txt")) {...}
    

자세한 내용은 쿼리 식에서 암시적 형식 지역 변수 및 배열을 사용하는 방법을 참조하세요.

var 및 무명 형식

대부분의 경우 var 사용은 선택 사항이며 단지 편리한 구문을 위해 사용됩니다. 그러나 변수가 무명 형식을 사용하여 초기화된 경우 나중에 개체의 속성에 액세스해야 하면 변수를 var로 선언해야 합니다. 이것이 LINQ 쿼리 식의 일반적인 시나리오입니다. 자세한 내용은 무명 형식을 참조하세요.

소스 코드의 관점에서 무명 형식에는 이름이 없습니다. 따라서 쿼리 변수가 var로 초기화된 경우 반환된 개체 시퀀스의 속성에 액세스하는 유일한 방법은 varforeach 문의 반복 변수 형식으로 사용하는 것입니다.

class ImplicitlyTypedLocals2
{
    static void Main()
    {
        string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };

        // If a query produces a sequence of anonymous types,
        // then use var in the foreach statement to access the properties.
        var upperLowerWords =
             from w in words
             select new { Upper = w.ToUpper(), Lower = w.ToLower() };

        // Execute the query
        foreach (var ul in upperLowerWords)
        {
            Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);
        }
    }
}
/* Outputs:
    Uppercase: APPLE, Lowercase: apple
    Uppercase: BLUEBERRY, Lowercase: blueberry
    Uppercase: CHERRY, Lowercase: cherry
 */

설명

암시적 형식 변수 선언에는 다음과 같은 제한 사항이 적용됩니다.

  • 지역 변수가 동일한 문에서 선언 및 초기화된 경우에만 var을 사용할 수 있습니다. 변수를 null이나 메서드 그룹 또는 익명 함수로 초기화할 수는 없습니다.

  • 클래스 범위의 필드에는 var을 사용할 수 없습니다.

  • var을 사용하여 선언된 변수는 초기화 식에 사용할 수 없습니다. 즉, 이 식(int i = (i = 20);)은 유효하지만, 이 식(var i = (i = 20);)은 컴파일 시간 오류를 생성합니다.

  • 동일한 문에서 여러 개의 암시적 형식 변수를 초기화할 수 없습니다.

  • var라는 형식이 범위 내에 있으면 var 키워드가 해당 형식 이름으로 확인되고 암시적 형식 지역 변수 선언의 일부로 처리되지 않습니다.

var 키워드를 사용한 암시적 형식화는 로컬 메서드 범위의 변수에만 적용할 수 있습니다. C# 컴파일러가 코드를 처리하면서 논리적 패러독스를 만나게 되므로 암시적 형식 지정은 클래스 필드에 사용할 수 없습니다. 컴파일러는 필드 형식을 알아야 하나 할당 식을 분석할 때까지 형식을 결정할 수 없고 형식을 모르면 식을 평가할 수 없습니다. 다음 코드를 생각해 봅시다.

private var bookTitles;

bookTitlesvar 형식의 클래스 필드입니다. 이 필드는 평가할 식이 없으므로 어떤 형식의 bookTitles가 될지 컴파일러가 추론하는 것이 불가능합니다. 또한 필드에 식을 추가(로컬 변수에서처럼)하는 것으로는 부족합니다.

private var bookTitles = new List<string>();

컴파일러에서 코드 컴파일 중 필드를 만나면 연결된 식을 처리하기 전에 각 필드의 형식을 기록합니다. 컴파일러가 bookTitles 구문 분석을 시도하는 동일한 패러독스를 만나면 필드 형식을 알아야 하지만 컴파일러는 일반적으로 식을 분석하여 var 형식을 판단합니다. 이는 앞의 형식을 알지 못하면 불가능합니다.

var은 생성된 쿼리 변수 형식을 정확하게 확인하기 어려운 쿼리 식에서도 유용할 수 있습니다. 그룹화 및 정렬 작업에서 이러한 경우가 발생할 수 있습니다.

또한 var 키워드는 변수의 특정 형식이 키보드에서 입력하기 번거롭거나, 명확하거나, 코드의 가독성에 도움이 되지 않는 경우에 유용할 수 있습니다. 이런 방식으로 var이 유용한 한 가지 예로 그룹 작업에 사용되는 경우 등의 중첩된 제네릭 형식이 있습니다. 다음 쿼리에서 쿼리 변수의 형식은 IEnumerable<IGrouping<string, Student>>입니다. 사용자나 코드를 유지 관리해야 하는 다른 사용자가 이 점을 이해하기만 하면 편리하고 간단하도록 암시적 형식을 사용하는 데 문제가 없습니다.

// Same as previous example except we use the entire last name as a key.
// Query variable is an IEnumerable<IGrouping<string, Student>>
var studentQuery3 =
    from student in students
    group student by student.Last;

var을 사용하면 코드를 간소화하는 데 도움이 되지만, 필요한 경우나 코드를 더 쉽게 읽도록 만들 때로 사용을 제한해야 합니다. var을 제대로 사용해야 하는 경우에 대한 자세한 내용은 C# 코딩 지침 문서의 암시적 형식 지역 변수 섹션을 참조하세요.

참고 항목