Dart는 정적 타입 언어로, 다양한 타입을 지원하며 타입 안정성을 보장한다.
기본적으로 다음과 같은 자료형을 자주 사용한다:
int, double, numStringboolList, Set, MapObject, Future, dynamicdouble d1 = 3.14;
int n1 = 12;
num n2 = 25;
num n3 = 1.17;
int: 정수형double: 실수형num: int와 double을 모두 포함하는 상위 타입작은 따옴표('), 큰 따옴표("), 삼중 따옴표(''')를 사용해 문자열을 선언할 수 있다.
String s1 = 'Hello';
String s2 = "world";
String s3 = '''Flutter
is awesome!''';
삼중 따옴표는 여러 줄 문자열 작성에 유용하다.
bool isActive = true;
bool isVisible = false;
bool 타입은 true 또는 false 값을 가진다.
List<String> fruits = ['Apple', 'Banana', 'Mango'];
Set<int> numbers = {1, 2, 3, 3}; // 중복 제거됨
Map<String, int> scores = {'Math': 90, 'English': 85};
모든 Dart 객체의 최상위 타입
Object obj = 'Hello'; // 어떤 타입이든 저장 가능
비동기 작업의 결과를 담는 타입
Future<String> getData() async {
return 'Data received!';
}
⚡비동기(Asynchronous) 작업이란?
어떤 작업을 기다리지 않고 동시에 다른 작업을 처리할 수 있는 방식을 말한다. 예를 들어, 앱에서 서버에 데이터를 요청할 때 응답이 올 때까지 기다리는 대신, 그 사이 다른 UI 작업을 계속 처리할 수 있다면 비동기 방식이다.
컴파일 타임에 타입이 정해지지 않고 런타임에 결정됨
dynamic x = 'text';
x = 123; // 타입 변경 가능
var: 타입 추론. 초기 타입이 고정됨 dynamic: 타입을 자유롭게 변경 가능 final: 값을 한 번만 할당할 수 있음 const: 컴파일 타임에 고정된 상수var a = 10; // 이후 int 외 다른 타입 할당 불가
dynamic b = 10; // 이후 어떤 타입이든 변경 가능
final c = 20; // 한 번만 할당 가능
const d = 30; // 컴파일 타임 상수




void main() {
int a = 5;
int b = 5;
print(++a); // 전위 증가: 먼저 1 증가 → 출력 = 6
print(b++); // 후위 증가: 먼저 출력 → 그 다음 1 증가 = 5
print('a: $a'); // a는 이미 6
print('b: $b'); // b는 이제 6
}
++, --의 위치에 따라 연산 순서가 달라진다:
++a: 값을 먼저 증가시키고 출력a++: 값을 출력한 뒤에 증가시킴조건이 참이면 A, 거짓이면 B를 반환하는 짧은 if-else 문법
int a1 = 10;
int b1 = 4;
a1 > b1 ? print("$a1 이(가) 더 큽니다.") : print("$b1 이(가) 더 큽니다.");
Dart는 Null Safety를 지원하여 런타임 Null 오류(NPE)를 방지한다.
? 사용int? a = null;
String? str = null;
변수에 null이 들어갈 수 있음을 명시적으로 표시한다.
! 사용String? name = 'Flutter';
print(name!); // null 아님을 보장하고 사용
개발자가 "절대 null 아님!"을 확신할 때만 사용한다.