반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발꿈나무

[C# 교과서] 27. C# 확장 기능(2) - 동적 형식 본문

C# 기초

[C# 교과서] 27. C# 확장 기능(2) - 동적 형식

HYOKYE0NG 2022. 1. 25. 08:43
반응형
동적 형식

 

C#은 태생적으로 정적(static) 형식의 언어이지만 C# 4.0 버전부터는 파이썬과 자바스크립트처럼 동적(dynamic) 형식도 지원한다.

 

 

dynamic 키워드

C#에서 dynamic 키워드는 동적형식을 제공한다. 간단히 말해 컴파일 시점이 아닌 런타임 시점에서 형식이 정해지는 특수한 유형의 형식이다.

 

  • 컴파일 타임에 형식이 지정되는 프로그램은 변수를 선언한 후 해당 값을 사용하면 되기 때문에 편하다.
  • 헌타임에 형식이 지정되는 프로그램이 필요할 수 있는데, 이 때는 dynamic 키워드를 사용하여 변수를 선언한다.
  • dynamic 키워드는 데이터 형식 자리에 오지만 데이터 형식은 아니다.
  • var 키워드와 비슷하나 var는 컴파일할 때 데이터 형식을 결정하고, dynamic 키워드는 런타임 시 결정한다.
  • 모든 데이터 형식을 선언하는 자리에는 dynamic 키워드를 사용할 수 있다.
  • 동적 형식은 다른 동적 언어와 통신에 유용하다.

 

 

dynamic 변수로 런타임할 때 데이터 형식 결정하기

using System;

class Dynamic
{
    static void Main()
    {
        dynamic x;

        x = 1234; // [1] int
        Console.WriteLine(x); // 1234
        Console.WriteLine(x.GetType()); // System.Int32

        x = "Dynamic Type!"; // [2] string
        Console.WriteLine(x); // "Dynamic Type!"
        Console.WriteLine(x.GetType()); // System.String
    }
}

동적 형식을 나타내는 dynamic 키워드로 변수를 선언하면 컴파일 시점에서는 형식이 결정되지 않고

실행 시점에서 자동으로 데이터가 결정된다. 컴파일 시점에서는 데이터 형식이 결정되지 않기 때문에

비주얼 스튜디오 인텔리센스의 도움을 받을 수 없다는 단점이 있다.

 

 

문자열 변수를 string, var, dynamic 키워드로 선언하기

using System;

class DynamicDemo
{
    static void Main()
    {
        string ss = "안녕하세요."; //[1] 코드 작성시 문자열로 판단
        Console.WriteLine(ss.Length); // 인텔리센스의 도움 받음

        var vs = "반갑습니다."; //[2] 컴파일시 문자열로 판단
        Console.WriteLine(vs.Length); // 인텔리센스의 도움 받음

        dynamic ds = "또 만나요."; //[3] 런타임시 문자열로 판단
        Console.WriteLine(ds.Length); // 인텔리센스의 도움 못 받음

        ds = 1234; // [4]런타임시 숫자형으로 판단
        Console.WriteLine(ds * 10); // 숫자형 연산이 가능: 12340
    }
}

 

 

확장 메서드와 dynamic

확장 메서드는 정적 형식에서는 제대로 호출되지만, 동적 형식에서는 호출되지 않는다.

using System;

static class DynamicExtensionMethod
{
    // 확장 메서드 
    static string PreDotNet(this string str) => $"....{str}";

    static void Main()
    {
        string s1 = "DotNet";
        Console.WriteLine(s1.PreDotNet()); //[1] 실행됨

        dynamic d1 = "Korea";
        Console.WriteLine(d1.PreDotNet()); //[2] 에러 발생
    }
}

 

 

 

 

 

<Reference>

 

반응형
Comments