Dart Basic Syntax
Variables, strings, operators, Null Safety basics
Dart programs start from main(). The core syntax includes 6 variable declaration styles (var, final, const, late, dynamic), string interpolation, Null Safety operators (?., ??, !, ??=), and the cascade (..) operator. Mastering these basics is essential for reading and writing Flutter code naturally.
Dart νλ‘κ·Έλ¨μ ꡬ쑰
λͺ¨λ Dart νλ‘κ·Έλ¨μ main() ν¨μμμ μμν©λλ€. voidλ λ°νκ°μ΄ μμμ μλ―Έν©λλ€.
void main() {
print('μλ
νμΈμ, Dart!');
}
// 컀맨λλΌμΈ μΈμλ₯Ό λ°λ κ²½μ°
void main(List<String> arguments) {
print('νλ‘κ·Έλ¨ μΈμ: $arguments');
}μ£Όμ (Comments)
// ν μ€ μ£Όμ
/*
μ¬λ¬ μ€ μ£Όμ
μ¬λ¬ μ€μ κ±Έμ³ μμ±ν μ μμ΅λλ€.
*/
/// λ¬Έμν μ£Όμ
/// dartdoc λκ΅¬κ° API λ¬Έμλ₯Ό μμ±ν λ μ¬μ©ν©λλ€.
/// ν΄λμ€, ν¨μ, λ³μ λ±μ μ€λͺ
μ μμ±ν λ μ μ©ν©λλ€.κΈ°λ³Έ λ°μ΄ν° νμ
// μ«μ νμ
int integerValue = 42; // μ μ
double doubleValue = 3.14; // μ€μ
num numValue = 10; // intλ doubleμ μμ νμ
// λ¬Έμμ΄ νμ
String greeting = 'μλ
νμΈμ';
// λΆλ¦¬μΈ νμ
bool isTrue = true;
bool isFalse = false;
// 리μ€νΈ (λ°°μ΄)
List<int> numbers = [1, 2, 3, 4, 5];
// λ§΅ (key-value μ)
Map<String, dynamic> person = {
'name': 'νκΈΈλ',
'age': 30,
'isStudent': false
};
// μ§ν© (μ€λ³΅ μλ 컬λ μ
)
Set<String> uniqueNames = {'νκΈΈλ', 'κΉμ² μ', 'μ΄μν¬'};λ³μ μ μΈ λ°©μ λΉκ΅
| ν€μλ | νμ μΆλ‘ | μ¬ν λΉ | μ΄κΈ°ν μμ |
|---|---|---|---|
| var | μλ | κ°λ₯ | μ μΈ μ |
| final | μλ | λΆκ° | λ°νμ |
| const | μλ | λΆκ° | μ»΄νμΌ νμ |
| late | μλ | κ°λ₯ | λμ€μ |
| dynamic | μμ | κ°λ₯ (νμ λ³κ²½λ κ°λ₯) | μ μΈ μ |
var β νμ μΆλ‘ λ³μ
μ΄κΈ°κ°μμ νμ μ΄ μλ μΆλ‘ λλ©°, μ΄ν λ€λ₯Έ νμ μ κ°μ ν λΉν μ μμ΅λλ€.
var name = 'νκΈΈλ'; // StringμΌλ‘ μΆλ‘
var age = 30; // intλ‘ μΆλ‘
var height = 175.5; // doubleμΌλ‘ μΆλ‘
name = 'κΉμ² μ'; // κ°λ₯ (String β String)
// name = 42; // μ€λ₯ (String β int)λͺ μμ νμ μ μΈ
String name = 'νκΈΈλ';
int age = 30;
double height = 175.5;finalκ³Ό const
// final: λ°νμμ κ°μ΄ κ²°μ λλ μμ
final String name = 'νκΈΈλ';
final currentTime = DateTime.now(); // νμ
μΆλ‘ κ°λ₯
// const: μ»΄νμΌ νμμ κ°μ΄ κ²°μ λλ μμ
const int maxUsers = 100;
const double pi = 3.14159;
// μ¬ν λΉ λΆκ°
// name = 'κΉμ² μ'; // μ€λ₯: final λ³μλ μ¬ν λΉ λΆκ°
// maxUsers = 200; // μ€λ₯: const λ³μλ μ¬ν λΉ λΆκ°final vs const ν΅μ¬ μ°¨μ΄
finalμ λ°νμμ κ°μ΄ κ²°μ λ μ μμ§λ§, constλ μ»΄νμΌ μμ μ κ°μ μ μ μμ΄μΌ ν©λλ€.
final now = DateTime.now(); // κ°λ₯ (λ°νμ κ°)
// const today = DateTime.now(); // μ€λ₯: μ»΄νμΌ μμ μ κ°μ μ μ μμlate β μ§μ° μ΄κΈ°ν
μ μΈ μ μ΄κΈ°ννμ§ μκ³ λμ€μ κ°μ ν λΉν©λλ€. μ΄κΈ°ν μ μ μ κ·Όνλ©΄ λ°νμ μ€λ₯κ° λ°μν©λλ€.
late String name;
void initName() {
name = 'νκΈΈλ'; // λμ€μ κ° ν λΉ
}
void main() {
initName();
print(name); // 'νκΈΈλ'
late String address;
// print(address); // μ€λ₯: μ΄κΈ°νλμ§ μμ late λ³μμ μ κ·Ό
}dynamic β λμ νμ
μ΄λ€ νμ μ κ°μ΄λ ν λΉ κ°λ₯νλ©°, μ»΄νμΌ νμ νμ κ²μ¬λ₯Ό μ°νν©λλ€.
dynamic value = 'λ¬Έμμ΄';
print(value); // 'λ¬Έμμ΄'
value = 42;
print(value); // 42
value = true;
print(value); // trueλ¬Έμμ΄ (String)
μμλ°μ΄νμ ν°λ°μ΄ν λͺ¨λ μ¬μ©ν μ μμ΅λλ€.
String single = 'μμλ°μ΄ν λ¬Έμμ΄';
String double_ = "ν°λ°μ΄ν λ¬Έμμ΄";λ¬Έμμ΄ λ³΄κ° (Interpolation)
String name = 'νκΈΈλ';
int age = 30;
// $λ³μλͺ
νν
String message = 'μ μ΄λ¦μ $nameμ΄κ³ , λμ΄λ $ageμ΄μ
λλ€.';
// ${ννμ} νν
String ageNextYear = 'λ΄λ
μλ ${age + 1}μ΄μ΄ λ©λλ€.';μ¬λ¬ μ€ λ¬Έμμ΄ & μμ λ¬Έμμ΄
// μ¬λ¬ μ€ λ¬Έμμ΄ β μΌμ€ λ°μ΄ν
String multiLine = '''
μ΄κ²μ
μ¬λ¬ μ€μ κ±ΈμΉ
λ¬Έμμ΄μ
λλ€.
''';
// μμ λ¬Έμμ΄ β r μ λμ¬ (μ΄μ€μΌμ΄ν μ²λ¦¬ μ ν¨)
String escaped = 'C:\Program Files\Dart'; // μ΄μ€μΌμ΄ν μ¬μ©
String raw = r'C:\Program Files\Dart'; // μμ λ¬Έμμ΄μ°μ μ°μ°μ
int a = 10;
int b = 3;
print(a + b); // 13 (λ§μ
)
print(a - b); // 7 (λΊμ
)
print(a * b); // 30 (κ³±μ
)
print(a / b); // 3.333... (λλμ
, κ²°κ³Όλ double)
print(a ~/ b); // 3 (μ μ λλμ
, κ²°κ³Όλ int)
print(a % b); // 1 (λλ¨Έμ§)/λ νμ doubleμ λ°νν©λλ€. μ μ κ²°κ³Όκ° νμνλ©΄ ~/λ₯Ό μ¬μ©νμΈμ.
μ¦κ° & ν λΉ μ°μ°μ
int a = 10;
a++; // νμ μ¦κ° β 11
++a; // μ μ μ¦κ° β 12
a--; // νμ κ°μ β 11
--a; // μ μ κ°μ β 10
// ν λΉ μ°μ°μ
a += 5; // a = a + 5 β 15
a -= 3; // a = a - 3 β 12
a *= 2; // a = a * 2 β 24
a ~/= 5; // a = a ~/ 5 β 4λΉκ΅ & λ Όλ¦¬ μ°μ°μ
// λΉκ΅ μ°μ°μ
int a = 10, b = 5;
print(a == b); // false (κ°μ)
print(a != b); // true (λ€λ¦)
print(a > b); // true (μ΄κ³Ό)
print(a < b); // false (λ―Έλ§)
print(a >= b); // true (μ΄μ)
print(a <= b); // false (μ΄ν)
// λ
Όλ¦¬ μ°μ°μ
bool c1 = true, c2 = false;
print(c1 && c2); // false (AND)
print(c1 || c2); // true (OR)
print(!c1); // false (NOT)νμ ν μ€νΈ μ°μ°μ
var value = 'λ¬Έμμ΄';
print(value is String); // true (String νμ
μΈμ§ νμΈ)
print(value is! int); // true (int νμ
μ΄ μλμ§ νμΈ)
// as μ°μ°μ β λͺ
μμ νμ
λ³ν
dynamic someValue = 'Dart';
String text = someValue as String;쑰건 μ°μ°μ
// μΌν μ°μ°μ: 쑰건 ? κ°1 : κ°2
int a = 10, b = 5;
int max = a > b ? a : b;
print(max); // 10
// ?? μ°μ°μ: μΌμͺ½μ΄ nullμ΄λ©΄ μ€λ₯Έμͺ½ λ°ν
String? name;
String displayName = name ?? 'μ΄λ¦ μμ';
print(displayName); // 'μ΄λ¦ μμ'μΊμ€μΌμ΄λ(..) μ°μ°μ
λμΌ κ°μ²΄μ μ°μμΌλ‘ λ©μλλ₯Ό νΈμΆνκ±°λ μμ±μ μ€μ ν λ μ¬μ©ν©λλ€.
class Person {
String name = '';
int age = 0;
void introduce() {
print('λ΄ μ΄λ¦μ $nameμ΄κ³ , λμ΄λ $ageμ΄μ
λλ€.');
}
}
void main() {
var person = Person()
..name = 'νκΈΈλ'
..age = 30
..introduce();
// μ μ½λλ λ€μκ³Ό λμΌν©λλ€:
// var person = Person();
// person.name = 'νκΈΈλ';
// person.age = 30;
// person.introduce();
}Null Safety
Dart 2.12λΆν° λμ λ Null Safetyλ μ»΄νμΌ νμμ null μ°Έμ‘° μ€λ₯λ₯Ό λ°©μ§ν©λλ€.
// non-nullable νμ
(null ν λΉ λΆκ°)
String name = 'νκΈΈλ';
// name = null; // μ»΄νμΌ μ€λ₯
// nullable νμ
(? μΆκ° β null νμ©)
String? nullableName = 'νκΈΈλ';
nullableName = null; // νμ©λ¨Null Safety μ°μ°μ λΉκ΅
| μ°μ°μ | μ΄λ¦ | λμ | μμ |
|---|---|---|---|
| ?. | μ‘°κ±΄λΆ μ κ·Ό | κ°μ²΄κ° nullμ΄λ©΄ μ 체 ννμμ΄ null | name?.length |
| ?? | null λ³ν© | μΌμͺ½μ΄ nullμ΄λ©΄ μ€λ₯Έμͺ½ λ°ν | name ?? 'κΈ°λ³Έκ°' |
| ??= | null ν λΉ | λ³μκ° nullμ΄λ©΄ κ°μ ν λΉ | name ??= 'κΈ°λ³Έκ°' |
| ! | non-null λ¨μΈ | nullμ΄ μλμ λ¨μΈ (μν) | name! |
Null Safety μ°μ°μ μ½λ μμ
String? name = getNullableName();
// null κ²μ¬ ν μ¬μ©
if (name != null) {
print('μ΄λ¦μ κΈΈμ΄: ${name.length}');
}
// ?. β μ‘°κ±΄λΆ μ κ·Ό (nullμ΄λ©΄ null λ°ν)
print('μ΄λ¦μ κΈΈμ΄: ${name?.length}');
// ?? β null λ³ν© (nullμ΄λ©΄ κΈ°λ³Έκ°)
print('μ΄λ¦: ${name ?? 'μ΄λ¦ μμ'}');
// ??= β nullμ΄λ©΄ κ°μ ν λΉ
name ??= 'μ΄λ¦ μμ';non-null λ¨μΈ μ°μ°μ (!)
μ£Όμ: ! μ°μ°μλ μ€μ nullμΈ κ²½μ° λ°νμ μ€λ₯λ₯Ό λ°μμν΅λλ€. κ°λ₯νλ©΄ ??λ ?.μ μ°μ μ¬μ©νμΈμ.
String? name = 'νκΈΈλ';
// nullμ΄ μλλΌκ³ νμ ν λ μ¬μ©
String nonNullName = name!;
// μ€μ λ‘ nullμ΄λ©΄ λ°νμ μ€λ₯ λ°μ
name = null;
// String error = name!; // λ°νμ μ€λ₯: null μ°Έμ‘°Implementation Steps
var vs final vs const β var is reassignable, final is runtime constant, const is compile-time constant
late keyword β declare without initialization, essential for lazy init of non-nullable variables
String interpolation β insert values with "$var" or "${expr}", preferred over + concatenation
Null Safety operators β ?. (null returns null), ?? (default if null), ! (non-null assert, risky), ??= (assign if null)
Cascade (..) operator β chain calls on same object, useful like builder pattern
Pros
- ✓ Clear immutability expression with final/const
- ✓ Null Safety prevents NullPointerException at compile time
Cons
- ✗ final vs const distinction can confuse beginners