카테고리 없음

🌟 C# var, object, dynamic😋 🌟

minsoungdev 2026. 7. 25. 23:53

안녕하세요. 박민성입니다. 🤗

 

오늘은 C#에 var, object, dynamic에 대해서 글을 쓰고자 합니다. 🤔

처음에는 var에 대해서 찾아보다가 var관련해서 object, dynamic 같은

var랑 비슷해 보이지만 실제로는 각각 다른 기능들을 하는 친구들도 공부하게 되었습니다.

 

1. var란?

var number = 10;
int number = 10;
// 두 변수 다 실제 타입은 int

var는 자료형이 아니라 컴파일러가 오른쪽 값을 보고 타입을 추론하도록 하는 문법입니다.

var는 컴파일 시점에 타입이 결정되며, 한 번 결정된 타입은 바뀌지 않습니다.

 

또한 초기화할때 "무적권" 초기값이 필요합니다.

var a = 10; //이렇게 선언 가능
var b; // 초기값 없으면 오류

a = 20; // 값 바꾸기 가능
a = "Hello"; // 다른 자료형으로 바꾸려고 하면 컴파일 오류

 

2. object란?

object value = 10;
object text = "Hello";

object는 모든 타입의 기반이 되는 실제 타입입니다.

여러 종류의 값을 담을 수 있지"만"

object 상태에서는 원래 타입의 기능을 바로 사용할 수 없습니다.

object text = "Hello";

Console.WriteLine(text.Length); // 컴파일 오류

여기서 string으로 변환해야지 사용할 수 있습니다.

string result = (string)text;

Console.WriteLine(result.Length);

여기서 중요한점은 실제 객체 타입과 변수를 선언한 타입은 다를 수 있다는 점입니다.

 

3. dynamic이란?

dynamic value = "Hello";

Console.WriteLine(value.Length);

dynamic은 컴파일 시점에 멤버가 존재하는지 검사하지 않고, 실행할 때 확인합니다.

예시로

dynamic value = 10;

Console.WriteLine(value.Length);

이런 코드도 컴파일은 되지만, 실행해보면 int에는 Length가 없기 때문에 런타임 오류가 발생합니다.

dynamic은 타입 검사를 실행 시점까지 미루고 

그로인해서 컴파일러가 잘못된 코드를 잡아주지 못할 수 있습니다.

 

4. 세 가지 비교

이렇게 같은 값을 넣어서 세 가지를 비교를 해볼 수 있습니다.

var varValue = "Hello";
object objectValue = "Hello";
dynamic dynamicValue = "Hello";

Console.WriteLine(varValue.Length);      // 가능
Console.WriteLine(objectValue.Length);   // 컴파일 오류
Console.WriteLine(dynamicValue.Length);  // 실행 시 확인

이렇게 var는 string이란걸 알고 있고

object는 선언 타입이 object라서 Length를 못 사용하고

dynamicValue는 실행할 때 실제 타입을 확인을 합니다.

 

또한 다른 타입을 다시 넣을 수 있는지도 확인할 수 있습니다.

var first = 10;
object second = 10;
dynamic third = 10;

first = "Hello";  // 불가능
second = "Hello"; // 가능
third = "Hello";  // 가능

var는 처음부터 int로 확정됐기 때문에 다른 타입을 넣을 수 없습니다.

object와 dynamic은 변수에 여러 타입의 값을 넣을 수 있습니다.

하지만 object와 dynamic은 값을 다루는 방식이 다릅니다.

object는 불편하지만 오류를 비교적 일찍 발견할 수 있고 dynamic은 편해 보이지만 오류가 실행할 때 발생할 수 있습니다.

 

5. 박싱

object에 int 같은 값 형식을 넣으면 박싱이 발생할 수 있습니다.

int number = 10;
object value = number;

int 값을 object가 참조할 수 있는 객체 형태로 감싸는 과정이 박싱입니다.

여기서 박싱이란 간단하게 말하면 값 형식의 값을 참조 형식인 object나 인터페이스 형태로 감싸는 과정입니다.

int result = (int)value;

 

이렇게 다시 꺼내 쓸 때도 언박싱이 필요하면서 추가적인 메모리 할당과 비용이 생길 수 있습니다. (박싱도 포함)

 

그렇기에 object를 사용할 때는 메모리 할당 때문에 주의를 기울여야 합니다.

 

6. 언제 사용해야 하는가?

var는 T와 자주 사용됩니다.

또한 오른쪽 코드만 봐도 타입이 명확하거나 타입 이름이 긴 경우에..... 싹싹...

var player = GetComponent<Player>();

 

object는

여러 종류의 값을 공통된 형태로 보관해야 할 때 사용할 수 있습니다. 하지만 사용할 때 캐스팅이나 타입 검사가 필요해서 많이 사용되지는 않은 것 같습니다.

 

dynamic은

컴파일 시점에 타입을 알기 어려운 특별한 상황에서 사용합니다. Unity 개발 중에서는 오류를 늦게 발견할 수 있으므로 진짜 드물게 사용되긴 합니다. (사실 dynamic을 쓴걸 못 봤습니다;;)

 

이상으로 C# var, object, dynamic에 대해서 알아보았는데요~!

var에 대해서 찾아보다가 object, dynamic도 알아보고 차이점도 알아보면서 

어떤 상황에 어떤 것을 써야 할지 더 명확하게 이해한 것 같습니다.

오늘도 굉장히 알찬 하루였습니다. ☺️

 

내일은 더욱 알차게 보내고 작성해보도록 하겠습니다. 

봐주셔서 감사합니다. ☺️