Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

Dart 설치

우분투 리눅스 19.04 에 Dart를 설치했다. 편집기는 vim을 이용하고 있다. flutter는 Android studio를 쓰고 있는데, 언어를 학습하는데에는 너무 무겁다. 언젠가 VS Code로 설정해봐야 겠다.
$ sudo apt-get update
$ sudo apt-get install apt-transport-https
$ sudo sh -c 'curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -'
$ sudo sh -c 'curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list'
$ sudo apt-get update
(2018년 7월)현재 버전은 2.4.0이다.
$ dart --version
Dart VM version: 2.4.0 (Unknown timestamp) on "linux_x64"

Hello World

실행해보자.
# dart hello.dart
Hello, World!

개발 플랫폼

Dart는 모바일 애플리케이션, 웹 애플리케이션, CLI, 서버측 응용 프로그램등을 만들 수 있다. 범용 개발 언어라고 불러도 될 것 같다. 다만 2018년 배워서는 안될 5개 언어어 랭크 될 정도로 상황이 매우 안좋았다. 하지만 같은 사이트의 2019년 결과를 보면, 꽤나 상황이 좋아졌음을 알 수 있다. Job Market를 제외하면 나름 선방하고 있다. 특히 Growth and Trends를 보면 무려 20위에 랭크되고 있는데, 19위인 코틀린 보다 더 나은 상황이다.

Dart는 플랫폼과 개발 목표에 따라서 다양한 방식으로 실행 할 수 있다.
  • Dart Native : 모바일, 데스크탑, 서버의 경우 Dart VM & JIT(just-in-time)를 이용해서 개발하고, AOT(ahead-of-time)컴파일러로 머신코드를 만들어서 배포 할 수 있다.
  • Dart Web : 웹인 경우 dartdevc와 dart2js로 개발 및 배포 할 수 있다.

Dart program 기본

  • // 는 주석이다. 멀티라인 주석인 /* */도 지원한다.
  • int : 타입. String, List, bool등의 내장타입을 제공한다.
  • print() : 텍스트를 표준출력한다.
  • ' 혹은 ' : 문자열 보간(interpolation)을 지원한다. 문자열 내에서 변수 또는 표현식을 포함 할 수 있다.
  • main() : C/C++ 언어처럼 top-level 함수로 사용한다.
  • var : 데이터 타입을 지정하지 않고 변수를 선언 할 수 있다.

주요 컨셉

아래의 사실과 개념을 숙지한다면, Dart 언어를 배우는데 도움이 될 것이다.
  • 변수에 넣을 수 있는 모든 것은 객체이며, 모든 객체는 클래스의 인스턴스다. 숫자, 함수, null도 객체다. 모든 객체는 Object 클래스를 상속받는다.
  • Dart는 강타입(strongly typed)언어이지만, 타입유추도 가능하므로 타입을 생략 할 수 있다. 예제코드의 number는 int 유형으로 유추된다.
  • Dart는 List<int>, List<dynamic>과 같은 제너릭을 지원한다.
  • Dart는 최상위 함수와 클래스 또는 객체에 연결된 함수를 지원한다. 함수 내에서 함수를 만들 수도 있다.
  • Dart는 클래스 객체에 연결된 변수뿐만 아니라 최상위 변수도 지원한다. 인스턴스나 변수는 필드 또는 속성이라고도 한다.
  • Java와 달리 public, protected, private 키워드가 없다. 언더바(_)로 시작하면 private 이다.
  • Dart 툴은 경고와 오류 두 가지 종류의 문제를 보고한다. 경고는 코드가 작동하지 않을 수도 있지만 어쨋든 코드는 실행한다. 오류는 컴파일 타임 혹은 런타임 오류 중 하나다. 컴파일 타임 오류는 아예 코드가 실행되지 않을 것이다. 런타임 오류는 코드가 실행되는 동안 예외가 발생한다.

키워드

약 60개의 키워드를 제공한다. 아래의 키워드들은 변수나 클래스 이름으로 사용하면 안된다.
abstract dynamic implements show
as else import static
assert enum in super
async export interface switch
await extends is sync
break external library this
case factory mixin throw
catch false new true
class final null try
const finally on typedef
continue for operator var
covariant Function part void
default get rethrow while
deferred hide return with
do if set yield

변수

변수를 만들고 초기화하는 예제다.

변수는 (데이터가 저장된 위치의)참조를 저장한다. 위 예제에서 name 변수는 Bob 값이 저장된 String 객체의 참조 정보를 저장하고 있다.

name 변수의 유형은 String으로 유추되지만 필요에 따라 유형을 변경 할 수 있다. 객체가 단일 유형으로 제한되지 않는다면 dynamic이라는 동적 타입을 사용 할 수 있다. 아래처럼 유형을 명시적으로 선언할 수도 있다.

Default value

초기화하지 않은 변수의 초기 값은 null이다. Dart의 다른 유형과 마찬가지로 null 역시 객체다. 프러덕션 코드에서 assert() 호출은 무시된다. 개발환경에서 assert 예외를 발생시키고 싶다면 --enable-asserts옵션으로 실행하면 된다.
# dart --enable-asserts test.dart

Final과 const

변수를 변경하지 않으려면 var 대신 finalconst를 사용한다. final은 한번만 설정 할 수 있다. const는 상수다.

아래 예제를 보자. final 변수는 값을 변경 할 수 없기 때문에 에러가 떨어진다.

const를 이용하면 컴파일 시간에 상수가되도록 할 수 있다. 만약 const 변수가 클래스 레벨이라면 static const가 된다.

변수가 const, final이 아니라면 값이 const라고 하더라도 변경 할 수 있다. const 변수는 값을 변경 할 수 없다.

내장 타입들

Dart는 아래의 내장타입들을 지원한다.
  • numbers
  • strings
  • booleans
  • lists : 배열(array)이라고도 한다.
  • sets
  • maps
  • runes: 유니코드 문자를 표현하기 위해서 사용한다.
  • symbols
리터럴을 이용해서 각 타입들을 초기화 할 수 있다. 예를 들어 "this is a string"는 string이고, true는 boolean 리터럴이다.

Dart의 모든 변수는 객체(클래스의 인스턴스)이기 때문에 생성자를 이용해서 변수를 초기화 할 수 있다. 일부 내장 타입들은 자체 생성자를 가지고 있다. 예를 들어 Map은 ()생성자를 이용해 초기화 할 수 있다.

Number

Dart 는 intdouble 두 가지 숫자를 제공한다.
  • int : 64bit 이하의 정수값으로 Dart VM에서는 -2^63에서 2^63-1의 값을 가질 수 있다. JavaScript로 컴파일 될 때는, JavaScript 숫자 범위를(-2^53 ~ 2^53-1) 가진다.
  • double : IEEE754에서 지정된 64비트 부동소숫점 숫자.
int와 double 모두 num의 subtype으로 +,-,*,/과 같은 기본연산자를 포함하고 있으며, abs(), ceil(), floor() 등을 사용할 수 있다. string의 int변환, int에서 string 변환과 같은 유용한 메서드도 제공한다.

Strings

Dart string은 일련의 UTF-16 코드 유닛 데이터다. 싱글 혹은 더블쿼터로 string을 만들 수 있다. ${expression}을 이용해서 문자열에 표현식의 값을 넣을 수 있다. 트리플 싱글쿼터 혹은 트리플 더블쿼토로 멀티라인 string을 만들 수 있다.

booleans

참(true)과 거짓(false)를 나타내는 논리자료형이다.

Lists

언어를 막론하고 가장 널리 사용하는 컬랙션(collection)은 배열과 정렬된 객체그룹일 것이다. Dart에서 배열은 list 객체다. Dart에서 list는 List<int>로 유추하기 때문에, 정수가 아닌 개체를 목록에 추가하면 런타임에서 에러를 출력한다. List의 인덱스는 (다른 언어의 배열과 마찬가지로) 0부터 시작한다.

Dart 2.3 부터는 스프레드 연산자(...)와 널 인식 스프레드 연산자(...?)를 제공한다. 스프레드 연산자를 이용해서 여러 요소를 쉽게 삽입할 수 있다. 널 인식 스프레드 연산자의 경우 널인식을 통한 에러를 막을 수 있다. 코드를 실행하면 에러가 발생한다.
 dart list.dart
Unhandled exception:
NoSuchMethodError: The getter 'iterator' was called on null.
Receiver: null
Tried calling: iterator
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:50:5)
#1      main (file:///home/yundream/workspace/dart/list.dart:3:19)
#2      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
#3      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:172:12)
아래와 같이 코드를 수정하는 것으로 에러를 방지 할 수 있다.

Dart 2.3부터 collection ifcollection for를 제공한다. 배열안에서 iffor문을 사용 할 수 있다. office가 true이므로 4번째요소는 Outlet이 된다.

for문을 이용해서 배열을 초기화하는 예제다.

Sets

Set은 정렬되지 않는 유일한 아이템들의 집합이다. halogens의 타입은 Set<String>이다. 만약 다른 타입의 값을 입력한다면 에러를 발생할 것이다. Set은 객체이며 add(), addAll()등의 메서드로 아이템을 추가할 수 있다.

Maps

일반적으로 map은 키(key)와 값(value)로 이루어진다. 키와 값은 어떤 객체 타입이라도 상관없다. 키는 중복을 허용하지 않는다. Map 생성자를 이용해서 map을 만들 수 있다. Dart 2.3 부터는 스프레드 연산자(...과 ...?)를 지원한다.

참고

  • 이 문서는 dart.dev의 내용을 번역했다.
목차