본문 바로가기
개발언어/C#

[C#] Var와 다이나믹(Dynamic)에 대해서 이해하기

by 창용이랑 2023. 5. 17.
728x90

dynamic 변수에 숫자를 할당했다가 나중에 다시 문자열을 할당하는 것이 가능하다.

object 타입과 dynamic 타입의 차이점은

object 타입은 구체적 타입의 속성과 메서드를 사용하기 전에 반드시 캐스팅을 통해 구체적 타입으로 변경 후에 사용해야 하는 반면,

dynamic 타입은 캐스팅이 없이도 직접 실제 타입(underlying type)의 메서드와 속성을 사용할 수 있다는 점이다.

// 1. dynamic은 중간에 형을 변환할 수 있다.

dynamic v = 1;
// System.Int32 출력
Console.WriteLine(v.GetType());

v = "abc";
// System.String 출력
Console.WriteLine(v.GetType());


// 2. dynamic은 cast가 필요없다

object o = 10;
// 틀린표현
// (에러: Operator '+' cannot be applied to operands of type 'object' and 'int')
o = o + 20;
// 맞는 표현: object 타입은 casting이 필요하다
o = (int)o + 20;

// dynamic 타입은 casting이 필요없다.
dynamic d = 10;
d = d + 20;

 

C# var는 Visual Studio 2008, .NET Framework 3.5 버전에서 나왔고, Dynamic(다이나믹)은 Visual Studio 2010, .NET Framework 4.0 버전에서 소개가 되었습니다.

 

C# Var란 무엇일까요?

 

Var는 데이터 타입을 개발자가 아닌 컴파일러가 결정하게 끔 만드는 키워드(Keyword)입니다. 일반적으로 C#에서는 int, double, string, float와 같이 개발자가 사용하고자는 데이터 타입을 결정하게 됩니다. 이를 명시적 선언이라고 이야기 합니다. 

 

하지만 데이터 타입이 임의적으로 타입이 변경이 되는 코드를 짜고 싶다면 어떻게 해야 할까요. 위에서 언급한 명시적선언으로 처리를 원치 않는 경우에는 Var 타입을 사용할 수 있습니다. Var로 선언된 변수는 컴파일시에 데이터 타입이 결정이 되게 되는 것이죠. 

 

좀더 자세히 이야기 하면, Var 타입은 선언 시점에 초기화가 됩니다. 그리고 한번 초기화한 타입은 변경이 될 수 없습니다. 그리고 컴파일러가 타입을 결정할 때 에러가 발생을 하게 되면, 컴파일 시에 에러를 전달하고 아니라면 타입을 결정하여 사용하게 됩니다.

 

C# Var 타입을 사용하게 되면 아래와 같이 name은 string 형으로 초기화 되었고, 초기화 이후 다른 타입으로 변경을 할 수는 없습니다. 

 

 

 

 

 

 

 

아래의 예제와 같이 String으로 선언된 var 타입이 정수형(Int)로 변경이 될 수 없으며, 데이터 타입을 변경하고자 하면 컴파일러는 에러를 던지게 됩니다. 

 

 

마지막으로 C# Var 타입으로 선언된 변수에는 무조건 값을 한번 이상 넣어야 합니다. 

Var 타입이 생각보다 제약도 많고, 사용하기 편하지 않습니다. 명시적 선언만 피할려고 Var 타입을 쓰는 것은 생각보다 효율적이지 않을 수도 있습니다.

 

그럼 C# 다이나믹(Dynamic) 타입은 무엇일까요?

 

위의 Var 타입에 대한 문제를 해결해주는 것이 바로 다이나믹(Dynamic) 입니다. 

 

다이나믹 역시 런타임시 데이터의 타입이 결정이 되는 것입니다. 하지만 C# Var 타입보다 훨씬 유연하다고 볼 수 있습니다. 다이나믹 타입은 항상 런타임 시에 데이터 타입을 결정하게 됩니다. 

 

따라서 C# Dynamic은 동적으로 데이터 타입을 사용해야하는 경우 사용이 됩니다. 

C# Dynamic 타입의 예를 한번 볼까요. 

 

Example

using System;  

namespace ConsoleDemo 
{  
    public class Program 
    {  
        public static void Main(string[] args) 
        {  
            dynamic name; 		//will compile and run    

            name = "This is C - SharpCorner Article";   

            name = 101;   

            Console.WriteLine("The value of name is " + name);   

            Console.ReadLine();  
        }  
    }  
}

위에서 C# Var 타입을 사용한 경우 에러가 발생을 하였으나, 위의 코드는 전혀 문제가 되지 않습니다. C# Dynamic은 런타임시에 데이터 타입을 결정하기 때문이죠.

 

위의 코드를 실행하면 아래와 같은 결과를 볼 수 있습니다. 

 

아래의 한줄이 이번 C# 강좌의 핵심이라고 볼 수 있습니다.

Var는 데이터 타입이 변경이 안되고, Dynamic은 된다

 

 

 

 

 

name 변수는 마지막 값이 대입된 정수 타입으로 볼 수 있습니다.

 

 

출처 : https://guslabview.tistory.com/364

 

 

 

 

'개발언어 > C#' 카테고리의 다른 글

[C#] 어떠한 경우에도 실행 using, IDisposable  (0) 2023.05.17
[C#] Linq 정리하기  (0) 2023.05.17
[C#] Task.WhenAll() vs WhenAny()  (0) 2023.05.12
[C#] Task.Run() vs Task.Factory.StartNew()  (0) 2023.05.12
[C#] Task.Run()  (0) 2023.05.12