모든 Dart 파일은 자체적으로 라이브러리입니다 library 지시자를 적지 않아도 적용됨;
접근 권한 규칙:식별자가 밑줄 _로 시작하면 라이브러리 전용(private)으로, 같은 라이브러리 내에서만 보이고 다른 파일/라이브러리에서는 접근 불가;
Dart에는 public/protected/private 키워드가 없으며 오직 밑줄로 접근 권한을 구분함;
라이브러리를 package로 묶어 pub 패키지 관리 툴로 관리할 수 있음;
장점:트리 쉐이킹(Tree Shaking) 최적화로 사용하지 않는 죽은 코드를 제거하기 유리함.
import 불러오기
import 키워드로 다른 라이브러리를 불러옵니다.
import는 다른 라이브러리의 API를 가져올 때 사용
URI는 세 가지 종류로 나뉨:
dart:xxx:Dart 기본 표준 라이브러리(dart:core、dart:async、dart:js_interop)package:xxx:pub로 관리하는 서드파티 라이브러리- 상대 파일 경로:직접 만든 로컬
.dart파일
// 기본 표준 라이브러리
import 'dart:js_interop';
import 'dart:math';
// 서드파티 패키지
import 'package:test/test.dart';
// 로컬 파일 라이브러리
import './utils.dart';Code language: JavaScript (javascript)
라이브러리 별칭 as
두 라이브러리에 같은 이름의 클래스/함수가 존재할 경우 as 별칭으로 네임스페이스를 분리하여 충돌 방지.
예시
lib1.dart 파일 내용
class Element {}Code language: JavaScript (javascript)
lib2.dart에 동명 클래스 존재
class Element {}Code language: JavaScript (javascript)
main.dart 메인 파일
// 기본 네임스페이스로 불러오기
import 'lib1.dart';
// 별칭 lib2 지정
import 'lib2.dart' as lib2;
void main() {
Element e1 = Element(); // lib1의 Element
lib2.Element e2 = lib2.Element(); // lib2의 Element
}Code language: JavaScript (javascript)
이름 충돌을 막기 위해 lib2.dart에 lib2라는 별칭을 붙이고, 내부 클래스에 접근할 때 별칭 접두사를 붙여 사용합니다.
선택적 불러오기 show / hide
show:지정한 이름만 불러오고 나머지는 전부 숨김
// foo만 불러오고 다른 변수/클래스 사용 불가
import 'lib1.dart' show foo;
void main() {
foo();
// bar(); // 오류, show로 지정되지 않아 접근 불가
}Code language: JavaScript (javascript)
hide:전체를 불러오되 지정한 이름만 차단
// 전체 불러오되 foo만 가리기
import 'lib2.dart' hide foo;
void main() {
bar();
// foo(); // 오류, hide로 차단됨
}Code language: JavaScript (javascript)
지연 로딩 deferred as
오직 Web 플랫폼에서만 작동
- 웹 초기 로딩 용량 축소;
- 사용 빈도 낮은 팝업, 선택 페이지에 활용;
- 필요할 때 코드 조각을 동적으로 다운로드.
- 불러오기 문법:
import 파일경로 deferred as 네임스페이스 네임스페이스.loadLibrary()는 Future를 반환하며await로 로딩 완료 대기- 같은 라이브러리를 여러 번
loadLibrary()호출해도 한 번만 로딩됨 - 제약:지연 라이브러리 내상수, 타입은 로딩 전 직접 사용 불가
전체 예시
hello.dart(지연 로딩 대상 라이브러리)
void printGreeting() {
print("Hello from deferred library wellcome to foxdevelop.com");
}
Code language: JavaScript (javascript)
main.dart
// 지연 불러오기, 별칭 hello
import 'hello.dart' deferred as hello;
Future<void> greet() async {
// 동적으로 라이브러리 로드
await hello.loadLibrary();
// 로딩 완료 후 내부 메서드 호출 가능
hello.printGreeting();
}
void main() async {
await greet();
}
Code language: JavaScript (javascript)
실행 결과:
Hello from deferred library wellcome to foxdevelop.com
Code language: JavaScript (javascript)
두 파일을 같은 폴더에 배치

hello.dart가 상위 lib 폴더에 위치할 경우
경로 예시:D:\dartdemo\firstdart\lib
main.dart는 D:\dartdemo\firstdart\bin 하위
firstdart/
├─ bin/
│ └─ firstdart.dart // 프로그램 진입점
└─ lib/
└─ hello.dart // 지연 로딩 라이브러리Code language: JavaScript (javascript)
이 경우 불러오기 코드
// ../는 상위 디렉터리 의미
import '../lib/hello.dart' deferred as hello;Code language: JavaScript (javascript)
library 라이브러리 최상단 선언
파일 맨 위에 작성, 라이브러리 전체 문서 주석, 라이브러리 레벨 어노테이션(테스트 플랫폼 제한 등) 설정에 사용.
/// 브라우저 전용 테스트 도구 라이브러리
@TestOn('browser')
library;
Code language: JavaScript (javascript)
export 내보내기
캡슐화하여 외부 통일 API 제공
툴 패키지 개발에 자주 쓰이며 여러 하위 라이브러리를 집약하고 외부에 단 하나의 불러오기 진입점만 노출.
파일 구조 예시
src/math.dart
int add(int a, int b) => a + b;
int sub(int a, int b) => a - b;
Code language: PHP (php)
src/string.dart
String upper(String s) => s.toUpperCase();
Code language: JavaScript (javascript)
utils.dart(통합 내보내기 진입점)
export 'src/math.dart';
export 'src/string.dart';
// 내부 비공개 유틸 숨기기
export 'src/internal.dart' hide helper;
Code language: JavaScript (javascript)
utils.dart 단독 실행 불가 집약용 파일이므로 main() 진입점이 없어 dart run lib/utils.dart 실행 불가;
export의 역할
- 여러 src 하위 파일의 API를 집약;
- 사용자는
utils.dart한 파일만 불러오면 모든 공개 메서드 사용 가능; hide xxx로 내부 구현 유틸을 차단, 내부 로직을 숨기고 공개 API를 제어.
main.dart 사용 예시
import 'utils.dart';
void main() {
print(add(1,2));
print(upper("dart"));
}
Code language: JavaScript (javascript)
주의점
export/import는 소스 코드 레벨의 입출력일 뿐,.dart소스 파일을 배포하면 타인이 전체 소스를 열람할 수 있음;소스를 보호하려면
.dart소스를 배포하지 않고 컴파일된 바이너리 스냅샷(Snapshot)만 배포해야 함.Snapshot은 Dart 컴파일 결과 바이너리 파일로, 역컴파일로 완전한 읽을 수 있는 소스를 복구할 수 없고 공개 API만 호출 가능.
해당 내용은 다른 강의에서 상세 설명.
part 파일 분할
단일 라이브러리를 여러 파일로 나누어 비공개 변수 공유
하나의 라이브러리를 여러 파일로 분리하고 밑줄 붙은 비공개 식별자를 공유. 반드시 part 'xxx.dart' / part of '메인파일.dart' 쌍으로 작성해야 함.
main_lib.dart (메인 라이브러리 파일)
library; // 이 파일이 라이브러리임 선언
part 'logic.dart'; // logic.dart를 현재 라이브러리에 합침
int _secret = 999; // 라이브러리 전용 변수
Code language: JavaScript (javascript)
logic.dart (분할 보조 파일)
part of 'main_lib.dart'; // 본 파일이 main_lib.dart 소속이며 독립 라이브러리가 아님을 선언
void printSecret() {
// 메인 파일의 _secret에 접근 가능, 같은 라이브러리 내 비공개 내용 공유
print(_secret);
}
Code language: JavaScript (javascript)
호출 방식
import 'main_lib.dart'; // 메인 라이브러리만 불러오고 분할 파일은 직접 불러오지 않음
void main() {
printSecret(); // 출력 999
}
Code language: JavaScript (javascript)
조건부 불러오기
실행 플랫폼에 따라 자동으로 구현 파일 전환
import 'platform_stub.dart'
if (dart.library.io) 'platform_mobile.dart'
if (dart.library.js_interop) 'platform_web.dart';
Code language: JavaScript (javascript)