프로그래밍 언어론 7-2-3강. 타입 추론(Type Inference)

[프로그래밍 언어론]

2019. 12. 14. 14:56

 

[타입 추론]

: 지금까진 표현식의 구성요소들을 타입 검사(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의 결과의 타입을 사용한다.