void main() {
var name = "dkjlsf";
var num = 123;
print(name.runtimeType); // String
print(num.runtimeType); // int
}
var 타입으로 쓰면 자동으로 선언할 당시 타입으로 유추해준다.
runtimeType 이란 실행할 당시 Type 을 말함
주의
void main() {
var name = "dkjlsf";
name = 12;
print(name.runtimeType);
}
에러.. int 는 String 에 할당될 수 없다는 에러가 뜬다.
var 쓸 때는 피치 못할 사정에 쓰도록 한다.
void main() {
Map<String, Map<int, List<double>>> testType = {};
}
void main() {
String name = "ㄹ나ㅣ";
String name2 = "sfls";
print("${name} ${name2}");
}
void main() {
String name = "ㄹ나ㅣ";
String name2 = "sfls";
print("${name.runtimeType} ${name2}");
}
var, dynamic 타입의 차이점
var 는 선언할 당시 타입으로 fix 가 된다.
void main() {
dynamic name = "123";
name = 123;
print(name.runtimeType);
}
void main() {
String? name = "dkdkd";
name = null;
print(name);
}
nullable => ?
non-nullable => !
null
void main() {
String? name = "dkdkd";
name = null;
print(name!); // 느낌표 붙이면 에러
}
final 선언하면 값을 변경할 수 없다
const 도 그렇다.
void main() {
final String name = "ds";
final name2 = "sfsf";
}
타입 생략 가능. const 도 동일
void main() {
final DateTime now = DateTime.now();
final DateTime now2 = DateTime.now();
print(now);
print(now2);
}
버튼을 눌렀을 때의 기준의 시간이 아니라 이 코드가 실행할 당시의 time 이기 때문에 now, now2 는 다른 결괏값을 보인다.
(하지만 코드가 몇 줄 안되서 실제로 실행해보면 차이가 안남)
void main() {
final DateTime now = DateTime.now();
print(now);
const DateTime now2 = DateTime.now();
}
const 에서 에러가 난다.
여기서 final 과 const 의 차이를 볼 수 있는데
const 는 빌드 당시 타입을 알아야 하고 final 은 빌드 당시 타입을 몰라도 된다는 차이점을 가지고 있다.
??=
void main() {
String? name = "sfs";
name = null;
print(name ??= "dsfs");
}
이 기호의 뜻은 null 이면 오른쪽으로 바꿔라라는 뜻이다.
void main() {
int num = 1;
print(num is int);
print(num is! int);
}
List<제너릭>
add, remove, indexOf (인덱스 가져옴)
Map
꼭 키와 값 쌍으로 (key, value)
void main() {
Map<String, bool> dictionary = {"a": true, "b": false, "c": true};
dictionary.addAll({"d": false});
print(dictionary);
dictionary["a"] = false;
print(dictionary);
dictionary["f"] = true;
print(dictionary);
dictionary.remove("a");
print(dictionary);
print(dictionary.keys);
print(dictionary.values);
}
Set
키와 값이 아님. 리스트와 비슷함
단, 중복값이 들어있을 수 없음
void main() {
final Set<String> obj = {
"flutter",
"tistory",
"cake",
"flutter"
};
print(obj);
obj.add("apple");
print(obj);
obj.remove("apple");
print(obj);
print(obj.contains("cake"));
}
메소드는 리스트와 거의 동일
void main() {
int number = 2;
switch(number % 2){
case 0:
print("0");
break;
case 1:
print("1");
break;
default:
print("s");
break;
}
}
void main() {
int number = 0;
List<int> lists = [1,2,3,4,5,6];
for(int i = 0; i < lists.length; i++){
number += lists[i];
}
print(number);
for(int l in lists ){
number += l;
}
print(number);
}
enum Status {
approved,
pending,
rejected
}
void main() {
Status status = Status.approved;
if (status == Status.approved) print("승인");
}
optional parameter
positional parameter 는 순서가 중요한 파라미터... 생략
optional parameter 는 있어도 되고 없어도 되는 파라미터 => [ ] 사용
사용법
void main() {
addNumbers(1);
}
addNumbers(int x, [int y, int z]) { // 에러
int sum = x + y + z;
print("$x");
print("$y");
}
y, z 에 에러 표시가 뜬다.
왜냐면 y, z 는 nullable 일 수 있기 때문
에러 내용
the parameter 'y' can't have a value of 'null' because of its type, but the implicit default value is 'null'
try adding either an emplicit non-'null' default value or the 'required' modifier.
void main() {
addNumbers(1);
}
addNumbers(int x, [int? y, int? z]) {
int sum = x + y + z; // 이번엔 여기 y, z 에러
print("$x");
print("$y");
}
에러 이유
숫자랑 null 을 더할 수 없다.
void main() {
addNumbers(1);
}
addNumbers(int x, [int y = 20 , int z = 30]) {
int sum = x + y + z;
print("$x");
print("$y");
print(sum);
}
[ ] 안에 default value 를 써주면 된다.
named parameter
이름이 있는 파라미터
순서가 중요하지 않다.
void main() {
addNumbers(x: 1, y: 2, z: 3);
addNumbers(y: 2, z: 3, x: 1);
// 이 둘은 결괏값이 같다.
}
addNumbers({required int x, required int y, required int z}) { // 여기도 순서를 바꿔도 마찬가지
int sum = x + y + z;
print("$x");
print("$y");
print(sum);
}
void main() {
addNumbers(x: 1, y: 2);
addNumbers(y: 2, z: 3, x: 1);
}
addNumbers({required int y, required int x, int z = 10}) {
int sum = x + y + z;
print("$x");
print("$y");
print("$z");
print(sum);
}
반환형
void main() {
int result = addNumbers(x: 1, y: 2);
}
int addNumbers({required int y, required int x, int z = 10}) {
int sum = x + y + z;
return sum;
}
named parameter 와 positional paramter 같이 쓰고 싶다면?
void main() {
int result = addNumbers(1, z: 2, y: 1);
print(result);
}
int addNumbers(int x, {required int y, int z = 10}) {
int sum = x + y + z;
return sum;
}
operation
void main() {
Operation operation = add; // 함수 할당
int result = operation(1,2,3);
print(result);
operation = subtract;
int result2 = operation(1,2,3);
print(result);
}
typedef Operation = int Function(int x, int y, int z);
int add(int x, int y, int z) => x + y + z; // parameter 가 위와 동일해야 함
int subtract(int x, int y, int z) => x - y - z;
하지만 보통 아래와 같은 방식을 쓴다.
void main() {
Operation operation = add;
int result = operation(1,2,3);
print(result);
int result2 = caculate(1,2,3, add);
print(result2);
int result3 = caculate(1,2,3, subtract);
print(result3);
}
typedef Operation = int Function(int x, int y, int z);
int add(int x, int y, int z) => x + y + z;
int subtract(int x, int y, int z) => x - y - z;
int caculate(int x, int y, int z, Operation operation) => x + y + z;
'🐦 Flutter' 카테고리의 다른 글
Flutter 생명주기 (0) | 2022.07.05 |
---|---|
[Flutter] json 파싱 정보글 모음 (0) | 2022.06.24 |
dart 비동기 프로그래밍 (0) | 2022.06.02 |
dart 함수형 프로그래밍 (0) | 2022.05.31 |
dart OOP (0) | 2022.05.30 |