[flutter] Data Types

uengmin·2024년 5월 18일

Flutter

목록 보기
9/20
post-thumbnail

iterable

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]
}

map

  • map 메서드는 iterable(배열그룹)을 대상으로 forEach를 돌린다.
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()를 참고
}

asMap

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]
}

toList

  • toList는 생성되는 값들을 리스트로 만들어서 반환한다. Dart의 List는 매개변수, '= '등으로 전달할 때, 메모리 주소 값으로 전달되어 이름이 다르더라도 한 곳에서 요소를 변경하면 모두 다 변경된다.
  • 그래서 toList를 사용.
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]
}

where

  • where은 배열 요소를 필터링.
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}
}

for or forEach

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
}

List 메서드(add, addAll, length, clear)

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); // []
}

collection If

void main() {
  var giveMeFive = true;
  var numbers = [
      1,
      2,
      3,
      4,
      //giveMeFive가 true일때 5를 List에 추가
      if (giveMeFive) 5,
    ];
  //이것과 같은 의미
 if(giveMeFive){
 	numbers.add(5);
 }
    
}

collection For

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]
}

sort

  • list에 sort() 메서드를 사용해서 값을 정렬 할 수 있다.
  • 반환 값은 0보다 작거나, 0이거나, 0보다 커야되고, 해당 값을 기준으로 정렬한다.
  • 문자열을 비교하는 경우에는 compareTo() 메서드를 사용한다.
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]
}

Maps

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
    }
  ];
}

Sets

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

참고

0개의 댓글