[Dart/Flutter] Dart 언어 배우기 6

ryan·2021년 7월 26일
1

Dart/Flutter

목록 보기
12/21
post-thumbnail

링크


25. List 심화(forEach, map, reduce, fold)

forEach

void main() {
  // Looping

  List<String> redVelvet = [
    '아이린',
    '슬기',
    '웬디',
    '조이',
    '예리',
  ];

  // Looping - for loop
  for (int i = 0; i < redVelvet.length; i++) {
    print(redVelvet[i]);
  }

  print('--------------');

  // Looping - for in
  for (String value in redVelvet) {
    print(value);
  }

  print('--------------');

  // Looping - forEach
  // forEach는 return 값을 안 받는다.
  redVelvet.forEach((value) {
    print(value);
  });
}

map

void main() {
  // Mapping

  List<String> redVelvet = [
    '아이린',
    '슬기',
    '웬디',
    '조이',
    '예리',
  ];

  // Mapping - map
  // map에서는 return 값을 받을 수 있다.
  // newList는 함수 안에서 리턴해준 값들이 각각 값에 '새로운 값'으로 집어넣는다.
  final newList = redVelvet.map((value) {
    return '제 이름은 $value입니다.';
  });
  
  print(
      newList); // (제 이름은 아이린입니다., 제 이름은 슬기입니다., 제 이름은 웬디입니다., 제 이름은 조이입니다., 제 이름은 예리입니다.)

  // redVelvet List는 변경되지않았다.
  print(redVelvet); // [아이린, 슬기, 웬디, 조이, 예리]

  // 정리
  // mapping을 하면 새로운 List를 만들 수 있는데, 원래 있는 List를 기반으로 새로운 List를 제작할 수 있다.
  
  // 주의
  // map을 사용하면 ()가 나오는 이유는 => map 위에 마우스를 올리면 => map은 Iterable을 리턴한다고 되어있다.
  // Iterable을 상속(inheritance)에서 List보다 더 부모인 class라고 보면 된다.
  // Iterable, ()로 나온 것을 List로 바꾸고 싶다면 'toList()'라고 함수를 실행하면 된다. ***
  print(newList.toList()); // [제 이름은 아이린입니다., 제 이름은 슬기입니다., 제 이름은 웬디입니다., 제 이름은 조이입니다., 제 이름은 예리입니다.]
}

Reduce/Fold - reduce, fold 함수를 실행한다

void main() {
  // Reduce/Fold

  List<String> redVelvet = [
    '아이린',
    '슬기',
    '웬디',
    '조이',
    '예리',
  ];

  // Reduce/Fold = reduce, fold

  // #1 Fold
  // => Fold는 각각의 값들을 Looping 하면서, 그 값들을 이용해서 total을 쌓아가는 역할을 한다.
  List<int> numbers = [
    0,
    1,
    2,
    3,
    4,
    5,
  ];

  // fold는 position 매개변수가 2개가 들어간다
  // fold(처음에 시작할 값, 함수(a, b))
  int total = numbers.fold(0, (total, element) {
    // 각각의 값들이 element에 들어가고, looping을 할 때마다 처음에는 0부터 시작하고,
    // total이라는 값은 return되는 값이 다음 looping할 때, total 값이 된다.
    return total + element;
  });

  print(total); // 15

  // fold는 값을 쌓아갈 때, 많이 사용된다

  // 진행과정
  // index = 0
  // element = 0
  // total = 0
  // return = 0 + 0 = 0

  // index = 1
  // element = 1
  // total = 0
  // return = 0 + 1 = 1

  // index = 2
  // element = 2
  // total = 1
  // return = 1 + 2 = 3

  // index = 3
  // element = 3
  // total = 3
  // return = 3 + 3 = 6

  //...

  print('-------------------------------------------------------');

  // #2 Reduce
  // Reduce는 position 매개변수로 함수 하나를 받는다
  // Reduce는 fold와 다르게 시작하는 값을 받지 않고, 나머지는 같다
  // Reduce에는 total에 numbers의 첫 번째 숫자가 들어간다
  int total2 = numbers.reduce((total, element) {
    return total + element;
  });

  print(total2); // 15

  print('-------------------------------------------------------');

  // 왜 Reduce와 Fold 두 가지가 필요할까?
  // => Reduce는 시작 값을 생략하기때문에 numbers의 각각의 element 타입과 리턴해주는 타입이 똑같아야한다.
  // => 각 element 타입과 reduce를 사용해서 리턴되는 값이 다르면, reduce를 사용할 수 없다.

  List<String> names = [
    '코드팩토리',
    '레드벨벳',
    'BTS',
  ];

  // fold 사용
  int total3 = names.fold(0, (total, element) {
    return total + element.length;
  });

  print(total3); // 12

  // reduce 사용
  //  final total4 = names.reduce((total, element) {
  //   return total + element.length; // error => 각각 값이 String인데, 리턴 값이 int가 될 수 없다
  //  });
}

arrow function(화살표 함수)

void main() {
  List<String> redVelvet = [
    '아이린',
    '슬기',
    '웬디',
    '조이',
    '예리',
  ];

  List<int> numbers = [
    0,
    1,
    2,
    3,
    4,
    5,
  ];

  // arrow function(화살표 함수)
  // 여러 줄의 코드가 아닌 한 줄의 코드로만 리턴한다면, 화살표 함수를 활용할 수 있다.
  int total3Arrow = numbers.reduce((total, element) => total + element);
  print(total3Arrow); // 15

  // Mapping - map에 화살표 함수 활용
  final newList = redVelvet.map((value) {
    return '제 이름은 $value입니다.';
  });
  print(newList);

  final newListArrow = redVelvet.map((value) => '제 이름은 $value입니다.');
  print(newListArrow.toList());
}

26. Map 심화(entries, asMap)

void main() {
  Map fruits = {
    'Apple': '사과',
    'Banana': '바나나',
    'Kiwi': '키위',
  };

  // keys, values
  print(fruits.keys); // (Apple, Banana, Kiwi)
  print(fruits.values); // (사과, 바나나, 키위)

  // Iterable 타입을 List로 바꾸고싶다면? toList()
  print(fruits.keys.toList()); // [Apple, Banana, Kiwi]
  print(fruits.values.toList()); // [사과, 바나나, 키위]

  // List로 바꾸면 왜 유용할까?
  // => reduce, fold, map, forEach 등, List의 메서드들을 다 사용할 수 있다

  print('-----------------------------');

  // Mapping - map => (entries)
  // entries를 mapping하면 key 값과 value 값을 모두 가져올 수 있다.
  // 제일 위와 다르게, keys가 아니라 key고, values가 아니라 value에 접근한다.
  final newFruits = fruits.entries.map((entry) {
    final key = entry.key;
    final value = entry.value;

    return '$key는 한글로 $value입니다.';
  });
  print(
      newFruits); // (Apple는 한글로 사과입니다., Banana는 한글로 바나나입니다., Kiwi는 한글로 키위입니다.)
  // 따라서, mapping할 때, key 값과 value 값을 사용할 수 있다.

  print('-----------------------------');

  // ForEach
  fruits.entries.forEach((entry) {
    final key = entry.key;
    final value = entry.value;
    print('$key는 한글로 $value입니다.');
    //  Apple는 한글로 사과입니다.
    //  Banana는 한글로 바나나입니다.
    //  Kiwi는 한글로 키위입니다.
  });

  // Reduce/Fold
  final total = fruits.entries.fold(0, (dynamic total, dynamic entry) {
    return total + entry.key.length;
  });

  print(total); // 15 => 가 나와야하는데, Null Safety 때문에 Error 발생

  print('-----------------------------');

  List<int> numbers = [
    10,
    20,
    30,
    40,
    50,
  ];

  // map을 사용하면 index 값을 알기가 쉽지 않다.
  final newMap2 = numbers.map((item) {
    return '값이 $item 입니다,';
  });
  print(newMap2);

  // 쉽게 index와 value 값을 통째로 받는 방법
  // key 값으로 index가 들어가고, value 값으로 List의 값이 들어가서 Map으로 리턴이 된다.
  final newMap3 = numbers.asMap();
  print(newMap3); // {0: 10, 1: 20, 2: 30, 3: 40, 4: 50}

  // 어떻게 사용해야할까?
  // index 값과 value 값을 동시에 mapping 할 수 있다.
  // 이걸 응용해서 forEach를 사용할 수 있고, reduce, fold 등 다른 List 메서드에도 사용할 수 있게 된다!
  final newMap4 = numbers.asMap().entries.map((entry) {
    // index를 entry.key라는 getter로 가져올 수 있다.
    final index = entry.key;
    final value = entry.value;
    return 'index가 $index일 때 값은 $value입니다.';
  });

  print(newMap4.toList());
  // [index가 0일 때 값은 10입니다., index가 1일 때 값은 20입니다., index가 2일 때 값은 30입니다., index가 3일 때 값은 40입니다., index가 4일 때 값은 50입니다.]
}
profile
👨🏻‍💻☕️ 🎹🎵 🐰🎶 🛫📷

0개의 댓글