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

[C#] object와 var의 차이

by nyangzzi 2021. 5. 20.
반응형

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 

 

[C#] object (boxing/unboxing)

object object 형식은 .NET Framework에서 제공하는 어떤 데이터든지 다룰 수 있는 데이터 형식이다. C#은 object가 모든 데이터를 다룰 수 있도록 기본 데이터 형식 뿐 아니라 모든 복합 데이터 형식, 사용

while1.tistory.com

 

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

 

[C#] var

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

while1.tistory.com

 

반응형

'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

댓글