Dart 문법 정리
1. 변수 선언
// 정수
int variable1 = 10;
// 소수
double variable2 = 2.5;
// 참/거짓
bool variable3 = true, false;
// 문자열
String varibale4 = "문자열";
// 타입 자동 유추
var variable5 = "var";
dynamic variable6 = "dynamic";
dynamic과 var의 차이
var
은 선언 시 지정한 타입으로 고정되어 다른 타입을 할당 할 수 없습니다.dynamic
은 선언 시 지정한 타입과 다른 타입으로 할당 할 수 있습니다.
dynamic variable1 = "dynamic";
var variable2 = "var";
variable1 = 10
variable2 = 10 // 오류
nullable & non-nullable
타입 뒤에 ?
연산자를 붙여주면 null일 가능성이 있는 nullable 변수라는 뜻입니다.
String? variable1 = "hi hi";
variable = null;
nullable한 변수 뒤에 !
를 넣어주면 이 nullable 변수가 null이 아니라는 것을 단언해주는 것입니다.
final & const
final String name1 = "cotton";
const String name2 = "cotton";
두 키워드는 모두 선언된 변수를 변경 할 수 없도록 해줍니다.
두 키워드로 선언된 변수는 다시 변경 할 수 없으므로 타입을 생략해서 선언해주어도 됩니다.
두 키워드의 차이점
const
키워드는 빌드 타임 당시 할당 되는 값을 알고 있어야 합니다. (DateTime.now()
와 같이 런타임 당시에 정해지는 값은 지정 할 수 없습니다)final
키워드는 빌드 타임 당시 할당 되는 값을 알고 있지 않아도 됩니다.
연산자
int num1 = 1;
int num2 = 2;
// 더하기
print(num1+num2); // 3
// 빼기
print(num1-num2); // -1
// 나누기
print(num1/num2); // 0.5
// 곱하기
print(num1*num2); // 2
num1+=1;
print(num1); //2
num1-=1;
print(num1); // 1
num1*=2;
print(num1); // 2
num/=2;
print(num1); //1
// 단항 연산자
num1++;
print(num1) // 2;
bool bool1 = true;
print(bool1!); // false
// 논리 연산자
bool bool2 = true && true; // true
bool bool3 = false && true; // false
bool bool4 = true || false; // true
bool bool5 = false || false; // false
// null check
int? num3 = 3;
int? num4 = null;
num3 ??= 4; //왼쪽 변수가 null 일 때만 오른쪽의 값을 할당해줍니다.
num4 ??= 4; //왼쪽 변수가 null 일 때만 오른쪽의 값을 할당해줍니다.
print(num3); // 3
print(num4); // 4
// 크기 비교
print(num1<num2); // true
print(num1>num2); // false
print(num1==num2); // false
print(num1!=num2); // false
print(num1<=num2); // true
print(num1>=num2); // false
// 타입 비교
print(num1 is int); // true
print(num1 is! int); // false
리스트
List<T>
generic 타입으로 리스트 원소의 타입을 지정해줍니다.
List<String> stringList = ['s1','s2','s3'];
print(stringList[0]); // s1
print(stringList.length); // 3
stringList.add('s4');
print(stringList[3]); // s4
stringList.remove('s3');
print(stringList); // s1, s2, s4
print(stringList.indexOf('s2'); // 1
맵
Map<K,V>
키와 밸류 타입을 지정해줄 수 있습니다.
Map<String, String> map1 = {'key1':'value1'};
// 값 추가
map1.addAll({'key2','value2'});
map1['key3'] = 'value3';
// value 반환
print(map1['key2']); // value2
// 값 제거
map1.remove('key2');
print(map1.keys) // key1, key3
print(map1.values) // value1, value2
셋
Set<T>
T타입의 집합입니다. 중복된 값이 없도록 저장해줍니다.
Set<int> set1 = {1,2,3,4,5};
set1.add(6);
set1.add(4);
print(set1) // 1,2,3,4,5,6
print(set1.contains(4)); // true
if 문 for문 while 문
if(조건1){
실행문1
...
} else if(조건2){
실행문2
...
} else {
실행문3
...
}
switch(변수) {
case 조건1:
실행문1
break
case 조건2:
실행문2
break
default:
실행문3
break
}
for(반복 변수 선언; 반복 조건; 반복 변수 연산){
실행문
}
// 예시2
for(int i=0;i<10;i++){
실행문
}
// 예시2
List<int> numberList = [1,2,3,4,5];
for(int number in numberList){
실행문
}
while(반복 조건){
실행문
}
// break, continue
for(int i=0; i<10; i++){
...
if(i==5){
break;
}
...
}
// i가 4까지만 반복됩니다.
int i=0
while(i<10){
i+=1;
if(i==4){
continue;
}
print(i);
}
// 4는 출력되지 않습니다.
함수
<Type> <함수명>(<매개변수 타입> <매개변수 명>){
실행문
}
void add(int n1, int n2, int n3){
print(n1+n2+n3);
}
add(1,2,3); // 6
optional parameter
매개 변수 중 항상 필요한 매개 변수가 아닐 경우 optional parameter로 선언할 수 있습니다.
optional parameter는 미리 값을 할당해 줌으로써 인자를 받지 못해도 실행문 상에서 사용되도록 할 수 있습니다.
optional paramter에 새로운 값을 넣어주면 미리 할당해준 값들은 무시가 되고 새로 들어온 값이 매개변수에 할당됩니다.
void add(int n1, [int n2=2, int n3=3]){
print(n1+n2+n3);
}
add(1); // 6
add(1,5,10); // 16
named paramter
이전까지의 매개변수는 모두 순서를 통해 어떤 매개변수인지 구분하는 매개변수였습니다.
named paramter는 이름으로 매개변수들을 구분해줍니다.
매개 변수의 default는 optional parameter이고 꼭 필요한 매개변수인 경우 required 키워드를 지정해주어야만 합니다.
void add({
required int x,
required int y,
int z=10 // z는 optional parameter이므로 꼭 default 값을 넣어주어야 합니다.
}){
print(x+y+z);
}
add(x: 1, y: 2); // 13
add(x: 1, y: 2, z: 3); // 6
arrow function
실행문이 한 줄로 짧고 반환되는 값이 있을 경우 사용됩니다.
int add(int num1, int num2) => num1+num2;
print(add(4,5)) // 9
typedef
함수에 대한 타입을 가질 수 있습니다.
이로 인해 함수를 함수의 매개변수로 가질 수도 있고 반환 타입으로 설정 할 수 있습니다.
typedef Operation = int Function(int x,int y);
int add(int x, int y) => x+y;
int func(int x, int y, Operation f){
return f(x,y);
}
print(func(1,2,add)) // 3
typedef o1 = int Function(int x1, int x2);
o1 func(int x4, int x5){
int v1(int x1, int x2){
return x4+x5+x1+x2;
}
return v1;
}
print(func(4,5)(1,2)) // 12