형식 추론

형식 추론과 var 키워드

아래 코드를 살펴보세요. 변수 선언 앞에 적는 자료형은 컴파일러가 등호 오른쪽 초기화 값으로 자동 유추할 수 있습니다. 예를 들어 아래 숫자 18은 정수 int로, Phone()은 Phone 타입으로 추론할 수 있을까요?

static void Main( )
{
    int age = 18; // 오른쪽 18을 보고 int로 바로 추론
    Phone p = new Phone(); // 오른쪽 생성자는 Phone 객체를 반환
}
Code language: C# (cs)

그렇다면 위 코드를 더 간소화할 수 있을까요?

C#에서는 var 키워드를 제공해 명시적 타입 선언을 줄여 작성할 수 있습니다.

static void Main( )
{
    var age = 18;
    var p = new Phone();
}
Code language: JavaScript (javascript)

이 코드의 왼쪽 변수는 모두 var로 적혀있으며 컴파일러가 오른쪽 표현식으로 타입을 추정합니다. 컴파일이 완료되면 두 코드는 완전히 동일하게 처리됩니다.

유의 사항

  1. var동적 타입이 아닙니다. 문법적 축약 표현일 뿐 컴파일 타임에 추론된 타입이 고정되고 이후 변경할 수 없으며 두 코드의 의미는 완전히 동등합니다.
  2. var 사용 시 준수해야 하는 규칙:
    • 지역 변수에서만 사용 가능하며 클래스 필드에는 쓸 수 없음
    • 선언할 때 반드시 초기값을 할당해야 하며 var x;처럼 단독으로 적을 수 없음
    • 추론된 타입은 고정되므로 나중에 다른 타입의 데이터를 저장할 수 없음
  3. 중요한 차이점: C#의 var ≠ JavaScript의 var 입니다. JS var는 동적 약타입으로 변수에 언제든 다른 타입 값을 담을 수 있지만 C# var는 정적 강타입 문법의 축약형일 뿐 C#의 강타입 특징은 유지됩니다.

즉 위 var는 컴파일 과정에서 오른쪽 값을 기준으로 age 타입은 int, p 타입은 Phone으로 확정되며 최종 결과는 첫 번째 코드와 같습니다.

이후 변수의 타입을 바꿀 수 없습니다. 예시를 확인하세요.

class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();
    }
}

class Phone
{
    public string Name { get; set; }
}

이런 작성 방식은 C#에서 오류가 발생하지만 JavaScript, PHP 같은 다른 언어에서는 허용됩니다. 이 언어들은 변수 타입을 자유롭게 교체할 수 있습니다.

JS와 PHP는 약타입, 동적 타입 언어로 분류되며 변수에 고정된 타입 제약이 없습니다.

잘못된 예시


class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();

        var isBuy;
    }
}

class Phone
{
    var price = 1000;
    var model = "iPhone";

    int count = 12;
}

형식 추론

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다