Dart를 사용하다보면 toList()과 단짝인
iterable가 자주 나오게 된다.
iterable은 반복이 가능한 그룹을 뜻하고,list나,array등을 의미한다. 참고로,Map은 순서가 없기때문에iterable이 아니다. 하지만,linked Map은 순서가 있어서,iterable이다.
- iterable: A collection of values, or "elements", that can be accessed sequentially.
void main() {
var mylist = [1, 2, 3, 4];
// 얕은(주소)복사: 값이 복사되는 게 아니라 원래 reference를 참조해서 map 안의 함수가 연산되서 결과가 나온다
var newmyList = mylist;
print(newmyList); // [1, 2, 3, 4]
// 깊은 복사(spread operator, 스프레드 연산자 활용)
var spreadList = [10, ...list, 100];
print(spreadList); // [10, 1, 2, 3, 4, 100]
}
void main() {
var list = [1, 2, 3];
var newList = list.map((e) => e + 1); // 각 요소(e)에 1을 더한다
print(list); // [1, 2, 3]
print(newList); // (2, 3, 4)
list[0] = 0;
print(list); // [0, 2, 3]
print(newList); // (1, 3, 4)
// 결론은 깊은 복사가 아니라, 얕은 복사가 되고, 항상 newList를 출력할 때마다,
// list컬렉션에서 (e) => e+1이 연산되서 나온다.
// Dart의 List는 매개변수, '= '등으로 전달할 때, 메모리 주소 값으로 전달되어서
// 이름이 다르더라도 한 곳에서 요소를 변경하면 모두 다 변경된다. 그래서 깊은 복사를 하려면
// 아래, 아래 toList()를 참고
}
void main() {
// asMap: 배열 값에 index 키 값을 삽입해서 반환해준다.
// 키값은 인덱스로 부여되고, 0부터 시작한다.
var words = ['fee', 'fi', 'fo', 'fum'];
var map = words.asMap();
print(map); // {0: fee, 1: fi, 2: fo, 3: fum}
print(map[0]! + map[1]!); // feefi
print(map); // {0: fee, 1: fi, 2: fo, 3: fum}
print(map.keys.toList()); // [0, 1, 2, 3]
}
void main() {
List orderList = [1, 2, 3];
// toList() 사용
List zeroList = orderList.toList();
for (int i = 0; i < zeroList.length; i++) {
zeroList[i] = 0;
}
print(orderList); // [1, 2, 3] => 원본 배열의 값이 변경되지 않는다.
print(zeroList); // [0, 0, 0]
}
void main() {
var list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var filterList = list.where((e) => e % 3 != 0); // 배열에서 3의 배수가 아닌 값만 필터링한다.
print(filterList); // (1, 2, 4, 5, 7, 8, 10)
print(filterList.toList()); // [1, 2, 4, 5, 7, 8, 10]
print(filterList.toSet()); // {1, 2, 4, 5, 7, 8, 10}
}
void main() {
List list = [1, 2, 3, 4];
// for 문
for (int i = 0; i < list.length; i++) {
print(list[i]);
// 1
// 2
// 3
// 4
}
// for in 문(list의 끝까지 반복한다)
for (int i in list) {
print(i);
// 1
// 2
// 3
// 4
}
// forEach 문
list.forEach((e) {
print(e);
});
// 1
// 2
// 3
// 4
}
void main() {
// list 생성자 사용
var vegetables = List.unmodifiable([]);
// 문자열을 사용하여 list 생성
var fruits = ['apples', 'oranges'];
// list에 값 추가하기
fruits.add('bananas');
print(fruits); // [apples, oranges, banana]
// list에 다수의 요소 추가하기
fruits.addAll(['grapes', 'watermelons']);
print(fruits); // [apples, oranges, bananas, grapes, watermelons]
// list의 길이
print(fruits.length); // 5
// list 단일요소 삭제
var bananasIndex = fruits.indexOf('bananas');
print(bananasIndex); // 2
fruits.removeAt(bananasIndex);
print(fruits); // [apples, oranges, grapes, watermelons]
// list의 모든 항목 삭제
fruits.clear();
print(fruits); // []
}
void main() {
var giveMeFive = true;
var numbers = [
1,
2,
3,
4,
//giveMeFive가 true일때 5를 List에 추가
if (giveMeFive) 5,
];
//이것과 같은 의미
if(giveMeFive){
numbers.add(5);
}
}
void main() {
var oldFriends= ['nico', 'lynn'];
var newFriends = [
'lewis',
'ralph',
'darren',
for (var friend in oldFriends) "oldd $friend"
];
print(newFriends);
//[lewis, ralph, darren, oldd nico, oldd lynn]
}
void main() {
// list 정렬, 숫자
var sortNumbers = [100, 22, 55, 333, 1, 128, 1024, 32, 989];
sortNumbers.sort((a, b) => a - b);
print(sortNumbers); // [1, 22, 32, 55, 100, 128, 333, 989, 1024]
// list 정렬, 문자
var sortFruits = [
'kiwis',
'bananas',
'apples',
'oranges',
'watermelons',
'mangos',
'durians',
];
sortFruits.sort((a, b) => a.compareTo(b));
print(
sortFruits); // [apples, bananas, durians, kiwis, mangos, oranges, watermelons]
}
void main() {
//여기서 player는 'Map<String, Object> player'라고 나오게 되는데 단순히 Object = any
var player = {
'name' :'nico',
'xp' : 19.99,
'superpower' : false,
};
//key의 자료형과 value의 자료형 명시
Map<int, bool> test = {
1: true,
2: false,
3: true,
};
//List도 가능
Map<List<int>, bool> listTest = {
[1,2,3,5]: true,
[1,4,7]: false,
};
List<Map<String, Object>> players = [
{
'name': 'nico',
'xp': 10003.55
},
{
'name': 'uengmim',
'xp': 23423
}
];
}
void main() {
//이와 같이 했을 때 numbers는 Set<int> numbers
var numbers = {1, 2, 3, 5};
numbers.add(1);
numbers.add(1);
//Set은 sequence(순서가 있음)으로 List와 같지만 모든 요소가 유니크
print(numbers); //{1,2,3,5}
}
요약
{}Set: 요소가 항상 하나씩만 있어야 할 때 Set[]List: unique할 필요가 없으면 List