Flutter/Dart

Dart 개요 번역

mayleaf 2021. 8. 26. 18:22
이 글은 www.dart.dev/overview를 번역한 글입니다.
* 이해하기 쉽도록 의역을 했는데요. 마음에 안드시더라도 양해 부탁드립니다.

dart는 어떤 플랫폼에서든 빠르게 개발하기위해 최적화된 언어입니다. 이 언어는 가장 생산적인 언어를 제시하는 것이 목표인데요. 다양한 플랫폼에서 개발 가능해야하고, 다양한 플랫폼에서 개발할 수 있는 것처럼 다양한 해당 플랫폼들에서 앱 프레임워크가 동작하게 하기 위한 언어입니다.

 

언어는 기술적 범위에 의해서 정의됩니다. 이 기술적 범위는 개발과정에서의 선택에 의해서 정의되는데요. 언어의 강점과 어떤 것을 처리할지를 개발하면서 선택하는 과정에서 형성됩니다.

 

언어는 그 기술적 범위, 즉 언어의 능력과 강점을 형성하는 개발 과정에서 이루어진 선택으로 정의됩니다. Dart는 클라이언트 개발에 적합한 범위를 가지고 설계되었으며, 개발(상태 저장 핫 리로드)과 다양한 플랫폼에서의 고품질 프로덕션 경험(웹, 모바일 및 데스크톱)을 모두 우선합니다.

 

그리고 Dart는 Flutter의 근간이기도 합니다. dart는 플러터 앱을 실행시키는 런타임과 언어를 제공합니다. 그러나 dart는 formatting과 analying, and testing code같은 핵심적인 개발자 업무에서도 사용됩니다.

Dart: The Language

Dart는 Type safe 합니다. 변수의 값이 변수의 정적 타입과 같은이 항상 보장하는 정적 타입 체크를 합니다. 가끔은  Sound Typing이라고 말하기도 하죠. 이렇게 타입이 필요하지만 변수의 타입을 항상 명시해야하진 않습니다. 왜냐하면 타입 추론*이 있기 때문입니다.

Dart의 타입 시스템은 유연하기도해서, dynamic 타입도 지원하는데요. 런타임에서 타입을 체크해주고, 변수 선언 이후에도, 타입을 변경할 수 있습니다. 이 dynamic은 실험용 코딩중이나 특별한 케이스에서만 유용합니다.

* 타입추론은 C++의 auto, Java의 var와 같은 feature이며, dart에서는 var 라는 키워드를 사용합니다. var를 사용하기 위해선, 앞의 언어처럼 선언과 동시에 객체를 할당해줘야합니다.

 

Dart는 sound null safety*라는 피쳐를 제공하는데요. 직접적으로 프로그래머가 Nullable 하다고 하지 않는 이상 값이 null이 될 수 없습니다. sound null safety 덕에 Dart는 정적 코드 분석을 통해 runtime null exception 가 안나도록 방지합니다.

다른 null safety 언어들과 다르게 Dart는 한번 non-nullable 이면, 그 변수는 항상 non-nullable합니다. 여러분의 코드를 실행하면서 디버깅해보면, non-nullability가 runtime 동안 지속되는 것을 볼 수 있습니다.( 그래서 sound null safety라고 하죠)

* sound null safety는 dart 2.12 부터 사용 가능합니다.

 

아래 예제 코드는 Dart의 feature들을 보여주는데요. libraries, async calls, nullable, non-nullable 한 types, arrow syntax, generators, streams, and getters 등의 feature가 있습니다. 추가적인 Dart feature를 쓰는 예시를 보려면 예제 페이지를 보세요.

Dart 언어를 더 배우기 위해서는 Dart langauage tour를 시작하시구요.

import 'dart:math' show Random;

void main() async {
  print('Compute π using the Monte Carlo method.');
  await for (final estimate in computePi().take(100)) {
    print('π ≅ $estimate');
  }
}

/// Generates a stream of increasingly accurate estimates of π.
Stream<double> computePi({int batch = 100000}) async* {
  var total = 0; // Inferred to be of type int
  var count = 0;
  while (true) {
    final points = generateRandom().take(batch);
    final inside = points.where((p) => p.isInsideUnitCircle);

    total += batch;
    count += inside.length;
    final ratio = count / total;

    // Area of a circle is A = π⋅r², therefore π = A/r².
    // So, when given random points with x ∈ <0,1>,
    // y ∈ <0,1>, the ratio of those inside a unit circle
    // should approach π / 4. Therefore, the value of π
    // should be:
    yield ratio * 4;
  }
}

Iterable<Point> generateRandom([int? seed]) sync* {
  final random = Random(seed);
  while (true) {
    yield Point(random.nextDouble(), random.nextDouble());
  }
}

class Point {
  final double x;
  final double y;

  const Point(this.x, this.y);

  bool get isInsideUnitCircle => x * x + y * y <= 1;
}

Dart: The libraries

Dart는 풍부한 코어 라이브러리를 가지고 있는데요, 매일 사용되는 프로그래밍 작업을 위한 필수적인 기능을 제공합니다:

 

  • Built-in types, collections, 그리고 다른 Dart의 필수적인 기능 (dart:core)
  • 큐, 연결리스트, 해시맵, 이진 트리등 풍부한 컬렉션 자료형들 (dart: collection)
  • JSON이나 UTF-8을 포함해서 서로 다른 data representation 끼리 전환할 수 있는 인코더와 디코더들 (dart: convert)
  • 수학에서 쓰이는 상수, 함수, 그리고 난수 생성(dart: math)
  • 웹이 아닌 어플리케이션을 위한 파일 , 소켓, HTTP, 그리고 다른 I/O 지원 (dart:io)
  • Future나 Stream같은 class 들과 함께 비동기 프로그래밍 지원 (dart:async)
  • 정해진 사이즈의 데이터(unsigned 8-byte integer 같은)를 다루는데 효과적인 리스트들, simd numeric type들 (dart:typed_data)
  • 다른 언어를 사용할 수 있는 인터페이스들, C style interface를 사용하는 다른언어의 인터페이스 제공 (dart:ffi)
  • isolates 를 이용한 동시성 프로그래밍 - 쓰레드처럼 독립적인 워커지만 메모리를 공유하지는 않고, 메세지만 이용해서 서로 소통함(dart: isolate)
  • 브라우저와 DOM과 상호작용할 필요가 있느 웹 기반 어플리케이션을 위한 HTML elements 와 다른 리소스들(dart:html)

코어 라이브러리 외에도, 포괄적인 패키지 셋을 통해 많은 API들이 제공됩니다. Dart 팀은 유용한 보조 패키지를 많이 출시했습니다.
이런 것들이 있죠:

추가적으로, 서드파티 퍼블리셔들, 넓은 커뮤니티가 엄청난 양의 패키지들을 내놓습니다. 아래같은 기능들을 지원하는 패키지들이죠.

Dart 코어 라이브러리를 사용한 예제를 더 보고 싶다면 library tour를 보세요. 추가적인 API를 찾기 위해서는 commonly used packages page.

Dart: The platforms

Dart의 컴파일러 기술을 사용하면 다음과 같은 다양한 방법으로 코드를 실행할 수 있습니다.

  • 네이티브 플랫폼: 모바일과 데스크탑을 타게팅하는 앱을 위해 Dart는 두가지 컴파일 방식을 지원하는데요. JIT 컴파일 방식을 사용하는 Dart VM, 그리고 기계어 코드를 만들어내기위한 AOT 컴파일러를 지원합니다.
  • 웹 플랫폼: 웹을 타게팅하는 앱을 위해 Dart는 두가지 컴파일 방식을 지원하는데요. 개발용 컴파일러(dartdevc) 와 프로덕션용 컴파일러(dart2js)를 제공합니다. 두 컴파일러 모두 Dart를 Javascript로 번역해줍니다.

플러터 프레임워크(Dart 플랫폼에 의해 돌아가는 멀티 플랫폼 UI툴킷)는 유명하고 IOS, 안드로이드, 맥, 리눅스, 웹에서 동작하는 UI 경험을 만들수 있게 UI 라이브러리와 툴을 제공합니다.

 

Dart Native (machine code JIT and AOT)

개발하는 동안, 빠른 개발 사이클은 반복에 아주 중요합니다. Dart VM은 실시간 매트릭 컬렉션(개발툴을 쓸 수 있게하는), 풍부한 디버깅 기능을 지원하는 증분형 저스트인타임 컴파일러 (JIT)를 제공합니다.

 

앱이 배포될때 - 앱스토어에 앱을 출시하던, 백엔드에 배포하던 - Dart AOT 컴파일러는 native arm 혹은 x64 기계어로 a head of time 컴파일을 하게 해줍니다. AOT 컴파일된 앱은 일관적이고, 순식간에 켤 수 있습니다.

 

AOT 컴파일된 코드는 효율적인 Dart 런타임에서 굴러가고, 이 런타임은 합리적인 Dart 타입 시스템이 적용되며, 빠른 객체 할당과 세대별 GC를 이용해 메모리를 관리합니다.

 

더 많은 정보:

Dart Web (Javascript dev & prod)

Dart Web은 자바스크립드로 돌아가는 웹 플랫폼에서 Dart 코드를 실행할 수 있게 합니다. Dart Web을 사용하면, Dart 코드를 자바스크립트 코드로 컴파일 할 수 있습니다. 번역된 자바스크립트 코드는 브라우져에서 돌아가죠.(크롬에 v8엔진처럼)

Dart web은 두가지 컴파일러를 제공하는데요. 첫 번째는 개발 사이클을 빠르게 해주는 증분식 개발용 컴파일러, 두번째는 최적화된 프로덕션 컴파일러인 dart2js 입니다. dart2js는 dead code elimination같은 기술을 이용해서 Dart 코드를 더 빠르고, 간결하고, 배포 가능한 자바스크립트로 컴파일해줍니다.

 

더 많은 정보:

Learning Dart

Dart를 배우기 위한 다양한 옵션이 있는데요. 추천드리는 선택지가 있습니다.

마무리

Dart 언어에 대해서 사람들이 레퍼런스를 찾을 수 있으면 좋겠다는 생각이 들어 글을 작성했습니다.

글이 굉장히 양이 많고, 한번에 읽으라는 의도로 공식문서가 적혀져있다는 생각이 들지는 않습니다.

앞으로는 공식문서를 베이스로 예시와 제 생각을 더 많이 넣은 글을 적어보도록 하겠습니다.

 

감사합니다.

'Flutter > Dart' 카테고리의 다른 글

다트 자료형, Dart Built-in Types  (0) 2021.08.29
다트 변수, Dart Variable  (1) 2021.08.28
Dart 기본 예제  (0) 2021.08.27