[타입 추론]
: 지금까진 표현식의 구성요소들을 타입 검사(type checking)하는 것을 보았다.
: 그러면, 연산의 결과물의 타입은 어떻게 되는가?
# 타입 추론 개요 예시
a + b // a, b는 type chekcing dl vlfdygkek 3 + 3.2 = ? // 이 결과의 타입은 무슨 타입인가? |
[쉬운 타입 추론]
: 타입 추론의 결과가 쉽게 나오는 경우들이 있다.
1) 산술 연산의 결과는 주로 피연산자의 타입을 따라간다 (만약 피연산자의 타입이 다르면 한 피연산자의 타입 자동형변환)
2) 비교연산자의 결과는 부울(Boolean) 타입이다.
3) 함수의 호출의 결과는 함수의 header에 정의되어있는 타입 이다.
[어려운 타입 추론]
: 위와 같은 케이스들 말고 결과가 명백하지 않은 경우가 존재한다. (ex. subrange의 연산, 혼합된(composite) 객체들)
# 어려운 타입 추론 예시 1 - Subranges and Sets
type Atype = 0..20; Btype = 10..20; var a : Atype; b : Btype; a + b = ? |
: subrange의 산술 연산의 결과는 subrange의 베이스 타입을 따라 간다. ( 위 예시의 결과는 integer )
: 컴파일러의 성능 높이기 위해 subrange의 최소값과 최대값을 계속 추적하고 bound(범위)를 검사한다
[정의(Declarations)]
: 결과 값의 타입을 선언해주는 방식
: 위와 같이 유추하는 방법은 수행력의 감소 유발하는 등의 문제가 있기에 이 방법을 해결책으로 사용한다.
# 정의 예시
int i = a + b; // 결과 값 i의 결과를 integer 타입으로 정의해 주었다. |
: Ada가 loop에 index 사용한 최초의 언어이다 ( ex) for (int i = 0; ... )
: 최근의 언어 (Scala, C#, c++11, Go, Swift)들에선 아이디어가 더 확장되어, 그 선언의 의도를 문맥에서 유추할 수 있을 때 타입 선언을 생략할 수 있게 해준다.
# C#에서의 확장된 정의 예시
var i = 123; // int i = 123; 와 같은 의미 var map = new Dictionary<string, int>(); // 확장된 정의 방법 사용 // 확장 정의 사용 안된 상태에선 아래와 같이 사용 Dictionary<string, int> map = new Dictionary<string, int>(); |
# auto keyword
: 위와 비슷하게 타입 지시를 생략 할 수 있게 해준다. ( 이정도만 )
auto reduce = [](list<int> L, int f(int, int), int s) { ... } ... int sum = reduce(my_list, [](int a, int b) { return a+b;}, 0); // 이와 같이 사용할 수 있게 해준다. |
# C++의 decltype 키워드
: 더욱 확장된 개념으로, 객체의 타입이 정해지지 않은 상태에서 임의의 결과의 타입을 사용하는 것
template <typename A, typename B> ... A a; B b; decltype(a + b) sum; |
: A, B 타입 정해지지 않은 상태에서 a + b의 결과의 타입을 사용한다.
'[프로그래밍 언어론]' 카테고리의 다른 글
프로그래밍 언어론 7-3-1강. 일반화된 서브루틴과 클래스(Generic Subroutine and Classes) (0) | 2019.12.15 |
---|---|
프로그래밍 언어론 7-3강. 파리미터의 다형성 (Parametric Polymorphism) (0) | 2019.12.15 |
프로그래밍 언어론 7-2-2강. 타입 호환성(Type Compatibility) (0) | 2019.12.13 |
프로그래밍 언어론 7-2-1강. 타입 동등성(Type Equivalence) (0) | 2019.12.13 |
프로그래밍 언어론 7-2강. 타입 검사(Type Checking) (0) | 2019.12.13 |