본문 바로가기
Language/CPP&C#

[C#] var 키워드

by eungbbang 2021. 5. 20.
반응형
var

 

var는 컴파일러가 데이터형식을 알아서 파악하여 선언해주는 형식이다.

int와 string 같은 명시적 형식으로 선언하지 않아도, var를 이용하여 변수를 선언하면 컴파일러가 자동으로 해당 변수의 형식을 지정해준다.

 

만약 int로 선언했을 경우, 어떤 인자가 들어와도 int형으로 들어오게 된다.

WriteLine("int로 선언");

int a_int = 1;
//int b_int = "안녕";
int c_int = 'c';
int d_int = (int)3.14;

WriteLine("a: " + a_int);
//WriteLine("b: " + b_int);
WriteLine("b: 선언 불가");
WriteLine("c: " + c_int);
WriteLine("d: " + d_int);

무조건 int형이다

 

하지만 var 형식으로 선언 할 경우, 컴파일러가 알아서 타입을 추론해주기 때문에 프로그래머가 신경쓰지 않고 선언하는 것이 가능하다.

WriteLine("var로 선언");

var a = 1;		//int로 추론
var b = "안녕";		//string으로 추론
var c = 'c';		//char로 추론
var d = 3.14;		//double로 추론

WriteLine("a: " + a);
WriteLine("b: " + b);
WriteLine("c: " + c);
WriteLine("d: " + d);

컴파일러가 각 타입에 맞춰 자동선언

 

컴파일러는 가장 처음 프로그램을 실행할 때, var 형식의 타입을 추론한다.

즉, 이미 한 번 판단된 변수는 다시 판단되지 않으며 명시적으로 선언된 변수가 똑같이 사용된다.

때문에 선언과 동시에 반드시 초기화를 해주어야하는데, 만약 초기화 없이 변수 선언만 할 경우 어떤 타입인지 추론하는 것이 불가능해지기 때문에 반드시 초기화를 해주어야만한다.

초기화 없음

 

또한 지역 변수 선언만 가능하다.

지역 변수란 해당 지역의 코드에서만 사용되는 변수인데, main 지역 안에 선언된 함수도 지역 변수라고 할 수 있다.

반대로 어느 곳에서나 접근 할 수 있도록 선언되는 경우가 있는데, 이것을 전역변수라고 부른다. c나 c++에서는 이런 전역 변수 선언이 가능하지만, 코드의 가독성을 해치고 예기치 못한 오류를 발생하는 등 여러 문제를 야기하기도 한다. 때문에 C#은 전역 변수를 지원하지 않으며, var 역시 전역 변수로 선언이 불가능하다.

전역 변수로 선언

 

한 번 판단한 변수를 다시 판단 할 수 없는 것은, 선언 시에 stack에 판단한 type만큼의 영역을 잡기 때문이다.

동적 변수가 아닌 정적 변수로 선언되기 때문에, stack에 올라갈 당시 해당 type만큼 변수에 영역을 할당한다. 위의 그림처럼 int형일 경우 4byte를, double형인 경우 8byte를 할당한다. 이후 int형인 a에 double형인 b의 값으로 덮어쓰려고 하면, a는 4byte의 영역을 할당 받았지만 b는 8byte의 영역이 필요하므로 덮어쓰는 것이 불가능하다.

 

따라서, 초기화 시에 사용할 타입으로 반드시 초기화 해주는 것이 중요하다.

반응형

'Language > CPP&C#' 카테고리의 다른 글

[C++] 고정 소수점 (소수점 자리 수 지정하여 출력)  (0) 2021.06.01
[C#] object와 var의 차이  (0) 2021.05.20
[C#] object (boxing/unboxing)  (0) 2021.05.20
[C#] Null  (0) 2021.05.18
[C#] CLR(Common Language Runtime)  (0) 2021.05.18

댓글