형식 추론과 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로 적혀있으며 컴파일러가 오른쪽 표현식으로 타입을 추정합니다. 컴파일이 완료되면 두 코드는 완전히 동일하게 처리됩니다.

유의 사항
var는 동적 타입이 아닙니다. 문법적 축약 표현일 뿐 컴파일 타임에 추론된 타입이 고정되고 이후 변경할 수 없으며 두 코드의 의미는 완전히 동등합니다.var사용 시 준수해야 하는 규칙:- 지역 변수에서만 사용 가능하며 클래스 필드에는 쓸 수 없음
- 선언할 때 반드시 초기값을 할당해야 하며
var x;처럼 단독으로 적을 수 없음 - 추론된 타입은 고정되므로 나중에 다른 타입의 데이터를 저장할 수 없음
- 중요한 차이점: 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;
}
형식 추론
Previous: 메서드(Method)
Next: 중첩 코드 블록과 범위