자동으로 오른쪽 값을 통해 문자형 유추
var
void main() {
var name1 = "dami";
var name2 = "chacha";
print(name1);
name1 = "flutter";
print(name1);
}
변수 내용 수정은 가능하지만 이미 선언된 변수를 다시 선언하는 건 불가능
정수: int, 실수: double
void main() {
// 정수
int num1 = 2;
int num2 = 4;
print(num1 + num2);
print(num1 - num2);
print(num1 / num2);
print(num1 * num2);
// 실수
double num3 = 2.5;
double num4 = 0.5;
print(num3 + num4);
print(num3 - num4);
print(num3 / num4);
print(num3 * num4);
}
맞다 / 틀리다
Boolean
void main() {
// Boolean
bool isTrue = true;
bool isFalse = false;
print(isTrue);
print(isFalse);
}
문자: String
void main() {
// String
String name1 = "cute";
String name2 = "pet";
print(name1);
print(name2);
}
Var의 문자형 유추
void main() {
// String
String name1 = "cute";
print(name1.runtimeType);
// var string
var name2 = "cat";
var name3 = 20;
print(name2.runtimeType);
print(name3.runtimeType);
}
실제로 var이라는 type은 존재하지 않는 것.
그럼 var로 다 선언해주면 되지 않냐?
-> 추후 코드가 길어지면 어떤 형의 변수인지 단번에 구분하기 힘들 수 있음
알아보기 쉽게 String, int 등 그 변수에 적절한 type으로 지정 선언해주되, 어려운 경우에만 var 써주기
void main() {
// String
String name1 = "cute";
String name2 = "cat";
print(name1 + name2);
print(name1 + " " + name2); // cute cat
print("${name1} ${name2}"); // cute cat
print("$name1 $name2"); // cute cat
}
string 값끼리 + 해 문자 붙일 수 있음
-, /, *는 안됨
print("${name1} ${name2}"); 이렇게 써도 됨
print("$name1 $name2"); 이렇게 {} 생략해줘도 똑같은 결과 나옴
dynamic
void main() {
// dynamic
dynamic name1 = "cute";
var name2 = "pet";
print(name1.runtimeType); // String
print(name2.runtimeType); // String
name1 = 20;
print(name1.runtimeType); // int
// name2 = 20;
// print(name2.runtimeType);
}
dynamic type은 어떤 형의 변수도 선언 가능하고 추후 수정시 다른 변수형으로도 변환 가능
하지만 var은 처음 선언한 변수 형으로만 수정 가능
nullable: null이 될 수 있다
non-nullable: null이 될 수 없다
null: 아무 값도 들어있지 않다
void main() {
// null
String name1 = "cute";
// name1 = null -> X
String? name2 = "pet";
name2 = null;
print(name2);
}
어떤 type이든 type 옆에 ?만 붙여주면 null 값 넣을 수 있음
nul이 들어있는 type에 ! 붙이면 현재 이 값은 null이 아니라는 것을 뜻함
final
void main() {
// final
final String name1 = "cute";
// name1 = "asd"; => X
}
type 앞에 final 써서 선언하면 처음 선언했던 변수 값 수정 불가
const
void main() {
// const
const String name1 = "cute";
// name1 = "asd"; => X
}
const도 마찬가지로 처음 선언했던 변수 값 수정 불가
void main() {
final name1 = "cute";
const name2 = "pet";
print("$name1 $name2");
}
final과 const는 변수 type 지정 안해도 작동함
DateTime: 현재 시간
void main() {
DateTime now = DateTime.now();
print(now); // 2023-07-07 19:07:15.714
}
컴파일 버튼 누른 시간이 출력되는 게 아닌, 해당 코드가 실행될 때의 시간이 출력됨
void main() {
final DateTime now = DateTime.now();
print(now);
// const DateTime now = DateTime.now();
// print(now);
}
const는 빌드 타임의 값을 알고 있고, final은 빌드 타임의 값을 알고 있지 않음
빌드 타임: 우리가 작성한 코드를 이진수로 변환하는 시간
const로 DateTime을 하면 빌드 타임 값을 알고 있어야 출력될 수 있는데,
DateTime은 해당 코드가 실행될 때의 시간이 출력되므로 빌드 타임 값을 알고 실행되는 게 아님
-> 그러므로 const로 DateTime 하면 오류 발생
final은 빌드 타임 값을 알고 있지 않아도 선언 가능하기 때문에 사용 가능
값 재정의
void main() {
int num1 = 2;
print(num1 + 2);
print(num1 - 2);
print(num1 / 2);
print(num1 * 2);
print("-"*10);
print(num1 % 2);
print(num1 % 3);
print("-"*10);
num1 ++;
print(num1);
num1 --;
print(num1);
}
++, -- 가능
void main() {
double num1 = 3.0;
print(num1);
num1 += 1;
print(num1);
num1 -= 1;
print(num1);
}
*=, /= 도 가능
void main() {
double? num1 = 3.0;
print(num1);
num1 = null;
print(num1);
num1 ??= 4.0;
print(num1);
}
num1 ??= 4.0; 에서 ??=은 변수에 null이 들어있다면 null값을 오른쪽에 넣어준 값으로 바꾸라는 뜻
null이 아닐 때는 오른쪽 값으로 바꾸지 않음
void main() {
int num1 = 10;
int num2 = 20;
print(num1 > num2);
print(num1 < num2);
print(num1 >= num2);
print(num1 <= num2);
print(num1 == num2);
print(num1 != num2);
}
각 알맞은 bool형 반환
void main() {
int num1 = 10;
int num2 = 20;
print(num1 is int);
print(num1 is String);
print(num1 is! int);
print(num1 is! String);
}
변수 타입에 대해서는 is, is! 이런 식으로 적용 가능
&&: and
||: or
void main() {
bool res1 = 12 > 10 && 1 > 0;
print(res1);
bool res2 = 12 > 10 && 1 < 0;
print(res2);
bool res3 = 12 > 10 || 1 > 0;
print(res3);
bool res4 = 12 > 10 || 1 < 0;
print(res4);
}
List
void main() {
// List
List<String> chacha = ["eye", "nose", "ear"];
List<int> num1 = [1, 2, 3];
print(chacha);
print(num1);
}
<> 안에 형 지정해주고 변수 선언해주면 됨
이미 변수 형 지정되면 리스트 원소를 다른 형으로 지정 불가
ex) List<int> num1 = [1, 2, 3]; 일 때, num1 = [1, 2, "mouse"]; 불가
List 특정 원소 출력, List 길이
void main() {
// List
List<String> chacha = ["eye", "nose", "ear"];
List<int> num1 = [1, 2, 3];
print(chacha);
// index
print(chacha[0]);
print(chacha.length);
}
index는 0부터 시작
전체 List 길이를 넘어서는 index는 출력 불가
List 길이 알고 싶다면 List 변수 이름.length 하면 위 chacha List 경우에는 원소가 3개 있으므로 3이 출력됨
void main() {
// List
List<String> chacha = ["eye", "nose", "ear"];
print(chacha);
// index
print(chacha.length);
chacha.add("mouse");
print(chacha.length);
print(chacha);
}
add() 이용해 List 원소 추가 가능
위 예시의 경우 chacha List에 ["eye", "nose", "ear", "mouse"]로 "mouse"가 추가 됨
void main() {
// List
List<String> chacha = ["eye", "nose", "ear"];
print(chacha);
// index
chacha.add("mouse");
print(chacha);
chacha.remove("nose");
print(chacha);
}
remove() 이용해 List 원소 삭제 가능
chacha List = ["eye", "nose", "ear", "mouse"] 에서 위 예시처럼 remove() 이용 후 출력하면, ["eye", "ear", "mouse"] 출력
void main() {
// List
List<String> chacha = ["eye", "nose", "ear"];
print(chacha);
// index
print(chacha.indexOf("nose"));
}
indexOf() 이용해 index 순서 알 수 있음
위 예시의 경우 nose의 인덱스 순서는 1이기 때문에 1 출력
Map
key, value
void main() {
// Map
// key, value
Map<String, String> family = {
"me" : "dami",
"mommy" : "soyoung",
"cat" : "chacha",
};
print(family);
Map<String, bool> isFamily = {
"dami" : true,
"mommy" : true,
"cat" : true,
"dog" : false,
};
print(isFamily);
isFamily.addAll({
"brother" : true
});
print(isFamily);
print(family["cat"]);
print(isFamily["cat"]);
}
{me: dami, mommy: soyoung, cat: chacha}
{dami: true, mommy: true, cat: true, dog: false}
{dami: true, mommy: true, cat: true, dog: false, brother: true}
chacha
true
void main() {
Map<String, bool> isFamily = {
"dami" : true,
"mommy" : true,
"cat" : true,
"dog" : false,
};
isFamily["father"] = true;
print(isFamily);
}
isFamily["father"] = true; 이런 식으로 Map 원소를 추가해 줄 수도 있음
void main() {
Map<String, bool> isFamily = {
"dami" : true,
"mommy" : true,
"cat" : true,
"dog" : false,
};
isFamily["father"] = true;
print(isFamily);
isFamily.remove("father");
print(isFamily);
}
remove() 함수 안에 삭제하고 싶은 key를 넣어주면 해당 key와 value 삭제됨
{dami: true, mommy: true, cat: true, dog: false, father: true}
{dami: true, mommy: true, cat: true, dog: false}
void main() {
Map<String, bool> isFamily = {
"dami" : true,
"mommy" : true,
"cat" : true,
"dog" : false,
};
isFamily["father"] = true;
print(isFamily.keys);
print(isFamily.values);
}
keys와 values 이용해 각각 key와 value만 가져올 수 있음
(dami, mommy, cat, dog, father)
(true, true, true, false, true)
Set
Map과 비슷하지만, Map처럼 key와 value 짝이 아니라 List처럼 하나의 값들만 저장할 수 있음
List와 Set의 차이: List는 중복 값 들어갈 수 있고, Set은 중복 값 들어갈 수 없음
-> Set은 중복을 자동으로 처리해 준다는 장점있음
void main() {
final Set<String> name1 = {
"chacha",
"coco",
"mongchi",
"coco",
};
print(name1);
name1.add("babpul");
print(name1);
name1.remove("coco");
print(name1);
name1.contains("mongchi");
print(name1);
}
List처럼 add()와 remove() 사용 가능
{chacha, coco, mongchi}
{chacha, coco, mongchi, babpul}
{chacha, mongchi, babpul}
contains() 이용하면 해당 원소가 있는지 bool형으로 나타냄
'CS > Flutter | Dart' 카테고리의 다른 글
| Dart cascading operator, functional programming (0) | 2023.07.12 |
|---|---|
| Dart Functional Programming - map, set, reduce, fold (1) | 2023.07.10 |
| Dart 상속, static, interface, generic (0) | 2023.07.09 |
| Dart OOP - class, instance, getter, setter, private (1) | 2023.07.09 |
| Dart 기본 - if, for, while, function, parameter, typedef (0) | 2023.07.09 |