dynamic 이란?
컴파일 시점이 아닌, 런타임 시점에서 형식 검사를 수행하게 하는 키워드이다.
설명의 이해를 돕기 위한 제네릭 참고자료
제네릭 초기값 설정
제네릭 메서드를 호출 할 때 매개변수로 들어온 자료형(T)와 똑같은 자료형의 변수를 만들고
거기에 초기값을 설정해야 하는 예시를 들어보겠다.
제네릭 메소드 SetArray를 호출하여 특정 변수에 값을 담고, 그 값에 SetArray의 매개변수를 +=로 더해주는 상황이다.
하지만 temp를 생성할 때도 문제가 생기고 초기값을 설정할 때도 문제가 생긴다.
dynamic과 default 키워드를 사용하여 해결
dynamic 키워드를 사용하여 temp를 선언하고, 그 초기값을 설정할 때는 default 키워드를 사용하여 초기값을 설정하면
문제가 해결된다.
default 키워드에 대한 이해
제네릭 메소드로 받아온 매개변수의 자료형과 똑같은 자료형인 변수를 만들고, 그 변수의 초기값을 설정해주고 싶은 상황이다.
하지만 temp = null 또는 temp = 10 이런식으로 초기화 시키기에는 형식 매개변수 T를 받아온 이유가 없다.
이렇게 제네릭으로 들어오는 변수의 초기값을 주고 싶을 때 default 키워드를 사용하면 된다.
dynamic 키워드에 대한 이해
dynamic 키워드 모든 타입을 다 허용하므로 제네릭과 함께 쓰기 적합하다.
그렇다면 dynamic과 object, var와의 차이점은 무엇일까?
일단 object 키워드는 메모리 소비가 심하기 때문에 거의 쓰이지 않고,
var 키워드는 var a = 10; 이런식으로 선언하면, 뒤의 값이 10이므로 자동으로 int형으로 자료형이 부여된다. (var => int)그렇다고 var a = default(T) 이런식으로 선언하면, 뒤의 값을 모르므로 에러가 뜬다.
따라서 제네릭에서 사용하긴 부적합하며, dynamic으로 대체할 수 있다.
dynamic 키워드는 dynamic a = 10; 이런식으로 선언을 해도 자동으로 a가 int형으로 부여되지 않고, 런타임(실행)직전에 자료형이 부여된다.또한 dynamic a = default(T) 이런식으로 값에 빈값(제네릭 T)을 넣어도 오류가 뜨지 않는다.즉, 변수 선언시 값을 꼭 넣어줄 필요도 없으며, 자료형이 결정된 이후에도 다른 형태의 자료형을 입력할 수 있다.
따라서 제네릭과 함께 쓰기 매우 적합한 키워드이다.
var와의 차이점 정리
var : 컴파일 할 때 자료형 부여
dynamic : 런타임 직전에 자료형 부여
var : 선언과 동시에 옆에 값을 적어주어야함
dynamic : 상관없음 빈값이어도 됨
dynamic 사용 시 주의점
dynamic을 사용하면 강제 형변환을 하기 때문에 런타임 때 오류가 발생할 수 있다.
또한 dynamic은 리소스를 많이 차지하고 런타임 때 오류가 발생할 확률이 높기 때문에 필요한 상황이 아니면
사용하지 않는 것이 좋다.
제네릭 자체는 많이 봤어도, dynamic과 default 키워드를 섞어 함께 쓰진 않았었는데 초기값을 주고 싶을 때 유용한 기능같다.
앞으로는 제네릭을 쓸 때 자주 같이 써야겠다는 생각이 들었다.
'C# 기초' 카테고리의 다른 글
[C#] async와 await 키워드 그리고 코루틴(Coroutine)과의 차이 (0) | 2023.10.31 |
---|---|
[C#][개념] 스레드와 동기/비동기 (0) | 2023.10.31 |
[C#] sealed class (상속 금지)와 partial class (0) | 2023.10.25 |
[C#] 상속 - 인터페이스(interface) (0) | 2023.10.25 |
[C#] 상속 - abstract(추상), virtual(가상) (0) | 2023.10.25 |