개발을 하던 중 이차원 배열이 필요한 상황이 생겼고, Dart에서 C++, Java의 int arr[3][3]={0,}
와 같이 배열의 크기를 지정해줌과 동시에 초기화를 시킬 수 있는지 궁금했다.
List<dynamic> twoDimensionalArray = List.filled( 3,(i) => List.generate(3, (_) => false, growable: false), growable: false);
위와 같이 filled 생성자를 사용하면 손쉽게 크기를 지정해줌과 초기값을 지정해 줄 수 있었다. growable의 경우 default값은 false이며 true일 경우 확장이 가능하다. 위 코드의 경우 twoDimensionalArray = [[false, false, false], [false, false, false], [false, false, false]] 로 3x3 크기로 생성과 동시에 false값으로 초기화된다.
다만 여기서 문제점을 찾아냈는데 twoDimensionalArray[0][0] = true; 를 했더니 예상했던 [[true, false, false], [false, false, false], [false, false, false]] 라는 값이 나오지 않고 [[true, true, true], [false, false, false], [false, false, false]] 로 값이 변환되었다.
공식문서를 찾아보니 filled로 초기화 하면 생성된 모든 요소들은 동일한 fill값을 공유한다는 사실을 알아냈다.
아래 코드를 보면 shared[0]에만 499를 추가했지만 shared[1], shared[2]에도 499라는 값이 추가된 결과를 알 수 있다. 이는 주소 값을 공유하기 때문이다.
var shared = List.filled(3, []); shared[0].add(499); print(shared); // => [[499], [499], [499]]
List.generate를 사용하면 각 생성 요소들이 독립된 주소 값을 사용하여 우리가 흔히 아는 배열처럼 사용할 수 있게 된다.
var unique = List.generate(3, (_) => []); unique[0].add(499); print(unique); // => [[499], [], []]
참고
'ETC > Flutter' 카테고리의 다른 글
[flutter] 무한스크롤 과 새로고침 (pull_to_refresh) (0) | 2022.01.22 |
---|---|
[Flutter] CocoaPods's specs repository is too out-of-date to satisfy dependencies error (0) | 2022.01.13 |
[flutter] listView Scroller disable(리스트 뷰 스크롤 막기) (0) | 2021.12.06 |
[flutter] 서버로 이미지 업로드 하기(Dio, image_picker) (0) | 2021.11.30 |
[flutter] tabar&tabbar view 스와이프 제한하기 (0) | 2021.11.23 |
[flutter] 간단한 막대그래프 구현하기(리뷰 그래프) - vertical_barchart (0) | 2021.11.23 |
댓글