Contents

라이브러리 & 임포트

importlibrary 명령어는 코드를 모듈화하고 공유하는 것을 도와줍니다. 라이브러리는 API를 제공할 뿐만 아니라, 관리(privacy)의 단위가 됩니다: 언더스코어(_)로 시작하는 식별자들은 오직 그 라이브러리 안에서만 보입니다. library 명령어를 사용하지 않았다고 해도, 모든 Dart 앱은 라이브러리입니다.

라이브러리들은 packages를 사용해 분산 될 수 있습니다.

라이브러리 사용하기

어떤 라이브러리의 네임스페이스가 다른 라이브러리의 스코프에서 사용되는 방법을 지정하고 싶다면 import를 사용하세요.

예를 들어, Dart 웹앱은 보통 dart:html 라이브러리를 사용합니다. 다음 예제 처럼 말이죠:

import 'dart:html';

import가 필요한 인자는 라이브러리를 특정 지을 수 있는 URI뿐입니다. 내장 라이브러리들은 dart:라는 특별한 스킴(scheme)을 따릅니다. 이외의 라이브러리를 사용하고 싶다면, 파일 시스템 경로나 package:를 사용하면 됩니다. package: 스킴은 pub 같은 패키지 매니저가 제공하는 라이브러리를 특정 지을 때 사용합니다.

import 'package:test/test.dart';

라이브러리 프리픽스 지정하기

같은 식별자를 가지는 두 개의 라이브러리를 임포트하면 충돌이 발생합니다. 그럴 때 프리픽스를 특정하면 문제가 해결됩니다. 예를 들면, 라이브러리1과 라이브러리2가 Element 클래스를 가진다고 하면, 코드는 다음과 같을 것 입니다:

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;

// lib1의 Element 사용.
Element element1 = Element();

// lib3의 Element 사용.
lib2.Element element2 = lib2.Element();

라이브러리의 일부만 가져오기

라이브러리의 일부만 필요하다면, 다음과 같이 라이브러리를 선택적으로 import 할 수 있습니다:

// foo만 import.
import 'package:lib1/lib1.dart' show foo;

// foo를 제외하고 모두 import.
import 'package:lib2/lib2.dart' hide foo;

라이브러리 지연 로딩

지연 로딩(Deferred loading) (lazy loading)은 웹앱이 해당 라이브러리가 필요할 때 로드하게 해줍니다. 다음은 지연 로딩을 사용해야 하는 케이스 입니다:

  • 웹앱의 초기 로딩 시간을 줄이고 싶을 때
  • A/B 테스팅을 진행할 때 — 예를 들어, 대안이 되는 알고리즘들의 구현을 시험해 볼 때가 있습니다.
  • 선택적인 화면과 다이얼 로그 같은 드물게 사용되는 기능을 로드 할 때.

라이브러리를 필요 할 때 지연 로딩하고 싶다면, deferred as를 사용해 입포트 하세요.

import 'package:greetings/hello.dart' deferred as hello;

라이브러리를 사용해야 한다면, loadLibrary()를 라이브러리의 식별자에 사용해 호출하세요.

Future<void> greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

앞선 코드에서, await 키워드는 라이브러리가 로드 될 때 까지 실행을 멈춥니다. asyncawait에 대해 더 자세히 알고 싶다면, 비동기 지원을 참고하세요.

loadLibrary()를 한 라이브러리에 여러번 호출해도 한 번만 로드되기 때문에 에러가 발생하지 않습니다.

지연 로딩을 사용할 때 다음을 꼭 기억해두세요:

  • 지연된 라이브러리의 상수는 import하는 파일에서 상수가 아닙니다. 꼭 기억하세요, 이 상수는 지연된 라이브러리가 로드되기 전에는 존재하지 않는 상수 입니다.
  • Import하는 파일에서 지연된 라이브러리에 타입을 사용 할 수 없습니다. 대신, 지연된 라이브러리와 import하는 파일에서 가져온 라이브러리로 인터페이스 타입을 이동하는 것을 고려하세요.
  • Dart는 암묵적으로 loadLibrary()deferred as namespace 를 사용하여 정의한 네임스페이스에 삽입합니다. loadLibrary()Future를 반환합니다.

library 명령어

라이브러리 수준의 문서화 주석 or 메타데이터 어노테이션를 지정하고 싶다면, 파일의 시작에 library 선언을 추가하세요.

/// A really great test library.
@TestOn('browser')
library;

라이브러리 구현하기

라이브러리 구현에 대한 자세한 방법은 다음 항목들을 포함하는 라이브러리 패키지 만들기를 살펴보세요:

  • 라이브러리 소스 코드 구성법.
  • export 명령어 사용법.
  • part 명령어를 사용해야할 때.
  • 다수의 플랫폼을 지원하는 라이브러리를 구현 할 때 조건적인 import와 export의 사용법.