Dart: 변수와 타입

Come to the Dart side

John Cho
Dartlang korea
5 min readJul 26, 2019

--

Dart는 Google에서 만든 클라이언트 개발에 최적화되어있는 언어다. 2011년부터 개발을 시작했지만 세월의 풍파를 맞으면서 2.0에서 대규모 변화가 있었기 때문에 2.x 버전을 공부하는 걸 권장한다. 2019년 7월 27일 기준의 최신 버전은 Dart 2.4 버전이다.

이 글에서는 변수와 타입에 대해서 알아보도록 하겠다. 아래 코드는 모두 dartpad에서 실행 가능하다.

변수 선언

Dart 에서 변수 선언은 var 라는 키워드를 사용하여 선언할 수 있다.

var name = "조은"

변수는 참조 (reference)를 저장한다. Dart 에서는 모든 것이 객체로 취급되기 때문에, 위 코드에서는 name 변수가 “조은” 이라는 값을 가진 String 객체의 참조를 저장하고 있다.

Dart에서 var 키워드를 사용해서 변수를 선언하면, 해당 변수가 참조하고 있는 객체에 따라서 타입이 결정된다. 예를 들어 위 케이스에서는 String 객체를 참조하고있기 때문에 name 변수의 타입은 string이다.

Dart는 type safe 언어로 Dart VM이나 dartdevc 같은 런타임 상에서 dart 코드를 동작시키면 runtime check가 자동으로 실행되어 변수에 올바른 타입의 값이 들어갔는 지 체크한다.

예를 들어 아래 코드는 오류를 반환한다.

var name = "조은";
name = 10;
// Error: A value of type ‘int’ can’t be assigned to a variable of type ‘String’.

dynamic

이미 String으로 타입이 결정된 변수에 int를 넣으려고 하면 위 코드처럼 에러가 발생한다. 만약 하나의 변수가 여러 타입으로 변경이 필요하다면 dynamic 키워드를 사용해서 변수를 선언해야한다.

dynamic name = "조은"

Type annotation

Dart에서 var를 이용한 변수 선언을 지원하고 있지만, 런타임 시에 타입이 결정되기 때문에 코드만 보고서는 타입을 100% 이해하기에 어렵다는 단점이 있다. Dart에서는 변수 선언과 함께 타입을 선언하는 방식의 코드도 지원한다.

String name = "cho eun";

(대소문자에 주의하자) 위 코드는 name 변수가 String 타입의 객체를 참조할 것임을 알려주는 코드다. 위와 같은 표현식을 type annotation 이라고 부른다. 당연히 함수 등에서 매개 변수를 받을 때에도 type annotation을 사용할 수 있다.

bool isEmpty(String parameter) {bool result = parameter.isEmpty;return result;}

위 코드에서는 세개의 type annotation이 사용되었다. 우선 매개 변수는 String 타입이어야하며, 함수 내부의 result는 boolean 타입이다. 함수 앞에 사용한 type annotation은 함수의 반환값의 타입을 선언하는 것으로 반환값이 boolean이어야한다는 의미다.

generic invocation

때로는 클래스 내부에서 사용할 타입을 외부에서 지정해줘야할 필요도 있다. 주로 콜렉션 리터럴 등에서 많이 사용되는 문법으로 아래와 같다.

var lists = <num>[1, 2];lists.addAll(List<num>.filled(3, 4));lists.cast<int>();

위 코드에서 lists의 타입은 List지만, lists가 가지는 아이템의 타입은 number로 지정하였다. 이런 문법을 generic invocation이라고 부른다. Type annotation과 generic invocation을 조합해서 사용하는 것도 가능하다.

List<int> lists = [1, 2];

Dart가 var 키워드를 이용한 런타임 타입 선언 방식도 지원하고 type annotation이나 generic invocation을 이용한 정적 타입 선언도 지원하기 때문에 때로 코드에 타입이 없는 (untyped) 것이라고 혼란을 겪을 수 있다. Dart에서는 타입이 없는 것이 아니라, 아래와 같은 규칙을 따르고있다.

  • 만약 코드가 type annotation을 이용해 타입을 선언했다면, 타입은 코드에 바로 작성된다.
  • 만약 코드가 var를 이용하였고, 타입을 별도로 선언하지 않았다면, Dart는 해당 변수가 참조하고 있는 객체를 통해 타입을 추론한다. 때로 타입 추론은 실패할 수도 있으며, 가이드라인은 이 케이스에 대해서는 고려하지 않는다. 종종 타입 추론 실패는 정적 에러로 취급되기도 한다. 다른 경우에, Dart는 폴백 타입으로 dynamic 을 사용한다.
  • dynamic 을 사용한 경우, dynamic 타입이라는 특수한 정적 타입을 사용한다. 코드에 명시적으로 dynamic 키워드를 붙여서 선언 가능하다.

따라서 대부분의 경우에는 폴백으로 dynamic 타입을 가지기 때문에 타입이 존재하지 않는 상황에 대해서는 걱정하지 않아도 된다고 생각한다.

Conclution

이번 글에서는 dart의 변수 선언과 타입에 대해서 간단히 알아보았다. 아주 기본적인 내용에 대해서만 다루었기 때문에, 추후에 타입에 대해서는 더 자세히 다루어보도록 하겠다.

궁금한 점은 댓글로 남겨주면 감사하겠다.

--

--