1장에서는 다트 언어의 기본 문법에 대해 설명합니다.
다트는 프로그램 시작점인 엔트리 함수 기호로 main()을 사용합니다.
void main() {}
주석 기호로 //, /**/, /// 를 사용합니다.
void main() {
// 한 줄 주석
/*
* 여러 줄 주석
* 여러 줄 주석
*/
/// 문서 주석
}
void main() {
print('Hello World');
}
변수 선언 방법으로 다음과 같이 4가지가 있습니다.
변수에 값이 들어가면 자동으로 타입을 추론하는 방법입니다.
타입이 추론된 이후에는 다른 타입을 변수에 저장할 수 없습니다.
void main() {
var name = '코드팩토리'; // string으로 추론
name = '골든래빗';
name = 10; // error
}
var와 다르게 변수의 타입이 고정되지 않으며 다른 타입의 값으로 변경할 수 있습니다.
void main() {
var name = '코드팩토리';
name = 10;
}
변수의 값을 처음 선언 후 변경할 수 없습니다.
final은 런타임 시간에 결정되는 상수이고, const는 빌드 시간에 결정되는 상수입니다.
void main() {
final DateTime now = DateTime.now(); // 런타임 때 현재 시간
}
void main() {
const DateTime now = DateTime.now(); // 빌드 시점에 알 수 없음
}
코드를 실행하지 않은 상태에서 값이 확정되면 const를, 실행될 때 확정되면 final을 사용하면 됩니다.
직접적으로 타입을 명시해주는 방법
void main() {
String name = '이름';
int intValue = 10;
double doubleValue = 2.5;
bool isTrue = true;
}
여러 값을 하나의 변수에 저장할 수 있는 타입입니다.
List, Map, Set이 이에 속합니다.
다트의 컬렉션 타입은 서로의 타입으로 자유롭게 형변환이 가능하다는 장점이 있습니다.
void main() {
List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
}
List타입에서 제공하는 함수가 많습니다. 그중 몇가지만 소개합니다.
Map 타입은 키와 값의 짝을 저장합니다.
void main () {
Map<String, String> dictionary = {
'Harry Potter': '해리 포터',
'Ron Weasley': '론 위즐리',
}
print(dictionary.keys); // (Harry Potter, Ron Weasley)
print(dictionary.values.toList()); // [해리 포터, 론 위즐리]
}
Set은 중복 없는 값들의 집합입니다.
void main() {
Set<String> blackpink = {'로제', '지수', '지수'};
print(blackpink); // {로제, 지수}
print(blackpink.toList); // [로제, 지수]
print(blackpink.contains('로제')); // true
List<String> blackpink2 = ['로제', '지수'];
Set.from(blackpink2) // List -> Set 변환
}
한 변수로 몇 가지 옵션을 제한할 때 사용할 수 있습니다.
enum Status {
approved,
pending,
rejected,
}
void main() {
Status status = Status.approved;
}
void main() {
double number = 2;
print(number + 2);
print(number - 2);
print(number * 2);
print(number / 2);
print(number % 3);
number++;
number--;
number += 2;
number -= 2;
number *= 2;
number /= 2;
}
다트에서는 변수 타입이 null값을 가지는지 여부를 직접 지정해줘야 합니다.
void main() {
double? number1 = 1;
double? number2 = null;
double number3 = null; // error
}
?? 연산자를 사용하여 변수의 값이 null일 때만 값을 지정할 수 있습니다.
void main() {
double? number = null;
number ??= 1;
number ??= 2; // null이 아니기 때문에 1이 유지됩니다.
}
void main() {
int num1 = 1;
int num2 = 2;
// 값 비교
print(num1 > num2);
print(num1 < num2);
print(num1 >= num2);
print(num1 <= num2);
print(num1 == num2);
print(num1 != num2);
// 타입 비교
print(num1 is int);
print(num1 is String);
print(num1 is! int);
print(num1 is! String);
}
void main() {
bool result1 = true && false // false
bool result2 = true || false // true
}
void main() {
if () {
...
} else if () {
...
} else {
...
}
}
void main() {
int num = 1;
switch(num) {
case 1:
break;
case 2:
break;
default:
...
}
}
void main() {
for (int i = 0; i < 3; i++) {
print(i);
}
}
void main() {
List<int> numList = [1, 2, 3];
for (int num in numList) {
print(num);
}
}
void main() {
int total = 0;
while(total < 10) {
total += 1;
}
}
void main() {
int total = 0;
do {
total += 1;
}while(total < 10)
}
int add(int a, int b) {
return a + b;
}
void main() {
int result = add(1, 2);
}
다트는 네임드 파라미터를 통해 순서와 상관 없이 파라미터를 지정할 수 있습니다.
네임드 파라미터를 이용하려면 required와 중괄호 {}를 사용합니다.
여기서 required는 매개변수가 null 값이 불가능한 타입이면 기본값을 지정해주거나 필수로 입력해야 한다는 의미입니다.
int add({required int a, required int b}) {
return a + b;
}
void main() {
int result = add(a: 1, b: 2);
}
파라미터에 기본값을 지정해 줄 수 있습니다.
int add(int a, [int b = 2]) {
return a + b;
}
int add2({required int a; int b = 2}) {
return a + b;
}
void main() {
int result = add(1); // 3
int result2 = add2(a: 1); // 3
}
포지셔널 파라미터와 네임드 파라미터를 섞어서 사용할 수도 있습니다.
int add(int a, {required int b, int c = 4}) {
return a + b + c;
}
void main() {
int result = add(1, b: 2, c: 3);
}
void main() {
List<int> numbers = [1, 2, 3];
final allMembers = numbers.reduce((v, el) => v + el);
}
typedef는 함수의 시그니처를 정의하는 값으로, 함수를 타입으로 정의할 수 있습니다.
typedef Operation = void Function(int x, int y);
void add (int x, int y) {
print(x + y);
}
void calculate(int x, int y, Operation oper) {
oper(x, y);
}
void main() {
Operation oper = add;
calculate(1, 2, oper);
}
void main() {
try {
final String name = 'hello';
throw Exception('이름이 잘못됐습니다.');
} catch(e) {
print(e);
}
}
《Must Have 코드팩토리의 플러터 프로그래밍 2판》의 스터디 내용 입니다.