[flutter,dart] List의 filled/generate 생성자
개발을 하던 중 이차원 배열이 필요한 상황이 생겼고, 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], [], []]
참고