라이브러리 와 가시성 (Libraries and visibility)
가져오기(import) 및 라이브러리 지시문은 모듈식 및 공유 가능한 코드 기반을 만드는 데 도움이 된다. 라이브러리는 API를 제공할 뿐만 아니라 비공개성?(프라이버시)의 단위가 된다. 언더스코어(_)로 시작하는 식별자는 라이브러리 내에서만 인식할 수 있다. 라이브러리 지시문을 사용하지 않더라도 모든 Dart 앱은 라이브러리이다.
라이브러리는 패키지를 사용하여 배포할 수 있다. (주: Dart가 public 또는 private와 같은 접근 한정자 키워드 대신 언더스코(_)을 사용하는 이유가 궁금하다면 SDK 문서 33383을 참조하자)
예를 들어 Dart 웹 앱은 일반적으로 다음과 같이 가져올 수 있는 dart:html 라이브러리를 사용한다.
1
import 'dart:html';
import 에 필요한 유일한 인수는 라이브러리를 지정하는 URI 이다. 내장 라이브러리의 경우 URI에 특별한 dart: 스키마가 있다. 다른 라이브러리의 경우 파일 시스템 경로 또는 패키지: 스키마를 사용할 수 있다. package: 스키마는 pub 도구와 같은 패키지 관리자가 제공하는 라이브러리를 지정한다. 예를 들어:
1
import 'package:test/test.dart';
(주 : URI는 단일 리소스 식별자를 나타낸다. URL(Uniform Resource Locator)은 일반적인 종류의 URI이다.)
충돌하는 식별자가 있는 두 개의 라이브러리를 가져오는 경우 하나 또는 두 라이브러리 모두에 대해 접두사를 지정할 수 있다. 예를 들어 library1과 library2 모두에 Element 클래스가 있는 경우 다음과 같이 코딩할 수 있다.
1
2
3
4
5
6
7
8
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// Uses Element from lib1.
Element element1 = Element();
// Uses Element from lib2.
lib2.Element element2 = lib2.Element();
라이브러리의 일부만 사용하려는 경우 라이브러리를 선택적으로 가져올 수 있다. 예를 들어:
1
2
3
4
5
6
// Import only foo.
import 'package:lib1/lib1.dart' show foo;
// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;
지연 로딩(레이지 로딩이라고도 함)을 사용하면 라이브러리가 필요한 경우와 시간에 웹 앱이 온디멘드로 라이브러리를 로드할 수 있다. 다음은 지연된 로드를 사용할 수 있는 몇 가지 경우이다.
- 웹 앱의 초기 시작 시간을 줄이기 위해.
- 예를 들어 알고리즘의 대체 구현을 시도하는 A/B 테스트를 수행한다.
- 선택적 화면 및 대화 상자와 같이 거의 사용되지 않는 기능을 로드한다.
(주: 다트 컴파일 js만이 지연 로딩을 지원한다. Flutter와 Dart VM은 지연된 로딩을 지원하지 않는다. 자세한 내용은 sdk issue #33118 및 #27776을 참조하자.)
라이브러리를 지연 로딩하려면 먼저 deferred as 를 사용하여 라이브러리를 가져와야 한다.
1
import 'package:greetings/hello.dart' deferred as hello;
라이브러리가 필요한 경우 라이브러리 식별자를 사용하여 loadLibrary()를 호출한다.
1
2
3
4
Future<void> greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
이전 코드에서 await 키워드는 라이브러리가 로드될 때까지 실행을 일시 중지한다.
async 및 await에 대한 자세한 내용은 비동기 지원을 참조하자.
라이브러리에서 loadLibrary()를 여러 번 호출하는 것도 아무문제 없이 할 수 있다. 이때 라이브러리는 한 번만 로드된다.
지연된 로드를 사용할 때 다음 사항에 유의한다.
- 지연된 라이브러리의 상수는 가져오는 파일의 상수가 아니다. 이러한 상수는 지연된 라이브러리가 로드될 때까지 존재하지 않는다는 점을 기억하자.
- 가져오는 파일에서 지연된 라이브러리의 유형을 사용할 수 없다. 대신 지연된 라이브러리와 가져오기 파일 모두에서 가져온 라이브러리로 인터페이스 유형을 이동하는 것을 고려해야 한다.
Dart는
deferred를 네임스페이스로 사용하여 정의한 네임스페이스에loadLibrary()를 암시적으로 삽입한다.loadLibrary()함수는 Future를 반환한다.Implementing libraries (라이브러리구현)
다음을 포함하여 라이브러리 패키지를 구현하는 방법에 대한 조언은 Create Library Packages을 참조한다.
- 라이브러리 소스 코드 구성 방법.
- 내보내기 지시문을 사용하는 방법.
- 부품 지시문을 사용하는 경우.
- 라이브러리 지시문을 사용하는 경우.
- 여러 플랫폼을 지원하는 라이브러리를 구현하기 위해 조건부 가져오기 및 내보내기를 사용하는 방법
참고 자료
- https://dart.dev/guides/language/language-tour
Comments powered by Disqus.