C# var 타입 추론 – C# 초급 12

C# var 타입 추론

var는 컴파일 타임에 타입을 추론하는 키워드입니다. C#은 타입에 엄격한 정적 언어(static language)이지만 코딩의 생산성과 가독성에서 봤을 때 정적 언어가 좀 빡빡하긴 합니다. 예를 들어 인스턴스를 생성할 때는 클래스 클래스참조 = new 클래스() 이렇게 하는데 앞의 클래스가 중복되니까 코드가 늘어납니다. 어차피 오른쪽을 보면 왼쪽도 정해지기 때문에 var 를 사용할 수 있습니다.

아래 예제에서는 ThisClass 를 var 로 변경했습니다. var는 클래스 같은 레퍼런스 타입이나 int 같은 값타입 둘다 사용할 수 있습니다.

using System;

namespace MyApp
{
    public class Program
    {
        public static int Main(string[] args)
        {
            // 기본적인 인스턴스 생성 방법
            ThisClass c1 = new ThisClass();
            Console.WriteLine(c1.ToString());
            
            // var 를 사용한 클래스 타입 추론
            var c2 = new ThisClass();
            Console.WriteLine(c2.ToString());

            // 값타입에 var 사용
            var num = 10;
            Console.WriteLine(num);
            Console.WriteLine(num.GetType());

            return 0;
        }
    }

    public class ThisClass
    {
        int num;
    }
}
[실행]
MyApp.ThisClass
MyApp.ThisClass
10
System.Int32

식별자 앞에 var를 넣었지만 변수의 타입이 다른데요. 이런 것을 타입 추론(Type Inference)라고 합니다. var 타입 추론은 누가하는가? C# 컴파일러가 합니다. 혹시 자바 스크립트에서 var 를 사용해봤다면 비슷하게 생긴 것도 사실입니다. 하지만 동적 타이핑 언어인 자바 스크립트와는 차이가 있습니다. C#의 var 는 컴파일 타임에 타입이 결정됩니다. 또 클래스의 필드로 사용이 불가능하고 선언과 동시에 초기화가 필요합니다. C#은 정적 타이핑으로 컴파일 시 엄격한 타입 검사를 합니다. 일단 타입이 정해지면 다른 변수들과 동일하게 취급합니다. 그래서 var 라는 키워드는 언뜻 동적인 느낌을 주기 때문에 불안하게 보이지만 사실은 안전하게 사용할 수 있습니다.

정적 타이핑과 동적 타이핑

타이핑에 대한 토픽을 잠깐 설명하고 넘어갈 필요가 있을 것 같습니다. 언어를 분류할 때 정적 타이핑(static typing)과 동적 타이핑(dynamic typing)으로 나누곤 합니다. 뭐 완전히 정적이다 완전히 동적이다 이렇게 언어를 극단적으로 보는 것은 무리가 있지만 대체적으로 이 언어는 컴파일 타임에 타입 검사를 거의 다 끝낸다. 이 언어는 런타임에 대부분의 타입을 설정한다는 큰 방향은 있습니다. C/C++ 그리고 C#과 자바는 정적 타이핑이고 자바스크립트, 파이썬, PHP 는 동적 타이핑입니다. 정적 타이핑은 컴파일 방식이고 동적 타이핑은 스크립트 방식입니다.

이 또한 큰 주제라서 여기서 깊게 들어가는 것은 어렵지만 일반적으로 처리 성능을 중요시하는 경우 정적인 타이핑이 유리하고 프로그램의 대기 시간이 길거나 런타임의 변수가 복잡하면 동적 타이핑이 적합합니다.

C#의 var 를 보면 스크립트 언어가 떠오를 수 있지만 컴파일 타임에 오류 검출이 완료되기 때문에 런타임에는 거의 문제가 없습니다. 동적 타이핑처럼 사용할 수 있는 키워드는 dynamic 입니다. 변수의 식별자 앞에 dynamic을 붙이면 스크립트 언어처럼 사용할 수 있습니다. 하지만 그럴 거면 자바 스크립트 같은 동적 타이핑 언어를 사용하지 C#으로 프로그래밍을 할 필요가 없겠지요. 컴파일 타임에 변수가 확정되지 않으면 런타임에서 추론해야 하고 오류도 더 많아집니다.

C#은 객체지향 프로그래밍 언어지만 C의 계승자라서 그런지 모르겠지만(아님 MS가 만들어서) 상당히 많은 기능을 탑재하고 있습니다. 그 기능들의 사용범위를 모르면 그냥 모르는게 나은 것도 많습니다. (C#은 unsafe block 에서 포인터 작업도 지원한다)

            dynamic d1;
            d1 = 100;
            d1 = 1.1;
            d1 = "hello";

어쨋든 var 는 동적 타이핑을 위한 기술이 아닙니다. var를 사용하는 것은 자유적인 사항입니다. 사람에 따라 var를 싫어할 수도 있습니다. 하지만 관리를 잘 할 수 있다면 var는 여러가지 이점이 있다.

var의 제한사항을 다시 정리하면

  • var는 지역변수로만 사용가능하다 (클래스 필드는 안된다)
  • 초기화가 필수적이다
  • 컴파일러에 의해 타입이 정해지면 타입은 변경 불가능하다

요약

var를 사용해서 변수를 선언하는 것을 암시적 형식(implicitly typed)이라고 합니다. int, float, string 같은 선언은 명시적 형식(explicitly typed) 이라고 합니다. var는 컴파일 타입에 추론되고 C#의 엄격한 타입 검사를 받습니다. var를 사용하고 안하고는 스타일의 차이일 수도 있는데 사용자에 따라 그 장점을 충분히 활용할 수 있습니다.

참고링크

var – C# 참조 | Microsoft Docs

Leave a Comment