플러터 Flutter

[Flutter/Drat]다트 유용한 메소드 Method 함수 Function 정리~

dev.mk 2021. 6. 12. 20:23
반응형

Dart에서는 iterable이라는 개념이 있다. 이것은 반복이 가능한 그룹을 뜻하고

iterable?
A collection of values, or "elements", that can be accessed sequentially.

list나 array, 등을 의미한다. Map은 순서가 없기 때문에  iterable이 아니다. 

하지만 linked Map은 순서가 있으니 iterable이다.

- 배열의 복사 방법

var list = [1, 2, 3, 4];

// 얕은(주소) 복사 (값이 복사되는게 아니라 원래 래퍼런스를 참조해서 map안의 함수가 연산되서 결과가 나옴)
var newList = list;
print(newList);  // [1, 2, 3, 4]

// 깊은 복사 ( 스프레드(흩뿌리다) 연산자 )
var spreadList = [10, ...list, 100];

print(spreadList);  //[10, 1, 2, 3, 4, 100]


  

 

- map

map 메소드는 iterable(배열그룹)를을 대상으로 foreach돌린다.

main() {
  var list = [1, 2, 3];  	
  var newList = list.map((e) => e + 1);  //자신에게 1을 더한다.
  print(list); //[1, 2, 3]
  print(newList);  //(2, 3, 4)
  
  list[0] = 0;
  
  print(list); //[0, 2, 3]
  print(newList); //(1, 3, 4)


}

 

 

- asMap 

배열 값에 Index 키 값을 삽입해줘서 반환해준다. 

키값은 인덱스로 부여된다. 0 부터시작

void main() {

	var words = ['fee', 'fi', 'fo', 'fum'];
	var map = words.asMap();  // {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

생성되는 값들을 리스트로 만들어 반환

 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.toString()); //원본 배열의 값이 변경되지 않는다.
}

 

- where

배열요소를 필터링한다.

main() {
  var list = [1,2,3,4];
  var filterList = list.where((e) => e != 3);  //배열중에서 3이 아닌값만 필터한다.
  print(filterList); //[1,2,4];
  
}

 

- for or foreach

배열요소를 반복한다.

main() {
  
  var list = [1,2,3,4];
 // for in 문 (list라는 배열의 끝까지 돈다.)
  for (var e in list) {
    print(e);
    //1
    //2
    //3
    //4
  }


  // forEach 문-
  list.forEach((e) => print(e));
  //1
  //2
  //3
  //4


}

 

- add , addAll , length , clear

main() {

  // list 생성자 사용 
  var vegetables = List();

  // 문자열을 사용하여 list 생성
  var fruits = ['apples', 'oranges'];

  // list에 값 추가하기 
  fruits.add('kiwis');
  print(fruits); //[apples, oranges, kiwis]

  // list에 목록 다수의 항목 추가하기 
  fruits.addAll(['grapes', 'bananas']);
  print(fruits); //[apples, oranges, kiwis, grapes, bananas]

  // list의 길이 가져오기 
  print(fruits.length); //5
  
  // 리스트 단일항목 삭제 
  var appleIndex = fruits.indexOf('apples');
  fruits.removeAt(appleIndex);
  print(fruits); //[oranges, kiwis, grapes, bananas]
  
  // list 의 모든 항목 삭제 
  fruits.clear();
  print(fruits); //[]

}

 

- sort

list 의 정렬을 위한 sort() 메소드
sort() 메소드를 통해 값을 정렬 할 수 있다. 반환값은 0보다 작거나, 0이거나, 0보다 커야 되며 해당 값을 기준으로 정렬 한다.. 문자열을 비교하는 경우는 compareTo() 메소드를 사용

main(){  
  // list 정렬 
  var sortFruits = ['b', 'bananas', 'apples', 'oranges' , 'app'  'az','abbb', 'a' ,'c'];
  sortFruits.sort((a, b) => a.compareTo(b));
  print(sortFruits); //[a, abbb, appaz, apples, b, bananas, c, oranges]
}

 

- firstWhere

요소를 반복하고 주어진 조건의 첫번째 요소를 반환한다.

bool predicate(String element) {
  return element.length > 5;
}

main() {
  var items = ['Salad', 'Popcorn', 'Toast', 'Lasagne'];
  
  // 람다식 문법
  var element1 = items.firstWhere((element) => element.length > 5);
  print(element1); //Popcorn
  
  //리턴형 문법
  var element2 = items.firstWhere((element) {
    return element.length > 5;
  });
  print(element2); //Popcorn
  
  var element3 = items.firstWhere(predicate);
  print(element3); //Popcorn
  
  var element4 = items.firstWhere(
    (element) => element.length > 10,
    orElse: () => 'None!',
  );
  print(element4); //None!
}

firstWhere 랑 indexWhere의 차이점? 

firstWhere 요소를 반환하고 indexWhere 일치하는 테스트의 인덱스를 반환한다.

 

- lastWhere

요소를 반복하고 주어진 조건의 마지막 요소를 반환한다.

 

- fold

배열의 조건을 누적시켜 반환한다.

main() {
  
  List<int> numbers = [0,1,2,3,4,5];
  
  int sum = numbers.fold(0,(total,element){
    //첫번째 시작할 값, total은 이전에 리턴해 준 값이다.
    //(중괄호(기능수행영역)안에서 반복함)
    return total+element;
  });
  
  print(sum); //15
}

// 문법이 진행되는 과정
// index = 0
// element = 0
// vTotal = 0
// return = 0 + 0 = 0
  
// index = 1
// element = 1
// vTotal = 0
// return = 0 + 1 = 1
  
// index = 2
// element = 2
// vTotal = 1
// return = 1 + 2 = 3
  
// index = 3
// element = 3
// vTotal = 3
// return 3 + 3 = 6

index는 numbers 값의 인덱스값이며, 첫번째 파라미터 0번부터 element자리에  numbers값을 할당하며 반복된다.

그리고 total 파라미터 자리엔 이전에 리턴받은 결과값이 누적되는 방식이다.

 

- reduce

사용방식은 fold와 큰 차이가 없고 fold에서는 시작값인 0을 지정하는데, reduce에서는 생략한다.

main() {
  
  List<int> numbers = [0,1,2,3,4,5];
  
  int sum = numbers.reduce((total,element){
    return total+element;
  });
  
  print(sum); //15
  
  
  //람다식 간소화
  int sum2 = numbers.reduce((total, element) => total + element);
  print(sum2); //15
}

 

본문의 참조

https://api.flutter.dev/flutter/dart-core/Iterable/map.html

https://blog.naver.com/PostView.nhn?blogId=getinthere&logNo=222161842230&categoryNo=34&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView 

https://steemit.com/dart/@wonsama/flutter-2-a-tour-of-the-dart-libraries

https://masswhale.tistory.com/entry/Dart%EC%96%B8%EC%96%B4%EA%B3%B5%EB%B6%80-25List-%EC%8B%AC%ED%99%94-forEach-map-reduce-fold

반응형