안녕하세요. 박민성입니다. 🤗
오늘은 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도 알아보고 차이점도 알아보면서
어떤 상황에 어떤 것을 써야 할지 더 명확하게 이해한 것 같습니다.
오늘도 굉장히 알찬 하루였습니다. ☺️
내일은 더욱 알차게 보내고 작성해보도록 하겠습니다.
봐주셔서 감사합니다. ☺️