var : 암시적 타입 지역변수(implicitly typed local variable)
var i = 10; // Implicitly typed.
int i = 10; // Explicitly typed.
var는 데이터 타입을 개발자가 아닌 컴파일러가 결정하게 만드는 키워드이다. 위 예제에서 var i의 값은 int 10이 설정됨으로 컴파일러에 의해 int형으로 타입이 결정된다.
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>();
for문에서의 var
for (var x = 1; x < 10; x++)
foreach에서의 var
foreach (var item in list) {...}
using state 문
using (var file = new StreamReader("C:\\myfile.txt")) {...}
var 사용 제약사항
- 지역변수에만 사용가능
- 변수 선언과 동시에 초기화
- null, method group, anonymous method로는 초기화 불가
*Effective C# Item1 - 지역 변수를 사용할 땐 var를 사용하는 것이 좋다.
- var로 선언하면 동적 타이핑이 수행되는 것이 아니라 할당된 오른쪽 값을 확인하여 컴파일러에 의해 왼쪽 변수의 타입을 결정하게 된다. 컴파일러에게 변수의 타입을 명시적으로 알려주지 않아도 개발자를 대신하여 올바른 타입을 추론해주는 것이다. *개발자가 올바른 반환타입을 알지 못해 올바르지 못한 타입을 명시적으로 지정하여 사용되는 경우를 방지한다.
- var를 사용함으로써 코드를 간결하고 가독성이 좋아질 수 있다. 대신 변수명을 통해 그 역할이 정확히 유추될 수 있도록 구현하는게 좋다. 코드를 명시적으로 드러내야 하는 경우가 아니라면 var를 사용하는 것이 좋다. 그러나 지역변수의 타입을 명확히 유추할 수 없고 모호할 경우엔 차라리 명시적으로 선언하는 코드가 낫다. *지역변수내 var의 사용이 절대적인건 아니다.
- 숫자 내장 숫자타입(int, float, double ...) 사용 시 var는 주의해야한다. 내장 숫자 타입들은 다양하게 형변화가 가능하다 (int<->double ...). 이들은 각각의 정밀도가 다르기 때문에 var를 사용할 경우 가독성과 정밀도에 있어 오류가 발생할 수 있기 때문에 명시적으로 선언하는 편이 낫다.
* 정적타이핑(Static Typing) & 동적타이핑(Dynamic Typing)
-정적 타이핑 : 자료형(type)을 컴파일 당시에 결정하는 것. 변수에 들어갈 값의 형태에 따라 자료형을 사전에 지정해야 한다. 컴파일 진행시 자료형에 맞지 않은 값이 전달되면 컴파일 에러가 발생한다. 대표적으로 C, Java, C++, C#등이 사용. 컴파일 당시에 자료형에 대한 판단을 진행하여 속도가 빠르며, 타입 에러로 발생하는 문제를 초기에 발견할 수 있다.
- 동적 타이핑 : 컴파일 타임이 아닌 런타임 시 자료형을 결정. 자료형의 명시 없이 변수명으로 선언 및 값을 전달한다. 대표적으로 Python,k Ruby, JavaScript에서 사용. 런타임시 타입을 결정하여 프로그래밍 하는 입장에서 간단할 수 있지만 런타임 동작에서 예상치 못한 예외가 발생할 수 있다.
**var 를 사용 하는 것이 C#의 정적 타이핑(Static Typinng)이 동적 타이핑(Dynamic Typing)으로 변경되어 사용되는 것은 아니다. var로 선언하면 컴파일시 할당된 타입을 확인하여 변수의 타입을 결정하며, 컴파일러에게 명시적으로 타입만 알려주지 않을 뿐 개발자를 대신해 올바른 타입을 컴파일러가 확인해주는 것이다.
C#에서 런타임에서 데이터 결정할 수 있는 방법? dynamic 키워드
dynamic은 var와 다르게 런타임 시점에 타입을 결정한다.
dynamic v = 1;
// System.Int32 출력
Console.WriteLine(v.GetType());
v = "abc";
// System.String 출력
Console.WriteLine(v.GetType());
- 런타임 시점에 타입이 결정되기 때문에 dynamic은 중간에 형 변환이 가능하다.
var v = 1;
// System.Int32 출력
Console.WriteLine(v.GetType());
v = "abc";
// Compile error
Console.WriteLine(v.GetType());
- var를 사용하여 중간에 타입을 변경할 경우, 컴파일 에러가 발생한다. 이는 var의 경우 컴파일 할 경우 초기화 시점에 타입이 결정되기 때문이다.
* var의 사용이 C#의 특징인 적정 타이핑을 훼손하는 것은 아니다.
[참고]
EffectiveC#-Item1 - 지역 변수를 사용할 땐 var를 사용하는 것이 좋다.
'Software Development > C#' 카테고리의 다른 글
[Effective C#] 캐스트보다는 is, as가 좋다. (0) | 2021.01.16 |
---|---|
[Effective C#] const보다는 readonly 사용하기 (0) | 2021.01.13 |
C# yield 기초 이해하기 (0) | 2021.01.04 |
[Effective C#] C# 표준 Dispose 패턴 이해하기 (0) | 2021.01.02 |
[Effective C#] C# 정적 클래스 멤버 초기화 유의사항 (0) | 2020.12.31 |