개발/C#

[Effective C#] 지역변수 선언은 var를 사용/var 이해하기

huiyu 2021. 1. 9. 06:00

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를 사용하는 것이 좋다.

MS document - var
MS document - 암시적 지역변수

정적타이핑, 동적타이핑

예제로 배우는 C# 프로그래밍 - STatic Language vs Dynamic Language

728x90
반응형