Dart 치트시트 — 간결한 레퍼런스
Dart 3 문법, 타입 시스템, 비동기, 가장 자주 쓰이는 표준 라이브러리를 모은 치트시트로, 일상 작업의 약 80%를 다룹니다.
Dart Dart 3
Dart SDK · 객체 지향 · 제네릭 · 함수형 · 비동기 우선 · 정적(건전한 null 안전성)
추천 학습 경로
먼저 dart create/run과 pubspec 구조를 익히고 → 변수, 타입, 제어 흐름을 익히고 → 함수, 문자열, 컬렉션을 깊이 파고 → 클래스, mixin, 에러 처리를 이해하고 → isolate와 async/await로 동시성을 다루고 → 이후 필요에 따라 네트워크, 시간, 프로세스, 정규식, 빌드/테스트를 배우는 순서입니다. FAQ 챕터는 나중에 함정을 피할 때 다시 보면 좋습니다.
1.Hello World와 실행 환경
최소 프로그램, dart create/run, 그리고 프로젝트 구조.
최소 프로그램
모든 Dart 프로그램은 void main() 진입 함수에서 시작합니다. dart run이 실행하며, print가 표준 출력으로 출력합니다.
생성과 실행
dart create가 표준 프로젝트 골격을 만들고, dart run이 진입 파일을 직접 실행합니다. 개발 단계에는 JIT 핫 리로드를, 배포 시에는 AOT 컴파일을 사용합니다.
프로젝트 구조
pubspec.yaml에 패키지명, 의존성, SDK 버전을 선언합니다. 코드는 lib/와 bin/에, 테스트는 test/에 둡니다.
print 출력
print는 stdout으로 출력하고 줄바꿈을 붙입니다. $는 변수를, ${식}은 복잡한 식을 문자열에 삽입합니다.
커맨드라인 인수
main은 List<String> args를 받을 수 있습니다. args[0]부터가 커맨드라인의 실제 인수이며, 프로그램 이름은 포함되지 않습니다.
비동기 main 함수
main은 Future<void>일 수 있으며, 프로그램은 모든 await가 끝날 때까지 기다린 뒤 종료합니다. 시간이 걸리는 작업에 자주 쓰입니다.
주석
//는 한 줄 주석, ///는 문서 주석(dart doc에서 사용), /* */는 블록 주석입니다. 주석은 실행에 영향을 주지 않습니다.
최상위 멤버
Dart는 클래스 밖에 최상위 함수와 변수를 둘 수 있습니다. import로 라이브러리를 가져오고, 최상위 변수는 파일 간 공유됩니다.
2.변수와 상수
변수 선언, final/const, null 안전성, 그리고 구조 분해.
var와 final
var는 재할당 가능하지만 타입 추론은 고정됩니다. final은 한 번만 대입할 수 있으며 이후 변경할 수 없습니다.
const 상수
const는 컴파일 시점 상수로, 컴파일 시 값이 확정되어야 합니다. const 값은 정형화되어 같은 상수는 한 인스턴스만 존재합니다.
명시적 타입
변수에 타입을 명시할 수 있습니다. 정적 타입은 컴파일 시 검사에 유용하며, 공개 API에는 명시를 권장합니다.
null 허용 변수
건전한 null 안전성에서 기본은 null 불허입니다. 타입 뒤에 ?를 붙여 null 허용을 선언하고, 사용 전 null 체크 또는 ?? 기본값을 사용하세요.
late 지연 초기화
late는 처음 접근할 때까지 초기화를 미룹니다. late final은 한 번만 대입 가능하며 런타임 환경에 의존하는 필드에 적합합니다.
구조 분해 할당
Dart 3는 레코드와 패턴 구조 분해를 지원하여 컬렉션 요소를 한 번에 여러 변수에 대입합니다. 모양이 일치해야 합니다.
스코프와 섀도잉
변수는 선언된 블록에서 보이고, 안쪽에서 바깥쪽의 같은 이름 변수를 가릴 수 있습니다. 최상위 변수는 라이브러리 전체에서 보입니다.
dynamic과 Object
dynamic은 정적 검사를 건너뛰고 런타임에 타입이 정해집니다. Object는 모든 클래스의 부모 타입으로 명시적 캐스팅이 필요합니다.
3.데이터 타입
내장 타입, 컬렉션 타입, 레코드, 그리고 열거형.
숫자 타입
int는 정수, double은 부동소수, num은 둘의 부모 타입입니다. int 리터럴은 double에 대입할 수 있습니다.
문자열 타입
String은 불변의 UTF-16 시퀀스입니다. 작은따옴표와 큰따옴표는 동등하며, 보간과 여러 줄 문자열을 지원합니다.
불리언 타입
bool은 true와 false만 가집니다. 조건식은 반드시 bool을 반환하며 숫자의 암묵적 변환은 없습니다.
리스트 타입
List는 순서가 있는 컬렉션이며 제네릭을 지원합니다. 리터럴 [a, b]로 만들고 기본은 확장 가능합니다.
집합과 맵
Set은 순서 없는 중복 불허 집합이고, Map은 키-값 컬렉션입니다. 둘 다 제네릭과 리터럴 문법을 가집니다.
레코드 타입
Dart 3의 레코드는 이름 없는 경량 집계 타입입니다. 필드 이름을 가질 수 있고 패턴 구조 분해와 함께 사용할 수 있습니다.
열거형
enum은 한정된 이름 있는 상수 집합을 정의합니다. 강화 열거형(Dart 2.17+)은 필드와 메서드를 가질 수 있습니다.
타입 변환
int.parse / double.parse는 문자열을 숫자로 변환하고, toString은 다시 문자열로 되돌립니다. as는 런타임 타입 변환을 수행합니다.
4.참조와 null 안전성
객체 참조, null 안전성, 깊은 복사, 그리고 네이티브 메모리.
객체 참조
Dart에는 날 포인터가 없으며 변수는 객체 참조를 보관합니다. 대입은 참조만 복사하고, 여러 변수가 같은 객체를 가리킬 수 있습니다.
null 안전성
건전한 null 안전성은 null이 String? 같은 null 허용 타입에만 나타나도록 합니다. 컴파일러가 비-null을 컴파일 시 보장합니다.
null 단언 !
null 허용 식 뒤에 !를 붙여 null이 아님을 단언하며, 실패 시 null 체크 예외가 발생합니다. 확실할 때만 사용하세요.
null 병합
??는 왼쪽이 null일 때 오른쪽을 반환합니다. ??=는 변수가 null일 때만 대입합니다.
late와 const
final은 런타임에 한 번 대입하고, const는 컴파일 시점 상수입니다. late의 지연 초기화는 큰 객체와 순환 의존에 적합합니다.
참조와 동등성
==는 기본적으로 참조 비교이며, identical()은 같은 인스턴스인지 판정합니다. 구조적 동등성에는 도우미 함수를 사용하세요.
깊은 복사와 얕은 복사
얕은 복사는 최상위만 복제하고 깊은 객체는 공유됩니다. 깊은 복사는 모든 계층을 복제하며, 불변 컬렉션은 공유해도 안전합니다.
네이티브 메모리
dart:ffi는 Pointer와 calloc을 제공하여 C 라이브러리와의 상호 운용을 위한 네이티브 메모리에 접근합니다. 포인터 수명은 개발자가 관리합니다.
5.제어 흐름
if, 반복문, switch, 그리고 패턴 매칭.
if / else
if / else if / else는 조건에 따라 분기합니다. 조건은 bool이어야 하며, null 체크는 타입 승격을 일으킵니다.
삼항 연산자
조건 ? 참 : 거짓 은 단일 식 분기입니다. ??와 함께 null 기본값 처리에 사용됩니다.
for 반복문
for의 고전적인 세 부분 형태와, for-in으로 Iterable을 순회합니다. Dart 3에서는 루프 변수의 패턴 구조 분해도 지원합니다.
while 반복문
while은 먼저 판정 후 실행, do-while은 최소 한 번 실행 후 판정합니다. 반복 횟수를 모르는 루프에 적합합니다.
switch 표현식
Dart 3의 switch 표현식은 값을 반환합니다. case 뒤에는 패턴이 오고, =>로 결과를 주며 break가 필요 없습니다.
switch 문
switch 문은 case에 따라 분기합니다. 빈 case의 fall-through, 가드, 패턴을 지원합니다. 비어있지 않은 분기는 break가 필요합니다.
패턴 매칭
if-case와 switch는 값에 대해 구조 매칭을 수행합니다. 객체 패턴, 레코드 패턴, 가드를 조합해 사용할 수 있습니다.
break와 continue
break는 현재 루프를 빠져나오고, continue는 다음 반복으로 이동합니다. 라벨로 중첩 루프의 점프 대상을 제어할 수 있습니다.
6.함수와 람다
함수 정의, 선택적 매개변수, 클로저, 그리고 비동기 함수.
함수 정의
함수는 반환 타입, 이름, 매개변수, 본문으로 구성됩니다. 반환 값이 없는 함수는 void를 사용합니다.
애로우 함수
단일 식 본문은 =>로 간결히 쓸 수 있으며 그 식의 값을 반환합니다. 순수 함수와 콜백에 적합합니다.
선택적 위치 매개변수
대괄호 []는 선택적 위치 매개변수이며 생략 시 기본값 또는 null입니다. 기본값은 컴파일 시점 상수여야 합니다.
이름 있는 매개변수
중괄호 {}는 이름 있는 매개변수이며 호출 시 이름으로 값을 전달합니다. required를 붙이면 반드시 전달해야 합니다.
고차 함수
함수는 일급 시민으로 인수로 전달하거나 반환값으로 돌려줄 수 있습니다. map / where / fold는 컬렉션의 대표적 고차 함수입니다.
클로저
클로저는 정의 환경의 변수를 캡처합니다. 바깥 함수가 반환된 뒤에도 클로저는 그 변수에 접근하고 수정할 수 있습니다.
비동기 함수
async 함수는 Future를 반환하며 내부에서 await로 비동기 결과를 기다립니다. await는 async 함수에서만 사용할 수 있습니다.
제너레이터
sync*는 지연 Iterable을, async*는 Stream을 생성합니다. yield는 값을 하나씩 내보내고, yield*는 다른 제너레이터에 위임합니다.
7.문자열
리터럴, 보간, 부분 문자열, 인코딩, 그리고 포매팅.
문자열 리터럴
작은따옴표와 큰따옴표 모두 문자열입니다. 역슬래시로 이스케이프하며, r 접두사는 로 문자열을 뜻합니다.
문자열 보간
$변수와 ${식}으로 값을 문자열에 삽입합니다. 어떤 객체든 toString이 호출됩니다.
여러 줄 문자열
세 개의 작은따옴표 '''는 여러 줄 문자열을 만들며 줄바꿈과 들여쓰기를 그대로 유지합니다.
자주 쓰는 메서드
contains / startsWith로 포함 여부를 판정하고, replaceAll로 치환, toUpperCase / toLowerCase로 대소문자를 변환합니다.
부분 문자열과 검색
substring은 인덱스로 부분 문자열을 잘라내고, indexOf는 위치를 찾으며, split은 구분자로 리스트를 만듭니다.
문자와 인코딩
Dart 문자열은 UTF-16이며 codeUnits는 코드 단위, runes는 코드 포인트를 반환합니다. 이모지는 runes가 필요합니다.
효율적인 연결
반복문 안에서 문자열을 연결하면 임시 객체가 많이 생성됩니다. StringBuffer로 누적한 뒤 한 번에 문자열로 만듭니다.
포맷과 파싱
toStringAsFixed는 소수 자릿수를 고정하고, padLeft는 자릿수를 채우며, int.parse / double.parse는 숫자 문자열을 파싱합니다.
8.컬렉션
리스트, 맵, 집합 연산, 그리고 정렬.
리스트 연산
add는 추가, insert는 삽입, remove는 삭제, sort는 정렬입니다. 기본 List는 가변이며 확장 가능합니다.
리스트 고차 함수
map은 변환, where는 필터, reduce / fold는 집계, expand는 평탄화입니다. 반환되는 Iterable은 대개 지연입니다.
스프레드 연산자
...는 컬렉션의 요소를 리터럴에 펼칩니다. ...?는 소스가 null일 때 안전하게 건너뜁니다.
컬렉션 내 if/for
컬렉션 리터럴 안에서 if로 조건부 포함, for로 일괄 생성이 가능합니다. Dart 3은 패턴 구조 분해도 지원합니다.
맵 연산
Map의 키/값/엔트리를 순회할 수 있습니다. putIfAbsent는 지연 채움, update는 갱신, remove는 삭제입니다.
집합 연산
Set은 요소의 유일성을 보장합니다. union / intersection / difference로 집합 연산을 하고, toSet으로 리스트의 중복을 제거합니다.
정렬과 검색
sort는 기본 오름차순이며 비교자를 전달할 수 있습니다. indexOf는 선형 탐색, contains는 존재 여부 판정입니다.
읽기 전용 컬렉션
List.unmodifiable은 읽기 전용 리스트를 만들고 수정 시 UnsupportedError를 던집니다. List.of는 가변 리스트를 복사합니다.
9.메모리와 성능
가비지 컬렉션, const 정규화, 그리고 버퍼 재사용.
가비지 컬렉션
Dart VM이 가비지 컬렉션을 자동으로 수행하므로 메모리를 직접 해제할 필요가 없습니다. 객체는 더 이상 참조되지 않으면 회수됩니다.
const 정형화
const 값은 정형화되어 같은 상수는 한 인스턴스만 존재합니다. 핫 패스에는 const 활용으로 중복 할당을 줄이세요.
지연 초기화
최상위 변수와 static 변수는 처음 접근할 때 지연 초기화됩니다. late도 동일한 지연 의미를 제공합니다.
리스트 용량
가변 리스트는 필요 시 확장되며 잦은 add는 여러 번 재할당합니다. 크기를 알면 미리 할당하세요.
버퍼 재사용
Uint8List 등 typed-data는 바이너리 버퍼에 적합합니다. 버퍼 재사용과 StringBuffer로 잦은 할당을 피하세요.
약한 연결
Expando는 객체 자체를 수정하지 않고 데이터를 부착하며 키가 약 참조입니다. WeakReference는 회수를 방해하지 않습니다.
객체 수명 주기
객체는 isolate 별 독립 힙에 만들어집니다. isolate 간에는 가변 객체를 공유할 수 없으며 복사나 메시지로 전달합니다.
네이티브 메모리
C와 상호 운용할 때 dart:ffi로 네이티브 메모리를 할당합니다. 수동으로 해제해야 하며, 그렇지 않으면 누수가 발생합니다.
10.객체 지향
클래스, 상속, mixin, 그리고 인터페이스.
클래스와 생성자
class는 객체 청사진을 정의합니다. 생성자는 클래스명과 같으며, this. 매개변수로 필드에 직접 대입할 수 있습니다.
상속
extends는 부모를 상속하고, @override는 메서드를 재정의하며, super는 부모 구성 요소에 접근합니다. Dart는 단일 상속입니다.
mixin
mixin은 재사용 가능한 동작 조각으로 with로 섞어 사용합니다. 상속보다 유연하며 단일 상속의 제약을 피합니다.
추상 클래스
abstract class는 인스턴스화할 수 없으며 계약만 정의합니다. 서브클래스는 추상 메서드를 구현해야 합니다.
인터페이스
모든 클래스는 암묵적으로 인터페이스이기도 하며 implements로 구현합니다. 모든 멤버를 재정의해야 합니다.
접근자
get은 읽기 전용 접근자, set은 쓰기 가능 접근자를 정의합니다. 괄호 없이 호출되며 내부 저장을 숨길 수 있습니다.
정적 멤버
static 멤버는 인스턴스가 아닌 클래스 자체에 속합니다. static 메서드는 인스턴스 멤버에 접근할 수 없습니다.
sealed 클래스
sealed 클래스는 서브클래스를 같은 라이브러리로 제한하여 switch를 default 없이도 완전 매칭할 수 있게 합니다. Dart 3 기능입니다.
11.에러 처리
try/catch, 커스텀 예외, 그리고 비동기 에러.
try / catch
try는 예외 가능 코드를 감싸고, catch가 예외를 잡습니다. catch (e)로 예외 객체를 얻습니다.
on 절
on 절은 특정 타입의 예외만 잡으며 catch와 함께 쓰입니다. 타입별로 분기 처리합니다.
finally와 rethrow
finally는 예외 발생 여부와 무관하게 실행되어 자원 정리에 적합합니다. rethrow는 원래 스택을 유지한 채 다시 던집니다.
예외 던지기
throw 키워드는 예외 객체를 던집니다. 무엇이든 던질 수 있지만, 관례적으로 Exception이나 Error의 서브클래스를 던집니다.
사용자 정의 예외
Exception을 implements하여 비즈니스 예외를 정의합니다. toString을 재정의해 친절한 메시지를 주고 구조화된 필드를 담을 수 있습니다.
비동기 에러
async 함수에서 await가 던진 예외는 try/catch로 잡을 수 있습니다. 처리되지 않은 Future 에러는 조용히 사라집니다.
스트림 에러
Stream을 listen할 때 onError 콜백으로 에러를 처리합니다. StreamController.addError로 스트림에 에러를 주입할 수 있습니다.
단언
assert는 개발 모드에서 조건을 검사하며 실패 시 AssertionError를 던집니다. 릴리스 빌드에서는 제거됩니다.
12.파일과 I/O
파일 읽기/쓰기, JSON, 그리고 표준 입출력.
파일 읽기
dart:io의 File 클래스로 파일을 읽고 씁니다. readAsString으로 텍스트 파일 전체를 읽으며, import 'dart:io'가 필요합니다.
파일 쓰기
writeAsString은 텍스트, writeAsBytes는 바이너리를 씁니다. 추가 모드는 mode 매개변수로 지정합니다.
줄 단위 읽기
readAsLines은 파일을 줄 단위 리스트로 나눕니다. 큰 파일은 openRead로 스트림 처리하여 통째로 읽지 않습니다.
JSON 처리
dart:convert의 jsonEncode / jsonDecode로 직렬화와 역직렬화를 합니다. JSON 숫자는 int 또는 double로 파싱됩니다.
표준 입출력
stdin.readLineSync으로 한 줄을 동기적으로 읽고, stdout.writeln으로 출력합니다. CLI 대화에 적합합니다.
디렉터리 연산
Directory.list로 디렉터리 내용을 순회하고, create로 만들고, delete로 지웁니다. 반환은 FileSystemEntity입니다.
바이너리 바이트
readAsBytes로 바이너리를 읽고 Uint8List로 표현하며 writeAsBytes로 씁니다. 이미지나 오디오에 적합합니다.
경로 연산
File / Directory의 path 프로퍼티가 전체 경로를 줍니다. absolute는 절대 경로, uri는 file:// 형식으로 변환합니다.
13.자주 하는 실수
Dart 일상 개발에서 가장 많이 빠지는 함정과 올바른 작성법.
null 단언 남용
!로 null 체크를 우회하면 런타임 크래시가 나기 쉽습니다. null 체크, ??, 타입 승격이 더 안전합니다.
컬렉션 == 비교
List / Map의 ==는 참조 비교이며 내용이 같아도 동등하지 않습니다. 구조 비교는 도우미 함수를 사용하세요.
const와 final
const는 컴파일 시점 상수여야 하고, final은 런타임에 정해집니다. 런타임 값을 const로 쓰면 컴파일이 실패합니다.
지연 Iterable
map / where는 지연 Iterable을 반환하며 순회 시 다시 계산되어 원본 변화가 결과에 반영됩니다. 스냅샷은 toList로 만드세요.
await 빠뜨리기
async 함수를 await하지 않으면 Future가 반환되며 결과가 아닙니다. 병렬 실행은 Future.wait를 사용하세요.
캐스케이드는 수신자를 반환
.. 캐스케이드는 같은 객체에 연속 호출하며 마지막 식의 값이 아닌 수신자를 반환합니다. 결과 값이 필요하면 캐스케이드를 쓰지 마세요.
순회 중 수정
순회 중 요소를 추가/삭제하면 ConcurrentModificationError가 발생합니다. removeWhere 또는 수집 후 처리하세요.
문자열의 코드 단위
length는 UTF-16 코드 단위 수이므로 한자나 이모지는 글자 수보다 큽니다. 글자 단위 처리는 runes를 순회하세요.
14.동시성과 비동기
isolate, Future, Stream, 그리고 이벤트 루프.
아이솔레이트 동시성
isolate는 Dart의 동시성 단위로 각각 독립 메모리와 이벤트 루프를 가집니다. Isolate.run 또는 Isolate.spawn으로 시작합니다.
spawn과 포트
Isolate.spawn은 진입 함수로 새 isolate를 시작하며, SendPort가 송신, ReceivePort가 수신을 담당합니다.
Future 기초
Future는 미래에 완료되는 결과를 나타냅니다. Future.value로 즉시 성공시키고, await로 완료를 기다립니다.
async / await
async는 비동기 함수를 표시하고, await는 비동기 작업을 기다립니다. await는 async 함수에서만 사용할 수 있습니다.
Stream
Stream은 비동기 이벤트 시퀀스입니다. listen으로 구독하고 await for로 순차 처리합니다. Future의 1회성과 다릅니다.
StreamController
StreamController로 수동 제어하며, add는 데이터, addError는 에러, close는 종료를 뜻합니다. broadcast는 다중 구독을 지원합니다.
여러 Future 기다리기
Future.wait는 모두 완료를, Future.any는 가장 빠른 완료를 기다립니다.
Completer
Completer로 Future 완료 시점을 수동 제어할 수 있어, 콜백 스타일 API를 async/await 스타일로 감쌀 때 유용합니다.
15.네트워크
HTTP 요청, WebSocket, 그리고 TCP 소켓.
HTTP 클라이언트
dart:io의 HttpClient로 HTTP 요청을 보냅니다. getUrl로 요청 객체를 얻고 close한 뒤 본문을 읽습니다.
package:http
package:http는 일반적인 요청을 감쌉니다. http.get / http.post는 Response를 반환하며 body는 그대로 문자열입니다.
URI 파싱
Uri.parse로 URL을 파싱하고, queryParameters로 쿼리를 읽으며, Uri.http로 요청 URL을 구성합니다.
JSON API
JSON API를 호출하고 jsonDecode로 응답 본문을 파싱합니다. package:http와 Future를 함께 사용합니다.
WebSocket
WebSocket은 전이중 통신입니다. WebSocket.connect로 연결하고, add로 송신, 스트림으로 수신합니다.
TCP 소켓
Socket.connect로 TCP 연결을 맺고 요청을 쓰며 응답을 읽습니다. 저수준 프로토콜과 커스텀 서비스에 적합합니다.
HTTP 서버
HttpServer.bind로 로컬 서버를 띄우고 요청을 받아 응답합니다. 개발/디버깅과 도구에 적합합니다.
타임아웃과 에러
네트워크 요청은 타임아웃이나 실패가 있을 수 있습니다. .timeout으로 제한하고 try/catch로 예외를 처리하세요.
16.시간과 날짜
DateTime, Duration, 포매팅, 그리고 타임스탬프.
현재 시각
DateTime.now()로 현재 로컬 시각을 얻습니다. 각 필드에 직접 접근 가능하며 밀리초도 얻을 수 있습니다.
시각 생성
DateTime(년, 월, 일, ...)로 지정 시각을 만들고, DateTime.utc로 UTC 시각을 만듭니다.
Duration
Duration은 시간의 길이를 나타내며 시/분/초/마이크로초를 지원합니다. 사칙연산, 비교, 단위 변환이 가능합니다.
포맷 출력
Dart에는 내장 strftime가 없어 padLeft로 0 패딩하거나 intl 패키지의 DateFormat를 사용합니다.
시각 파싱
DateTime.parse는 ISO 형식 문자열을 파싱합니다. toIso8601String은 표준 형식을 생성해 파싱과 전송을 쉽게 만듭니다.
시각 연산
add / subtract로 Duration을 가감하고, difference로 두 시각의 차이를 Duration으로 구합니다.
타임스탬프
밀리초/마이크로초 타임스탬프는 저장과 정렬에 편리합니다. fromMillisecondsSinceEpoch으로 시각을 복원합니다.
시간대
DateTime은 기본이 로컬 시간대입니다. isUtc로 판정하고 toUtc / toLocal로 변환합니다. 저장은 UTC를 권장합니다.
스톱워치
Stopwatch는 코드 실행 시간을 측정합니다. start / stop / reset으로 제어하며 elapsed로 경과 시간을 얻습니다.
17.프로세스와 환경
서브프로세스, 환경 변수, 표준 스트림, 그리고 시그널.
자식 프로세스 실행
Process.run은 외부 명령을 실행하고 종료를 기다립니다. result.stdout / stderr가 출력을 담습니다.
스트리밍 프로세스
Process.start는 프로세스를 시작하자마자 반환하며 stdout을 실시간으로 읽고 stdin을 쓸 수 있습니다. 장기 실행 작업에 적합합니다.
환경 변수
Platform.environment은 환경 변수를 읽기 전용 Map으로 반환합니다. 없는 키는 null입니다.
종료 코드
exitCode로 종료 코드를 설정합니다. 0이 성공, 그 외는 실패 유형이며 셀이 이를 기준으로 판단합니다.
인수와 스크립트
args는 커맨드라인 인수, Platform.script는 진입 스크립트 경로, Directory.current는 현재 작업 디렉터리입니다.
표준 스트림
stdout / stderr는 출력, stdin은 입력입니다. flush로 버퍼를 비우고 stderr는 일반 파이프 출력에 포함되지 않습니다.
파일 시스템
File / Directory가 파일 시스템을 다룹니다. create로 생성, delete로 삭제, rename으로 이동, exists로 존재 판정.
시그널 처리
ProcessSignal로 시스템 시그널(SIGINT / SIGTERM)에 응답합니다. 우아한 종료와 정리용으로 사용됩니다.
18.정규 표현식
RegExp의 매칭, 치환, 분할, 그리고 그룹.
생성과 판정
RegExp는 정규 표현식을 나타냅니다. hasMatch로 존재 여부를 판정합니다. r 접두사로 이스케이프를 피합니다.
첫 번째 매칭
firstMatch는 첫 매칭을 반환합니다. group은 그룹, start / end는 위치를 알려주며 매칭이 없으면 null입니다.
모든 매칭
allMatches는 모든 매칭의 이터레이터를 반환합니다. 패턴과 결합해 조건에 맞는 내용을 추출할 수 있습니다.
치환
replaceAll은 모두 치환, replaceFirst는 첫 항목만 치환합니다. 콜백으로 동적 치환 문자열을 생성할 수 있습니다.
분할
String.split은 RegExp를 받아 패턴으로 분할합니다. 구분자 자체는 결과에 들어가지 않습니다.
캡처 그룹
괄호는 캡처 그룹을 정의합니다. group(n)으로 접근하고, (?<name>...)로 이름 있는 그룹을 정의해 namedGroup으로 참조합니다.
플래그
RegExp 생성자 두 번째 인수로 플래그를 설정합니다. caseSensitive, multiLine, dotAll, unicode 등이 있습니다.
자주 쓰는 패턴
이메일, 휴대폰, URL, IP 같은 흔한 검증 패턴을 재사용 가능한 상수로 두면 유지보수가 쉬워집니다.
19.빌드와 디버깅
pub, 정적 검사, 포매팅, 그리고 테스트.
pubspec 설정
pubspec.yaml은 패키지 설정 파일로 이름, 버전, SDK, 의존성을 선언합니다. dart pub get으로 의존성을 해소합니다.
pub 명령
dart pub get으로 설치, upgrade로 갱신, outdated로 점검, add / remove로 의존성을 관리합니다.
정적 분석
dart analyze는 코드를 정적으로 분석해 오류와 경고를 보고합니다. CI에서 실행해 품질을 보장하세요.
포맷
dart format은 코드 스타일을 통일합니다. 들여쓰기, 따옴표, 줄바꿈을 자동으로 정리하며 팀 작업에 필수입니다.
단위 테스트
package:test가 test()와 expect를 제공합니다. dart test로 실행하며 테스트는 test/ 디렉터리에 둡니다.
컴파일과 배포
dart compile은 실행 파일을 생성합니다. exe는 네이티브, js는 JavaScript, aot-snapshot은 AOT 스냅샷입니다.
lint 규칙
analysis_options.yaml에서 lint 규칙을 설정합니다. lints 패키지가 권장 규칙 집합을 제공합니다.
디버깅
print 디버깅이 가장 흔합니다. assert로 불변식을 검증하고 IDE 중단점으로 단계별 실행이 가능합니다.
이 치트시트에 대해
이 페이지는 Dart 3의 자족형 치트시트로, 언어 핵심과 가장 자주 쓰이는 표준 라이브러리가 실제 프로젝트의 약 80% 사용 사례를 다룹니다. 현대적 관용구를 중심으로 정리했습니다 — 건전한 null 안전성, 레코드와 패턴, switch 표현식, sealed 클래스, 캐스케이드 연산자, 그리고 isolate 기반 동시성 모델. Dart는 Google이 설계했고 Flutter의 기반 언어로, JIT의 빠른 개발과 AOT의 효율적 배포를 모두 지원합니다. 권위 있는 레퍼런스는 공식 Dart 언어 투어와 Effective Dart를 참고하세요. 19개 챕터가 각각 한 주제를 다룹니다 — 첫 프로그램부터 isolate, 흔한 함정, 빌드와 테스트까지. 각 챕터는 8개의 짧은 예제(각 5~15줄)로 나뉘며, 총 약 152개의 토픽을 제공합니다. 스니펫은 의도적으로 짧고 자기 설명적으로 작성되었으며, 주석은 중국어 원문 그대로 둡니다. 모든 처리는 브라우저에서 이루어집니다 — 업로드나 추적이 없습니다. 본 페이지는 GuruToolkit의 무료 개발자 도구 모음의 일부이며, 스니펫은 어떠한 보증 없이 자유롭게 사용할 수 있습니다.
버전 2.1.0