ETC/Flutter

[flutter,dart] List의 filled/generate 생성자

dkswnkk 2021. 12. 29. 01:24

개발을 하던 중 이차원 배열이 필요한 상황이 생겼고, 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], [], []]



참고

 

List.filled constructor - List class - dart:core library - Dart API

List .filled(int length, E fill, {bool growable = false} ) Creates a list of the given length with fill at each position. The length must be a non-negative integer. Example: List .filled(3, 0, growable: true); // [0, 0, 0] The created list is fixed-length

api.flutter.dev