모두 reference 타입
int num1 = 2;
double num2 = 3.0
bool isTrue = true;
String str = 'Hello';
타입 체크
(num1+num2) is int
(num1+num2).runtimeType
var : 타입 추론
var username; // dynamic -> 가급적으로 피할 것
var username = 'friendship'; // String
```
final vs const
final String fullname = 'Jeffrey';
fullname = 'Jefferson'; // error
const int age = 75;
const int favNumber = num1 + 5; // error
기본은 Null을 허용하지 않는다. 변수에 null을 대입하면 컴파일 에러가 발생한다.
int age = 75; // non-nullable
int age = null; // error
int? age; // nullable -> null을 허용하려면 타입 뒤에 ?를 붙인다.
String? answer;
String result = answer; // error
String result = answer! // works
var txt = 'good';
assert(txt != 'bad');
할당
String? name;
var z = name ?? 'Guest'; // name이 null이면 Guest 대입
name ??= 'Guest'; // name이 null이 아니면 그냥 둬라가 포함되어 있음
✨ 삼항 연산자 : 삼항을 사용하여 if else문 대체
String color = 'blue';
var isThisBlue = color == 'blue' ? 'Yes' : 'No';
Cascade (..) : 새로운 줄을 작성하지 않고 메소드 호출을 반복할 수 있다. 플러터 코드 작성 시 유용하다.
// var paint = Paint();
// paint.color = 'black';
// paint.strokeCap = 'round';
// paint.strokeWidth = 5.0;
var paint = Paint()
..color = 'black'
..strokeCap = 'round'
..strokeWidth = 5.0;
타입 캐스트 : 값을 다른 타입으로 변환한다.
String num = 10.toString();
double d = 10.toDouble();
int i = int.parse('1234');
: 인풋과 아웃풋이 있고 항상 똑같은 값 리턴
String takeFive(int number) {
return '$number minus five equals ${number -5}';
}
// required : 반드시 필요한 속성
namedParams({required int a, int b = 5}) {
return a - b;
}
namedParams(a: 23, b: 10);
void main() {
something(10, (value) {
print(value);
});
}
void something(int num, Function callback) {
callback.call(num);
}
List<int> list = [1, 2, 3, 4, 5];
list[0]; // 1
list.length; // 5
list.last; // 5
list.first; // 1
for (int n in list) {
print(n);
}
list.forEach((n) => print(n));
var doubled = list.map((n) => n * 2);
var combined = [...list, ...doubled];
combined.forEach(print);
dynamic 허용 (다양한 타입 들어갈 수 있음)
Map<String, dynamic> book = {
'title': 'Moby Dick', // key : value
'author': 'Herman Melville',
'pages': 752,
};
book['title']; // Moby Dick
book['published'] = 1851; // 추가
for (MapEntry b in book.entries) {
print('Key ${b.key}, Value ${b.value}');
}
book.forEach((k, v) => print("Key : $k, Value : $v"));
key, value 쌍으로 이루어진 자료구조, 참고로 JSON 데이터와 똑같은 형태이다. 옆의 코드는 암묵적으로 Map<dynamic, dynamic>이다. 일관적으로 Map<String, dynamic>으로 선언을 많이 하고 Map<String, Object>도 가능하다.
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings',
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
String jsonString = “{ \”name\”: \”홍길동\”, \”email\”: \”aaa@bbb.com\” } ”
Map<String, dynamic> user = jsonDecode(jsonString);
print('안녕하세요, ${user['name'}님!');
print('${user['email']}으로 인증 링크를 보냈습니다.');
: 객체의 데이터와 동작으로 그룹화하는 방법이다.
class Basic {
int id;
Basic(this.id);
doStuff() {
print('Hello my Id is $id');
}
}
Basic thing = new Basic(55);
thing.id;
thing.doStuff();
this 키워드는 현재 인스턴스 참조에 사용되며 이름 충돌이 없는 한 옵션이다.
class Rectangle {
final int width;
final int height;
String? name;
late final int area;
Rectangle(this.width, this.height, [this.name]) {
area = width * height;
}
}
class Point {
double lat = 0;
double lng = 0;
// Named constructor
Point.fromMap(Map data) {
lat = data['lat'];
lng = data['lng'];
}
Point.fromList(List data) {
lat = data[0];
lng = data[1];
}
}
var p1 = Point.fromMap({'lat': 23, 'lng': 50});
var p2 = Point.fromList([23, 50]);