반응형
object와 var 모두 명시적인 타입의 선언 없이도 변수를 선언하는 것이 가능하다. 그러나 두 선언은 사용에 있어 완전히 다르다.
이 둘의 가장 큰 차이는, 어떤 방식으로 값을 저장하냐에 있다.
object
먼저 object는 박싱과 언박싱을 통해 값을 저장한다. 값을 박싱 한 뒤 heap에 저장해두고, stack에 해당 주소를 저장하고 있다가 필요할 때마다 참조해서 쓰는 방식이다.
따라서 기존의 값과 타입이 변경되어도, 의도한대로 값이 저장되는 것을 확인 할 수 있다.
타입이 변경되었다하더라도, 기존의 박싱된 상자를 지우고 새로 박싱하여 힙에 저장한 뒤 주소를 바꾸면 되기 때문이다.
int a = 30;
object b = (object)a;
WriteLine("a: " + a);
WriteLine("b: " + b);
//새로운 타입의 값을 넣음
b = "안녕";
WriteLine("b: " + b);
[참고]
https://while1.tistory.com/entry/C-objectboxingunboxing?category=934666
var
그러나 var은 컴파일러가 변수를 생성 할 때, 값을 보고 타입을 추론해서 stack에 영역을 지정하고 값을 삽입한다. 즉, 값을 추론하는 부분만 제외하면 명시적 선언(int 등)과 동일한 방식이다.
따라서 아래의 그림처럼 int형일 경우 4byte를, double형인 경우 8byte를 할당한다. 이후 int형인 a에 double형인 b의 값으로 덮어쓰려고 하면, a는 4byte의 영역을 할당 받았지만 b는 8byte의 영역이 필요하므로 덮어쓰는 것이 불가능하다.
var a = 5;
var b = 5.555;
a = b;
[참고]
https://while1.tistory.com/entry/C-var
반응형
'Language > CPP&C#' 카테고리의 다른 글
[Visual Studio] 2022 설치 (feat. C++) (0) | 2022.01.08 |
---|---|
[C++] 고정 소수점 (소수점 자리 수 지정하여 출력) (0) | 2021.06.01 |
[C#] var 키워드 (0) | 2021.05.20 |
[C#] object (boxing/unboxing) (0) | 2021.05.20 |
[C#] Null (0) | 2021.05.18 |
댓글