int, double, num, bool, String 존재.
자료형 int, double == num.
num is int (true)
num is double (true)
int is num (true)
double is num (true)
List, Set, Map 존재.
타입<요소 타입> 으로 선언.
List<int> numbers = [1, 2, 3];
Map<string, int> scores = {
'a' : 1,
'b' : 2
}
var a = 3;
a = 'hello';
// 에러. a의 자료형이 int로 지정되기 때문.
dynamic a = 3;
a = 'hello';
// 가능. dynamic은 변수의 자료형 변경을 허용.
final과 const는 불변 상수. 차이점은 값이 정해지는 시점.
const: 컴파일 시점, 앱 빌드 시점에 값이 정해짐. (앱 내부에 박혀있는 상수)
final: 런타임 시점, 앱 실행시 정해짐. (DateTime.now 같이 실행 시점에 상수 값 정해짐)
클래스 내부에서 공유되는 변수. 해당 클래스의 모든 인스턴스는 해당 static 변수를 공유함.
55 ~/ 2 = 27
- dart에서는 예상치 못한 null에 대응함.
- Dart에서는 변수 선언 시 초기값을 주지 않으면 null로 초기화됨. 따라서 non-nullable 변수는 선언과 동시에 초기값을 주어야 함.
- 변수는 nullable과 non-nullable로 나뉨. 기본적으로 변수는 non-nullable이기 때문에 null값이 들어간다면 컴파일 에러가 남. nullable로 선언하기 위해서는 자료형 뒤에 ?를 붙임.
int a = 1;
a = null; // 컴파일 에러
int? a = 1;
a = null; // 가능
- var 타입은 c++ auto처럼 타입을 추론함. 타입 추론과 동시에 nullable인지 non-nullable인지도 추론함. 따라서 var? 라고 쓸 필요가 없고, 쓰면 에러남.
var a1 = 10; // int + non-nullable
var a2 = null; // dynamic + nullable
var a3; // dynamic + nullable
var? a4 = null; // 컴파일 에러
- dynamic 타입에서는 null safety는 의미 없다. dynamic으로 선언하는 것 자체가 nullable로 선언하는 것이기 때문.
- required은 함수 named parameter 설정할 때 non-nullable으로 지정하는 문법. 생성자의 named parameter에 requierd가 있다면 해당 인자를 무조건 넘겨 받아야 함.
- late는 class 내부 변수에 대해서, 그 변수를 non-nullable로 설정하고 싶은데 초기화 시키지 않는 경우, 나중에 값을 할당한다는 것을 명시해주는 의미로 붙임.
String sayHi(String name) {
return 'Hi $name!';
}
String sayHi(String name) => 'Hi $name!';
파라미터를 {}로 감싸면, 이름으로 전달 가능. 선택 사항.
void main() {
void introduce({required String name, required int age}) {
print('I am $name. $age yaers old!');
}
introduce(name: 'Sam', age: 5); //I am Sam. 5 years old!
}
String? name;
name.length // name은 잠재적으로 null이 가능한 변수임. 따라서 컴파일 에러.
name?.length // name이 null인 경우 에러를 발생시키지 않고 null을 리턴함.
클래스에서 private, public 구분.
private 변수는 변수명 앞에 _ 붙임.
https://fre2-dom.tistory.com/248
https://ssameocean.tistory.com/87
https://velog.io/@dosilv/Flutter-Dart-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC-type-operator-function-null-safety