개발꿈나무
[C# 교과서] 27. C# 확장 기능(2) - 동적 형식 본문
반응형
동적 형식
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>
반응형
'C# 기초' 카테고리의 다른 글
[C# 교과서] 29. C# 확장 기능(4) - 클래스 라이브러리와 닷넷 스탠다드 (0) | 2022.01.25 |
---|---|
[C# 교과서] 28. C# 확장 기능(3) - 튜플 (0) | 2022.01.25 |
[C# 교과서] 26. C# 확장 기능(1) - 확장 메서드 만들기 (0) | 2022.01.25 |
[C# 교과서] 25. C# 활용(19) - 특성과 리플렉션 (0) | 2022.01.25 |
[C# 교과서] 24. C# 활용(18) - 인터페이스 (0) | 2022.01.21 |