List 선언
void main() {
// #1
List favouriteFood = [];
print(favouriteFood); // []
// #2: 이 방법을 사용하면 몇 가지 기능을 사용할 수 있는데, 그건 나중에...
List favouriteFood2 = new List();
print(favouriteFood2); // []
}
List에 값 넣기
void main() {
// #1
List favouriteFood = [];
print(favouriteFood); // []
// #2
List favouriteFood2 = new List();
print(favouriteFood2); // []
favouriteFood.add('케사디야');
favouriteFood.add('삽겹살');
favouriteFood.add('치킨');
print(favouriteFood); // [케사디야, 삽겹살, 치킨]
}
,
로 구분한다.add
를 사용해서 List에 값을 넣을 수 있다.List의 index
void main() {
// #1
List favouriteFood = [];
print(favouriteFood);
// #2
List favouriteFood2 = new List();
print(favouriteFood2);
favouriteFood.add('케사디야');
favouriteFood.add('삼겹살');
favouriteFood.add('치킨');
print(favouriteFood); // [케사디야, 삽겹살, 치킨]
print(favouriteFood[0]); // 케사디야
print(favouriteFood[1]); // 삼겹살
print(favouriteFood[2]); // 치킨
favouriteFood[1] = '장어';
print(favouriteFood); // [케사디야, 장어, 치킨]
}
List[index]
를 통해 List의 값에 접근이 가능하다.List에서 값 빼기
void main() {
// #1
List favouriteFood = [];
print(favouriteFood);
// #2
List favouriteFood2 = new List();
print(favouriteFood2);
favouriteFood.add('케사디야');
favouriteFood.add('삼겹살');
favouriteFood.add('치킨');
print(favouriteFood);
favouriteFood.removeAt(1); // 삼겹살 안녕
print(favouriteFood); // [케사디야, 치킨]
}
removeAt
와 List의 index
값을 이용해서 List의 값을 제거할 수 있다.List 안에 어떤 타입을 넣을 지 선언하기
void main() {
List<String> favouriteFood = [];
favouriteFood.add('케사디야');
print(favouriteFood);
// favouriteFood.add(1); // Error: int는 넣을 수 없어
}
List의 길이를 제한하기(자주 사용하지는 않음)
void main() {
// Growable List
List<String> favouriteFood = [];
favouriteFood.add('케사디야');
favouriteFood.add('케사디야1');
favouriteFood.add('케사디야2');
favouriteFood.add('케사디야3');
favouriteFood.add('케사디야4');
favouriteFood.add('케사디야');
favouriteFood.add('케사디야');
favouriteFood.add('케사디야');
// ...
print(favouriteFood); // [케사디야, 케사디야1, 케사디야2, 케사디야3, 케사디야4, 케사디야, 케사디야, 케사디야, ...]
}
Growable List
: 리스트의 사이즈가 자유롭게 늘어나거나(메모리가 허락하는 한까지) 줄어들 수 있는 Listvoid main() {
// 길이가 3인 List를 만들겠다는 말.
List<String> countryList = new List(3);
print(countryList); // [null, null, null]
// countryList.add('Korea'); // Error: add를 사용할 수 없어...
// countryList.removeAt(0); // Error: removeAt을 사용할 수 없어...
countryList[0] = 'Korea';
countryList[1] = 'Mexico';
countryList[2] = 'Peru';
print(countryList); // [Korea, Mexico, Peru]
}
Fixed Length List
: 선언할 때, 길이가 정해져서 추가적으로 길이를 늘이거나 줄일 수 없는 Listadd
와 removeAt
메서드를 사용할 수 없고, List의 index
를 이용해서 새로운 값을 할당해 줄 수 있다.List에 값을 넣은 채로 선언하기
void main() {
// #1
List favouriteFood = ['케사디야', '삼겹살', '치킨'];
print(favouriteFood); // [케사디야, 삼겹살, 치킨]
// #2 : from을 사용
List favouriteFood2 = new List.from(['케사디야', '삼겹살', '치킨']);
print(favouriteFood2); // [케사디야, 삼겹살, 치킨]
print(favouriteFood2.length); // 3
}
List의 길이를 알아내는 length
void main() {
List thingsToLearn = [
'Dart',
'Flutter',
'JavaScript',
'React',
'TypeScript',
'NodeJS',
'Python',
'etc'
];
print(thingsToLearn.length); // 8
}
key
, value
짝꿍Map 선언 방법
void main() {
Map dictionary = {};
}
Map에 key와 value 넣기
void main() {
Map dictionary = {
'apple': '사과',
};
}
map
을 선언하고, apple이라는 key
와 사과라는 value
를 입력한다.Map에 여러 개의 key와 value를 선언하기
void main() {
Map dictionary = {
'apple': '사과',
'banana': '바나나',
'watermelon': '수박',
};
}
Map의 value에 접근하기
void main() {
Map dictionary = {
'apple': '사과',
'banana': '바나나',
'watermelon': '수박',
};
print(dictionary); // {apple: 사과, banana: 바나나, watermelon: 수박}
print(dictionary['apple']); // 사과
print(dictionary['watermelon']); // 수박
}
Map
의 Value
에 접근하기 위해서 key
를 대괄호에 넣어서 사용한다.Map에 값 넣기
void main() {
Map dictionary2 = {};
print(dictionary2); // {}
dictionary2.addAll({
'apple': '사과',
'banana': '바나나',
'watermelon': '수박',
});
print(dictionary2); // {apple: 사과, banana: 바나나, watermelon: 수박}
}
Map
에 값을 넣으려면 addAll
을 사용한다.Map에 있는 값 지우기
void main() {
Map dictionary2 = {};
print(dictionary2);
dictionary2.addAll({
'apple': '사과',
'banana': '바나나',
'watermelon': '수박',
});
print(dictionary2); // {apple: 사과, banana: 바나나, watermelon: 수박}
dictionary2.remove('watermelon');
print(dictionary2); // {apple: 사과, banana: 바나나}
}
Map
에서 값을 지우려면 remove
를 사용한다.Map에 있는 값을 변경하기
void main() {
Map dictionary2 = {};
dictionary2.addAll({
'apple': '사과',
'banana': '바나나',
'watermelon': '수박',
});
print(dictionary2); // {apple: 사과, banana: 바나나, watermelon: 수박}
dictionary2['banana'] = '노란색';
print(dictionary2); // {apple: 사과, banana: 노란색, watermelon: 수박}
}
key
로 접근해서 값을 변경해줄 수 있다.Map을 선언하는 다른 방법
void main() {
// List 선언 방법
List list = new List();
// #1
Map dictionary = {};
// #2
Map dictionary2 = new Map();
// #2 방법에서 처음부터 값을 넣고 선언하려면
Map dictionary3 = new Map.from({
'apple': '사과',
'banana': '바나나',
});
print(dictionary3); // {apple: 사과, banana: 바나나}
}
Map의 key 또는 value만 가져오기
void main() {
Map dictionary3 = new Map.from({
'apple': '사과',
'banana': '바나나',
});
print(dictionary3); // {apple: 사과, banana: 바나나}
// key만 가져오기
print(dictionary3.keys.toList()); // [apple, banana]
// value만 가져오기
print(dictionary3.values.toList()); // [사과, 바나나]
}
Map에 넣을 값의 타입을 지정해서 만들기
void main() {
// 첫 번째는 key의 타입
// 두 번째는 value의 타입
Map<String, int> price = {
'apple': 2000,
'banana': 4000,
'watermelon': 6000,
};
print(price); // {apple: 2000, banana: 4000, watermelon: 6000}
}
Map의 key는 절대적으로 Unique해야한다
void main() {
Map dictionary3 = new Map.from({
'apple': '사과',
'banana': '바나나',
});
print(dictionary3); // {apple: 사과, banana: 바나나}
dictionary3.addAll({'apple': '수박'});
print(dictionary3); // {apple: 수박, banana: 바나나}
print(dictionary3['apple']); // 수박
}
List
같은 경우에는 값은 값을 넣어줘도 추가가 되지만, Map
같은 경우에는 덮어씌어진다.key
를 가진 값이 여러개라면, 우리가 어떤 key
의 value
를 불러오는 지 정확하게 알 수 없다.key
유일한 값이어야한다.void main() {
String name = '개발자';
// String name = '엔지니어'; // Error: 'name'은 이미 선언됐어
// name의 값을 바꾸려면
name = '엔지니어';
// #1 #2
// int name = 1; // Error: 'name'은 이미 선언됐어
// #3
// String time timer = '타임 타이머'; // Error
// camelCase
String timeTimer = '타임 타이머';
// #4
String _time = '시간';
// #5 이렇게 혼동하면서 사용하면 협업할 때, 복잡해집니다
String Company = '구글';
}
_
로 시작한다._
를 사용해서 private
변수를 만들 수 있다.class
를 선언할 때다.Final
과 Const
는 기본적으로 똑같이 변수를 한 번 선언하면, 변수의 값을 변경하지 못하게 하는 키워드의 의미를 갖고 있다.final
void main() {
final String name = '개발자';
name = '엔지니어'; // Error: final 변수 'name'에 할당할 수 없어
}
final
은 런타임(코드가 다 컴파일이 되고, 코드가 전부 컴퓨터 언어로 변경이 된 다음)에 값이 지정이 되어있어도 상관이 없다. 실행이 되는 순간에 딱 한번만 선언이 되면 사용이 가능하다.const
void main() {
const String name = '개발자';
name = '엔지니어'; // Error: const 변수 'name'에 할당할 수 없어
}
const
는 컴파일 하는 시간에 값이 지정이 되어야한다.컴파일하는 과정: 사람이 읽기 편한 코드가 컴퓨터가 읽기 편한 코드(01010101101010...)로 변경이 되는 과정
일반적으로 final
이 많이 쓰이고, const
는 Flutter에서 쓰이긴 하지만, 필수는 아니다.
fianl 사용 예시
void main() {
// 코드가 실행하는 시간을 저장하는 함수
final DateTime now = DateTime.now();
print(now);
// 1초 기다렸다가 실행되는 함수
Future.delayed(
Duration(milliseconds: 1000),
() {
final DateTime now2 = DateTime.now();
print(now2);
}
);
}
// 1초가 차이 나는 이유, 컴퓨터가 이해하는 언어로 전환이 끝나고 나서, 그 뒤에 실행이 되는 순간에 `DateTime.now` 값들이 지정이 되고 있다.
// final은 런타임의 값이 지정이 되어도 상관없다.
const 사용 예시
void main() {
// 코드가 실행하는 시간을 저장하는 함수
const DateTime now = DateTime.now(); // Error
print(now);
// 1초 기다렸다가 실행되는 함수
Future.delayed(
Duration(milliseconds: 1000),
() {
const DateTime now2 = DateTime.now(); // Error
print(now2);
}
);
}
// const는 컴파일 하는 시점에 값이 지정되어야하는데, 값이 지정되어있지않아서, `DateTime.now()`라는 값을 알 수 없다. 그래서 Error 발생.
변수 선언 및 변경하는 Operators
void main() {
int number = 2;
print(number + 2);
print(number - 2);
print(number * 2);
print(number / 2);
// 나머지 %
print(number % 2); // 0
print(number % 3); // 2
// ++
number++;
print(number); // 3
// --
number--;
print(number); // 2
//=====================
int number2 = 10;
print(number2);
number2 = 8;
print(number2);
// ??=
// number2가 null이면 4고, 아니면 아무것도 하지마라
number2 ??= 4;
print(number2); // 8
int number3;
print(number3); // null
number3 ??= 4;
print(number3); // 4
int number4 = 2;
// double number4 = 2;
number4 += 1; // number4 = number4 + 1
print(number4); // 3
number4 -= 1; // number4 = number4 - 1
print(number4); // 2
number4 *= 2;
print(number4);
// 나누기(/)는 Dart가 int가 아닌 double로 판단해서 error가 발생한다. number4를 double로 바꿔주면 에러 해결.
number4 /= 2; // Error
print(number4);
}
비교 Operators
int number1 = 1;
int number2 = 2;
print(number1 < number2); // true
print(number1 > number2); // false
print(number1 <= number2); // true
print(number1 >= number2); // false
// 동등 비교
print(number1 == number2); // false
// 같지 않은지 비교
print(number1 != number2); // true
Type 비교(is, is!)
void main() {
int number = 1;
// is
print(number is int); // true
print(number is String); // false
print(number is bool); // false
// is!
print(number is! int); // false
print(number is! String); // true
print(number is! bool); // true
}
논리 operators(&&, ||)
void main() {
// && operator: 모두 다 조건을 충족해야 true
// 12가 10보다 크고 1이 0보다 크다
bool result = 12 > 10 && 1 > 0;
print(result); // true
result = 12 > 10 && 1 < 0;
print(result); // false
// || operator: 하나만 충족하면 true
result = 12 > 10 || 1 < 0;
print(result); // true
result = 12 < 10 || 1 > 0;
print(result); // true
}