목차
2부. 타입 설계
5장. 기본, 참조, 값 타입
dynamic 기본 타입
- C#은 타입 안정성을 중시하는 프로그래밍 언어다.
- 모든 표현식의 결과가 특정한 타입의 인스턴스로 계산되어 컴파일러가 해당 타입에 대해 제공하는 기능만을 연결해서 일을 처리할 수 있는 것이다.
- 타입 안정성을 지키는 프로그래밍 언어의 이점은 이를 지키지 않는 프로그래밍 언어에 비해서 개발자들이 컴파일 시점에서 오류를 미리 교정할 수 있으므로 예기치 않은 오류를 더 적게 만날 수 있다는 것이다.
- 리플렉션이나 다른 구성요소와 통신하는 일을 좀 더 쉽게 할 수 있도록, C# 컴파일러는 표현식의 타입을 dynamic 타입으로 만드는 기능을 제공하고 있다.
- 이 표현식의 결과뿐만 아니라 변수의 타입도 dynamic 타입으로 표시할 수도 있다.
- dynamic 표현식과 변수는 필드, 프로퍼티, 인덱서, 메서드, 델리게이트, 단항/이항/변환 연산자 오버로딩 메서드를 호출하는 데에 활용할 수 있다.
- 여러분의 코드에서 dynamic으로 표시된 표현식이나 변수상의 멤버를 호출하는 코드를 작성하면, 컴파일러는 특별한 IL 코드를 만들어서 해당되는 작업을 수행할 수 있도록 보조해준다. 이 특별한 코드는 페이로드(Payload)라고 불린다. 실행 시점에서 페이로드 코드는 dynamic 표현식과 변수에 의하여 참조되는 객체의 실제 타입을 기반으로 정확한 연산을 찾아 실행하는 일을 한다.
- 제네릭 클래스(참조 타입), 제네릭 구조체(값 타입), 인터페이스, 델리게이트, 메서드에 지정할 제네릭 타입 인자에 dynamic 타입을 매개변수로 지정하는 것이 가능하다.
- 제네릭 코드는 이미 컴파일이 완료된 상태에서 평가되는 코드이기 때문에 이 경우 모든 타입이 Object 타입으로 지정되며, 동적 디스패치를 고려하지 않으므로 컴파일러가 제네릭 코드에 대해서 일절 페이로드 코드를 생성하지 않는다.
- 어떠한 표현식이라도 dynamic 타입으로 캐스팅할 수 있는데, 모든 표현식의 결과 인스턴스는 Object 타입으로부터 상속받는 타입을 사용하기 때문이다.
- 컴파일러는 dynamic 타입에서 다른 타입으로 암묵적 타입 변환 문법을 사용하여 코드를 작성하는 것을 허용한다.
중요
dynamic 타입은 사실 그 자체로 System.Object 타입과 동일한 타입이다. 컴파일러는 표현식에 대해서 여러분이 어떤 코드를 작성했다고 할지라도 일단은 모두 인정하여 전혀 경고나 오류를 일으키지 않는다. 하지만 실행 시점에서 여러분이 작성한 코드가 잘못된 동작을 수핸하게 될 경우 이에 대한 예외를 일으키게 된다.
Uploaded by Notion2Tistory v1.1.0