반응형

List 타입

리스트(List) 타입은 여러 값을 순서대로 한 변수에 저장할 때 사용된다. 리스트의 구성 단위를 원소라고 하는데 파이썬과 같이 리스트명[인덱스] 형식으로 특정 원소에 접근할 수 있다.

인덱스는 원소의 순번인데 가장 첫번째가 1이 아니라 0부터 시작한다는 것을 주의해야 한다. 따라서 마지막 원소는 '리스트 길이 - 1'로 지정해야 한다.

아래의 예시를 통해 살펴보자.

List를 선언할 때는 List <데이터 타입> 리스트명 = [값, 값, 값, ...] 과 같은 형식으로 선언한다.

다트를 공부할수록 자바와 파이썬을 섞어놓은 것 같다는 느낌이 많이 든다. 자바의 컬렉션과 파이썬의 리스트가 섞여있는 느낌이다.

기본적인 리스트 선언과 출력, 길이 반환은 위 코드를 통해 충분히 살펴볼 수 있다. 덧붙여 설명하자면 리스트의 길이는 파이썬의 경우 len() 함수를 사용하지만, 다트에서는 length를 가져와 확인할 수 있다.

추가로, List 타입에는 다트 언어에서 기본으로 제공하는 함수가 많은데 그 중에서도 가장 많이 사용되는 add(), where(), map(), reduce(), fold() 함수에 대해 알아보고자 한다.

 

1. add() 함수

add() 함수는 파이썬의 append() 함수와 같이 List에 값을 추가할 때 사용된다. 매개변수에는 추가하고 싶은 값을 입력하면 된다.

예시는 아래와 같다.

2. where() 함수

where() 함수는 List에 있는 값들을 순서대로 돌면서(순회: looping) 특정 조건에 맞는 값만 필터링 하는 데 사용한다.

매개변수에 함수를 입력해야 하며, 입력된 함수는 기존 값을 하나씩 매개변수로 입력받는다. 각 값별로 true를 반환하면 유지하고, false를 반환하면 값을 버린다.

순회가 끝나면 유지된 값들을 기반으로 이터러블이 반환된다.

* 이터러블(iterable)

  • 이터러블은 추상 클래스로 List나 Set 등의 컬렉션 타입들이 상속받는 클래스다. 쉽게 말하면 List와 Set 같은 컬렉션이 공통으로 사용하는 기능을 정의해둔 클래스로 where()나 map() 등 순서가 있는 값들을 반환할 때 사용한다.

 

3. map() 함수

map() 함수는 List에 있는 값들을 순서대로 순회하면서 값을 변경할 수 있다. 매개변수에 함수를 입력해야 하며 입력된 함수는 기존 값을 하나씩 매개변수로 입력받는다. 반환하는 값이 현재값을 대체하며 순회가 끝나면 이터러블이 반환된다.

 

4. reduce() 함수

reduce() 함수 역시 List에 있는 값들을 순회하면서 매개변수에 입력된 함수를 실행한다.

다만 reduce() 함수는 순회할 때마다 값을 쌓아간다는 특징이 있다.

앞서 배운 함수들은 모두 이터러블을 반환했지만 reduce() 함수는 Lists 멤버의 타입과 같은 타입을 반환한다.

기존 함수들과 다르게 reduce() 함수는 매개변수로 함수를 입력받고 해당 함수는 매개변수 2개를 입력받는다. 순회가 처음 시작될 때 첫 번째 매개변수는 리스트의 첫 번째 값인 '리사'를 받게 되고 두 번째 매개변수는 '지수'를 받게 된다. 첫 번째 순회 이후로는 첫 번째 매개변수에 기존 순회에서 반환된 값이 첫 번째 매개변수에 입력되고 리스트에서의 다음 값이(제니) 두 번째 매개변수에 입력된다.

그래서 reduce() 함수는 리스트 내부의 값들을 점차 더해가는 기능으로 사용된다.

 

5. fold() 함수

fold() 함수 또한 reduce() 함수와 실행되는 논리가 동일하다.

다만, reduce() 함수는 함수가 실행되는 리스트 요소들의 타입이 같아야 하지만, fold() 함수는 어떠한 타입이든 반환할 수 있다.

fold() 함수는 reduce() 함수의 특수한 형태라고 생각하면 된다.

reduce() 함수는 리스트를 구성하는 값들의 타입과 반환되는 리스트를 구성할 값들의 타입이 완전히 같아야 하지만 fold() 함수는 그런 제약이 없다. 그래서 첫 번째 매개변수에 시작할 값을 지정하고, 두 번째 매개변수에는 reduce() 함수와 똑같이 작동하는 함수를 입력한다.

다만, 첫 번째 순회 때 리스트의 첫 번째 값이 아닌 fold() 함수의 첫 번째 매개변수에 입력된 값이 초깃값으로 사용된다.

두 번째 매개변수인 (value, element) => value + element.length는 람다식으로 value에는 최초 순회 때는 초깃값(여기서는 0)이 입력되고 이후에는 기존 순회의 반환값이 입력된다.

element는 reduce() 함수와 마찬가지로 리스트의 다음 값이 입력된다.

'Flutter with dart' 카테고리의 다른 글

[Flutter] WebView 위젯  (0) 2023.09.25
[Flutter] 위젯 UI 배치 연습  (0) 2023.09.24
[Flutter] 플러터 위젯 정리  (0) 2023.09.24
[Flutter] 플러터 프로젝트 구조  (0) 2023.07.19
[dart] dart(다트) - 기초 문법  (0) 2023.06.22