한 가지 언어로 모든 것을 만들 수 있다면
프로그래밍 언어를 선택하는 일은 생각보다 고민이 많습니다. 웹 서버를 만들려면 Python이나 Java를, 모바일 앱을 만들려면 Swift나 Kotlin을, 프론트엔드를 만들려면 JavaScript를 배워야 합니다. 새로운 프로젝트를 시작할 때마다 "이번에는 어떤 언어를 써야 하지?"라는 질문과 마주하게 됩니다.
만약 한 가지 언어로 모바일 앱, 웹 서버, 데스크톱 앱, CLI 도구까지 모두 만들 수 있다면 어떨까요? Dart는 바로 그런 언어입니다.
Google이 만든 현대적 언어
Dart는 2011년 Google이 만든 프로그래밍 언어입니다. 처음에는 웹 브라우저의 JavaScript를 대체하려는 목적으로 시작했지만, 시간이 지나면서 훨씬 더 큰 그림을 그리게 됩니다.
2018년, Google은 Flutter라는 UI 프레임워크를 발표합니다. Flutter는 하나의 코드베이스로 iOS, Android, 웹, 데스크톱 앱을 모두 만들 수 있는 크로스플랫폼 프레임워크입니다. 그리고 Flutter의 프로그래밍 언어로 Dart가 선택되었습니다.
이 선택은 Dart의 운명을 완전히 바꿔놓았습니다. Flutter의 폭발적인 성장과 함께 Dart도 빠르게 성장하기 시작했고, 2026년 현재 전 세계 1,400개 이상의 기업이 Dart를 사용하고 있습니다.
Dart를 배우면 무엇을 할 수 있나요
Dart는 놀라울 정도로 다양한 영역에서 활용됩니다.
모바일 앱 개발
Flutter와 함께 iOS와 Android 앱을 동시에 만들 수 있습니다. 하나의 코드로 두 플랫폼을 지원하니 개발 시간이 절반으로 줄어듭니다. 실제로 한국의 많은 기업이 Flutter로 앱을 개발하고 있으며, 채용 공고도 빠르게 늘어나는 추세입니다.
웹 애플리케이션
Flutter Web으로 웹 애플리케이션을 만들 수 있습니다. 모바일 앱과 같은 코드를 웹에서도 실행할 수 있어, 진정한 의미의 "한 번 작성, 어디서든 실행"이 가능합니다.
서버 개발
shelf, dart_frog 같은 프레임워크로 백엔드 서버를 만들 수 있습니다. 프론트엔드(Flutter)와 백엔드를 같은 언어로 개발하면 코드를 공유할 수 있어 생산성이 크게 올라갑니다.
CLI 도구
명령줄에서 실행하는 도구를 만들 수 있습니다. Dart는 네이티브 실행 파일로 컴파일할 수 있어서, Node.js처럼 런타임을 설치할 필요 없이 바로 실행 가능한 도구를 만들 수 있습니다.
Dart의 핵심 특징
Dart가 다른 언어와 다른 점은 무엇일까요? 몇 가지 핵심 특징을 미리 살펴보겠습니다.
Sound Null Safety
String name = "홍길동"; // null이 될 수 없습니다
String? nickname = null; // ?를 붙이면 null이 될 수 있습니다
Dart는 null로 인한 에러를 컴파일 시점에 잡아줍니다. "NullPointerException"이라는 악명 높은 에러를 코드를 실행하기도 전에 발견할 수 있습니다. 이 기능 하나만으로도 Dart를 배울 가치가 있습니다.
간결하고 익숙한 문법
class Person {
final String name;
final int age;
Person(this.name, this.age);
String greet() => "안녕하세요, $name입니다. $age살이에요.";
}
Java, JavaScript, C#을 써본 적이 있다면 Dart 코드가 낯설지 않을 것입니다. Dart는 이 언어들의 좋은 점을 가져오면서도 더 간결한 문법을 제공합니다. 위 코드에서 this.name으로 생성자 매개변수를 바로 필드에 할당하는 문법이나, =>로 한 줄 함수를 만드는 문법이 좋은 예입니다.
빠른 개발 사이클
Dart는 JIT(Just-In-Time) 컴파일과 AOT(Ahead-Of-Time) 컴파일을 모두 지원합니다. 개발 중에는 JIT로 핫 리로드를 활용하여 코드 변경을 즉시 확인하고, 배포할 때는 AOT로 네이티브 코드로 컴파일하여 빠른 실행 속도를 얻습니다.
이 책에서 함께할 여정
이 책은 Dart 언어의 기초부터 고급 기능까지를 "소설처럼" 읽을 수 있도록 구성했습니다. 단순히 문법을 나열하는 것이 아니라, "왜 이런 기능이 필요한가?"를 먼저 이해하고, 자연스럽게 해결책으로서의 문법을 배우는 흐름을 따릅니다.
변수와 타입에서 시작하여 함수, 컬렉션, 객체지향, Null Safety, 제네릭, 비동기 프로그래밍, 그리고 Dart 3의 최신 기능인 패턴 매칭과 레코드까지 — Dart의 모든 핵심을 다룹니다. 마지막에는 배운 모든 개념을 총동원하여 CLI 앱을 만드는 미니 프로젝트가 기다리고 있습니다.
그러면 Dart가 다른 언어들과 어떻게 다른지부터 살펴보겠습니다.