var 사용 예제
- var는 암시적 타입 지역변수(implicitly typed local variable) 이다.
- var는 데이터 타입을 개발자가 아닌 컴파일러(Compiler) 가 결정한다.
- 다음은 var 로 지역변수를 선언한 예제 코드다.
- 아래 예제에서 var idx의 값은 int형 정수 10으로 설정됨으로 컴파일러에 의해 int형으로 타입이 결정된다.
var idx = 10; //Implicitly typed.
int idx = 10; //Explicitly typed.
- 다음은 C#에서 사용하는 var 사용 예제코드다.
using System.Linq;
namespace VarTest
{
class Program
{
static void Main(string[] args)
{
// idx 변수 int로 컴파일
var idx = 5;
// str 변수 string로 컴파일
var str = "Hello";
// arr 변수 int[]로 컴파일
var arr = new[] { 0, 1, 2 };
// wordQuery 변수 IEnumerable<Word> 혹은 IQueryable<Word> 로 컴파일
string[] words = { "사과", "딸리", "포도", "복숭아", "바나나" };
var wordQuery = from word in words
where word == "사과"
select word;
}
}
}
var 사용 제약 사항
- 지역변수에만 사용 가능다.
- 변수 선언과 동시에 반드시 초기화 되어야한다.
- null, 메서드 그룹, 익명 함수로 초기화 불가능하다.
지역변수 사용할 때 var를 권장하는 이유
- 개발자가 올바른 변환타입을 알지 못해 잘못된 타입을 명시적으로 지정하여 사용하는 경우를 방지한다.
- var를 사용함으로써 코드를 간결하게 하고 가독성을 높일 수 있다. 그러나 지역변수내 var 사용이 절대적인건 아니다.
- 내장 숫자타입(int, float, double..) 사용 시 var는 주의 해야한다.
- 내장 숫자 타입들은 다양하게 형변환이 가능하다. 이들은 각각의 정밀도가 다르기 때문에 var를 사용할 경우 가독성과 정밀도에 있어 오류가 발생할 수 있기 때문에 지역변수라도 숫자타입은 명시적으로 선언하는 것이 낫다.
내장 숫자 타입과 var를 함께 사용한 경우
- 다음은 내장 숫자 타입과 var를 함께 사용한 예제 코드다.
var f = GetMagicNumber();
var total = 100 * f / 6;
Console.WriteLine($"Declared Type : {total.GetType().Name}, Value : {total}");
static double GetMagicNumber()
{
double num = 2;
return num;
}
- 위의 코드에서 total은 무슨 타입일까?
- total의 정확한 타입은 GetMagicNumber() 의 반환 타입에 의해 결정된다.
- GetMagicNumber()의 반환 타입을 5가지의 숫자 타입으로 바꿔가며 출력한 결과 내용이다.
Declared Type : Double, Value : 33.333333333333336
Declared Type : Single, Value : 33.333332
Declared Type : Decimal, Value : 33.333333333333333333333333333
Declared Type : Int32, Value : 33
Declared Type : Int64, Value : 33
- 컴파일러는 GetMagicNumber() 메서드의 반환 타입으로 f의 타입을 결정한다.
- total 계산 시에 사용한 상수는 모두 리터럴 이므로 컴파일러가 이 상수들을 f와 동일한 타입으로 변환한 후 계산하게 되는데 이런 이유로 결과 값에 차이가 생기게 된 것이다.
- 이로 인해 숫자 타입과 var를 함께 사용하면 가독성 문제 뿐 아니라 정밀도와 관련된 혼돈스러운 문제를 유발할 가능성이 생긴다 때문에, 숫자타입은 지역변수에서 선언하더라도 var타입이 아닌 명시적 으로 선언하는 것을 권장한다.
IEnumerable, IQueryable 반환 예제
- 아래와 같이 IEnumerable 변수 q를 Linq를 이용하여 받아오는 예제 코드가 있다.
List<string> fruitList = new List<string> { "Apple", "Grape", "Banana", "Orange", "Mango" };
IEnumerable<string> q =
from fruit in fruitList
select fruit;
var query = q.Where(s => s.StartsWith("A"));
- 위의 코드는 결과를 받아들일 변수 q를 IEnumerable 타입으로 명시적으로 선언 했기 때문에 심각한 성능 문제 를 유발할 수 있다.
- q의 원래 반환값은 IQeuryable 타입 을 반환하지만, 개발자가 q를 명시적으로 IEnumerable 으로 선언해 버렸기에 IQueryable 과 관련된 장점을 모두 잃게 된다. 이렇듯, 개발자가 Linq를 사용하여 해당 반환값을 정확하게 모르는 상태에서 잘못된 타입을 명시적으로 선언할 경우 성능저하 라는 문제를 직면하게 때문에 Linq 구문을 이용할때 var 변수로 반환값을 받는 것을 권장한다.'
'프로그래밍 언어 > C#' 카테고리의 다른 글
[C#] 자료형(Data Type)의 기본 값(default) 연산자 (0) | 2023.08.23 |
---|---|
[C#] 리플렉션 (Reflection) 예시 (0) | 2023.08.23 |
[C#] 참조에 의한 매개변수 전달 (ref, out) (0) | 2023.08.11 |
[C#] 구조체 (struct)로 메모리 절약하기 (0) | 2023.08.11 |
[C#] 관리되는, 관리 되지 않는 코드 (0) | 2023.08.11 |