Dart 치트시트
마지막 업데이트
Hello World 및 프로그램 구조
모든 Dart 프로그램은 최상위 main 함수에서 시작합니다.
| 작업 | 문법 |
|---|---|
| 진입점 | void main() { ... } |
| 한 줄 출력 | print("Hello, World!"); |
| 문자열 보간 | print("Hi $name"); |
| 보간 안의 표현식 | print("Sum: ${a + b}"); |
| 주석 | // this is a comment |
| 여러 줄 주석 | /* ... */ |
| 라이브러리 임포트 | import 'dart:math'; |
| 파일 실행 | dart run main.dart |
변수 및 타입
Dart는 정적 타입이지만 var로 타입을 추론할 수 있습니다.
| 작업 | 문법 |
|---|---|
| 추론된 변수 | var age = 30; |
| 명시적 타입 | int age = 30; |
| 컴파일 타임 상수 | const pi = 3.14; |
| 런타임 상수 | final name = getName(); |
| 기본 타입 | int, double, String, bool |
| 동적 타입 | dynamic x = 5; |
| 타입 변환 | int.parse("42"), n.toString() |
| 타입 확인 | x is String, x as String |
널 안전성
타입은 기본적으로 널이 될 수 없으며, ?를 붙이면 null을 허용합니다.
| 작업 | 문법 |
|---|---|
| 널 불가 (기본) | int count = 0; |
| 널 허용 타입 | String? name; |
| 널 인식 접근 | user?.name |
| 널 병합 | name ?? "default" |
| 널 병합 대입 | name ??= "default"; |
| 널 아님 단언 | name! |
| 지연 초기화 | late String value; |
| 널 인식 스프레드 | [...?maybeList] |
문자열
문자열은 작은따옴표, 큰따옴표, 삼중 따옴표를 지원합니다.
| 작업 | 문법 |
|---|---|
| 길이 | s.length |
| 대문자 / 소문자 | s.toUpperCase(), s.toLowerCase() |
| 보간 | "Total: $price" |
| 연결 | "foo" + "bar" |
| 포함 여부 | s.contains("ell") |
| 시작 / 끝 여부 | s.startsWith("he") |
| 분할 | "a,b,c".split(",") |
| 치환 | s.replaceAll("a", "b") |
| 부분 문자열 | s.substring(0, 3) |
| 공백 제거 | s.trim() |
컬렉션 (List, Map, Set)
리터럴 문법을 가진 세 가지 핵심 컬렉션 타입.
| 작업 | 문법 |
|---|---|
| 리스트 리터럴 | var nums = [1, 2, 3]; |
| 리스트에 추가 | nums.add(4); |
| 접근 / 길이 | nums[0], nums.length |
| map / where | nums.map((n) => n * 2), nums.where((n) => n > 1) |
| 맵 리터럴 | var ages = {"Ada": 30}; |
| 맵 접근 | ages["Ada"] |
| 셋 리터럴 | var ids = {1, 2, 3}; |
| 스프레드 연산자 | var all = [...a, ...b]; |
| 컬렉션 if / for | [if (show) 1, for (n in xs) n] |
제어 흐름
조건은 괄호 안에 들어가며, switch는 패턴을 지원합니다.
| 작업 | 문법 |
|---|---|
| if / else | if (x > 0) { ... } else { ... } |
| 삼항 연산자 | var r = x > 0 ? "pos" : "neg"; |
| switch | switch (n) { case 1: ...; default: ... } |
| for 반복문 | for (var i = 0; i < 10; i++) { ... } |
| for-in 반복문 | for (var item in items) { ... } |
| forEach | items.forEach((x) => print(x)); |
| while 반복문 | while (x < 100) { ... } |
| do-while | do { ... } while (x < 100); |
| break / continue | break;, continue; |
함수
함수는 일급이며, 화살표 문법은 단일 표현식을 짧게 만듭니다.
| 작업 | 문법 |
|---|---|
| 함수 정의 | int add(int a, int b) { return a + b; } |
| 화살표 함수 | int square(int x) => x * x; |
| 선택적 위치 인자 | void log(String m, [int? code]) { ... } |
| 명명된 매개변수 | void box({int w = 0, int h = 0}) { ... } |
| 필수 명명 인자 | void box({required int w}) { ... } |
| 익명 함수 | var f = (x) => x * 2; |
| 인자로 전달 | nums.map((n) => n * 2) |
| typedef | typedef IntOp = int Function(int); |
클래스 및 생성자
클래스는 상태와 동작을 담고, 생성자는 여러 형태로 옵니다.
| 작업 | 문법 |
|---|---|
| 클래스 정의 | class Point { int x; int y; } |
| 생성자 | Point(this.x, this.y); |
| 명명된 생성자 | Point.origin() : x = 0, y = 0; |
| 인스턴스 생성 | var p = Point(1, 2); |
| 메서드 | double dist() { ... } |
| 게터 | int get area => w * h; |
| 상속 | class Circle extends Shape { ... } |
| super 호출 | super(args) |
| 추상 클래스 | abstract class Shape { ... } |
| 인터페이스 구현 | class Dog implements Animal { ... } |
비동기 (Future / async-await)
future는 나중에 사용할 수 있는 값을 나타내고, await는 그것이 완료될 때까지 멈춥니다.
| 작업 | 문법 |
|---|---|
| async 함수 | Future<int> load() async { ... } |
| future await | var data = await load(); |
| 값 반환 | async 함수 안의 return 42; |
| 지연 | await Future.delayed(Duration(seconds: 1)); |
| 오류 처리 | try { await load(); } catch (e) { ... } |
| then 체이닝 | load().then((v) => print(v)); |
| 병렬 실행 | await Future.wait([a(), b()]); |
| 비동기 스트림 | await for (var x in stream) { ... } |
가장 자주 쓰는 Dart 문법을 한 페이지에 담았습니다. 이 Dart 치트시트는 언어 핵심을 위한 빠른 참조 자료입니다 - 변수와 타입, 널 안전성, 문자열, 컬렉션, 제어 흐름, 함수, 클래스, 그리고 Flutter 뒤편의 앱을 작성하는 데 쓰는 future와 async/await를 다룹니다.
여기 나오는 모든 내용은 표준 Dart이며 공식 SDK에서 실행됩니다. 필요한 것을 복사하거나, Dart 플레이그라운드에서 모든 코드를 바로 실행해 보세요 - 설치가 필요 없습니다.
Dart 치트시트 자주 묻는 질문
이 Dart 치트시트는 무료인가요?
네. 이 Dart 치트시트는 완전히 무료이며 회원 가입이 필요 없습니다. 즐겨찾기에 추가해 두고 널 안전성 연산자, 컬렉션 메서드, 비동기 패턴을 찾아봐야 할 때마다 다시 방문하세요.
Dart에서 널 안전성은 어떻게 동작하나요?
Dart에서는 모든 타입이 기본적으로 널이 될 수 없습니다 -
int count는 절대 null을 담을 수 없습니다. null을 허용하려면 ?를 붙이며(String? name), 그러면 컴파일러가 null 경우를 처리하도록 강제합니다. 도우미들이 이를 간결하게 해줍니다: 널 인식 접근의 ?., 대체 값의 ??, 확신할 때 값이 널이 아님을 단언하는 !. 이를 통해 null 오류를 런타임이 아닌 컴파일 시점에 잡습니다.Future란 무엇이며 async와 await는 어떻게 동작하나요?
Future는 네트워크 호출의 결과처럼 나중에 사용할 수 있는 값을 나타냅니다. 함수에 async를 표시하면 await를 사용할 수 있는데, await는 future가 완료될 때까지 실행을 멈춘 다음 값을 줍니다 - 그래서 동기 코드처럼 위에서 아래로 읽히는 비동기 코드를 작성하게 됩니다. 오류를 처리하려면 await를 try/catch로 감싸세요.Dart를 온라인에서 연습할 수 있나요?
네. Dart 플레이그라운드를 열어 이 치트시트의 어떤 코드든 브라우저에서 실행해 보세요 - SDK를 설치할 필요가 없습니다. 체계적으로 배우고 싶다면, Coddy의 무료 인터랙티브 Dart 강좌가 널 안전성과 컬렉션부터 클래스와 async/await까지 단계별로 안내합니다.
이 치트시트는 초보자에게 적합한가요?
네. 가장 흔한 주제(변수, 널 안전성, 제어 흐름)부터 고급 주제(클래스, future, async/await)까지 순서대로 정리되어 있어, 첫날부터 상단 섹션을 사용하고 점차 나머지로 넓혀갈 수 있습니다.