[C#] var 키워드
1. var란?
- C# 3.0에서 지역 변수를 선언할 때 컴파일러가 빌드 시점에 타입을 추론할 수 있도록 사용하는 키워드
: 명시적으로 변수의 타입을 정의하지 않아도 var 키워드를 사용해서 해당 변수의 타입을 지정할 수 있음
: 초기화 문의 오른쪽에 있는 식에서 변수의 형식을 유추
var count = 0;
Debug.Log("count type : " + count.GetType()); // count type : System.Int32
var result = false;
Debug.Log("result type : " + result.GetType()); // result type : System.Boolean
2. var 제한 사항
: 지역 변수가 동일한 문에서 선언 및 초기화 된 경우에만 var를 사용할 수 없음
var test1; // 초기화 식 없이 사용할 수 없음
var test2 = null; // null로 초기화할 수 없음
var test3 = () => count; // 람다식, 익명 함수, 메서드 그룹으로 초기화할 수 없음
: 클래스 범위의 필드에서 var 사용할 수 없음
: var를 사용하여 선언된 변수는 초기화 식에 사용할 수 없음
int num = (num = 1);
var num2 = (num2 = 2);
// Cannot use local variable 'num2' before it is declared
// Value assigned is not used in any execution path
: 동일한 문에서 여러 개의 암시적 형식 변수 초기화를 할 수 없음
int i, i2, i3;
var num, num2, num3 = 0;
// Implicitly-typed local variables cannot have multiple declarators
3. var 를 사용할 때의 장점
- 생성자 호출식에서 객체 인스터화에 형식 이름을 반복하지 않을 수 있음
List<int> candidateList = new List<int>();
// ======================================
var candidateList = new List<int>();
- 익명 타입 (anonymous type)을 지원하기 위해서 타입을 암시적으로 선언할 수 있음
var man = new { age = 10 };
Debug.Log("man age " + man.age); // man age 10
4. var 를 사용할 때의 단점
- var를 남발할 경우 코드의 가독성이 떨어지게 됨
- 내부적으로 이루어지는 자동 타입 변환 과정으로 인해 발견하기 어려운 버그를 만들 수 있음
var op1 = GetNumber();
var op2 = op1 / 10;
Debug.Log("op2 type : " + op2.GetType());
private float GetNumber() => 10f;
private int GetNumber() => 10;
// GetNumber()의 return type에 따라 op2의 Type이 결정됨
// 코드에서 op2의 type을 직관적으로 알기 어려움
// GetNumber()의 return type이 float이고, int op2 = op1 / 10 를 사용할 경우 에러가 발생
// 명시적으로 type을 사용하는 경우 var 보다 에러를 찾기 쉬움
5. C# 코딩 규칙
- 할당의 오른쪽에서 변수의 형식이 명확한 경우 사용
- var를 사용할 경우, 변수 이름을 사용하여 변수의 타입을 지정하면 안됨
- dynamic 대신 var를 사용하면 안됨. dynamic과 var는 다름
- 루프의 루프 변수에 var를 사용
- LINQ 쿼리의 결과 시퀀스에 사용
6. 결론
- 대부분의 var 사용은 개발 편의성에 기초함.
: 익명 타입 예외
- 자료형의 계산이 민감한 경우에는 var보다는 명시적인 타입 선언이 좋음
: int, float, double 등
- C# 코딩 규칙에 따라 사용할 경우 큰 문제는 없음
[참고]
https://www.yes24.com/Product/Goods/97314203
https://www.yes24.com/Product/Goods/55864866