본문 바로가기

개발관련

Dart 언어의 타입 시스템

요약

Dart 언어는 타입 시스템을 가지고 있다.

 

Dart 언어는 type safe하다. 이걸 다른 말로는 sound type system을 가지고 있다고 한다. Type system이 sound하다는 것은 expression이 static type과는 다른 type으로 evaluate되지 않는다는 것이다. (예를 들자면, a라는 변수가 정적 분석 때는 int라고 분석됐는데, 런타임에 String이라던지하는 상황)

 

Dart는 sound type system을 만들기 위해서 static type checking과 runtime check를 수행한다.

 

모든 값들은 type을 가져야하지만, type annotation은 type inference가 있기 때문에 필수적이지는 않다.

 

Sound type system의 장점

- 컴파일 타임에 타입 관련 버그를 찾을 수 있다

- 코드의 가독성 증대

- 코드의 유지보수성 증대

- AOT 컴파일을 보다 최적화할 수 있음

 

Runtime checks

컴파일 타임에 발견할 수 없는 타입 관련 문제들은 런타임에 런타임 체크로 확인이 된다. 예를 들어서, List<Dog> 타입을 List<Cat>로 캐스팅하는 등의 상황에서 런타임에 타입을 체크하여 런타임 에러가 발생하게 된다.

 

Type inference

Analyzer는 타입을 추론할 수 있다. 타입을 추론하기에 정보가 부족한 경우에는 dynamic 타입을 사용한다.

- Field and method inference: 명시적으로 선언한 타입이 없는 경우, 슈퍼클래스의 타입을 상속받는다. 명시적 타입 선언 또는 상속받는 타입이 없는 경우에는 초기값으로 타입을 추론한다.

- Static field inference: 초기값으로 타입을 추론한다.

- Local variable: 초기값으로 타입을 추론한다. 이후에 일어나는 assignments 들은 타입 추론에 반영되지 않는다.

- Type argument inference: inferred based on a combination of downward information from the context of occurence, and upward information from the arguments to the constructor or generic method.

 

 

참고

https://dart.dev/language/type-system