컬렉션
컬렉션은 여러 값을 하나의 변수에 저장할 수 있는 타입임. 여러 값을 순서대로 저장하거나(List), 특정 키값을 기반으로 빠르게 값을 검색해야 하거나(Map), 중복된 데이터를 제거할 때(Set) 사용 됨.
컬렉션 타입은 서로의 타입으로 자유롭게 형변환이 가능하다는 장점이 있음.
1. List 타입
리스트 타입은 여러 값을 순서대로 나열한 변수에 저장할 때 사용됨. 리스트의 구성 단위를 원소라고 함.
리스트명[인덱스] 형식으로 특정 원소에 접근할 수 있음. 인덱스는 원소의 순번이라고 생각하면 됨. 제일 첫 원소는 0으로 지정함.
void main() {
// 리스트에 넣을 타입을 <> 사이에 명시할 수 있음.
List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
print(blackPinkList);
print(blackPinkList[0]);
print(blackPinkList[3]);
print(blackPinkList.length);
blackPinkList[3] = '이도서';
print(blackPinkList);
}
/* 출력값
[리사, 지수, 제니, 로제]
리사
로제
4
[리사, 지수, 제니, 이도서]
*/
리스트 길이는 length를 가져와 확인할 수 있음.
List 타입에는 다트 언어에서 기본으로 제공하는 함수가 많습니다.
그중 가장 많이 사용하는 것은 add(), where(), map(), reduce()가있다.
1.1 add() 함수
// add() 함수
void main() {
List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
blackPinkList.add('이도서'); // 리스트 끝에 추가
print(blackPinkList);
}
/* 출력값
[리사, 지수, 제니, 로제, 이도서]
*/
1.2 where() 함수
`where()` 함수는 List에 있는 값들을 순서대로 순회 하면서 특정 조건에 맞는 값만 필터링 하는데 사용함. 매개변수에 함수를 입력해야 하며, 입력된 함수는 기존 값을 하나씩 매개변수로 입력 받음. 각 값별로 true를 반환하면 값을 유지하고, false를 반환하면 값을 버림.
순회가 끝나면 유지된 값들을 기반으로 이터러블이 반환됨.
void main() {
List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
final newList = blackPinkList.where(
(name) => name == '리사' || name == '지수', // 리사 또는 지수만 유지
);
print(newList);
print(newList.toList()); // Iterable을 List로 다시 변환할 때 .toList() 사용
}
/* 출력값
(리사, 지수)
[리사, 지수]
*/
1.3 map() 함수
`map()`함수는 List에 있는 값들을 순서대로 순회하면서 값을 변경할 수 있음. 매개변수에 함수를 입력해야 하며 입력된 함수는 기존 값을 하나씩 매개변수로 입력받음. 반환하는 값이 현재값을 대체하며 순회가 끝나면 Iterable이 반환됨
void main() {
List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
final newBlackPink = blackPinkList.map(
(name) => '블랙핑크 $name', // 리스트의 모든 값 앞에 '블랙핑크'추가
);
print(newBlackPink);
// Interable을 List로 다시 변환하고 싶을 때 .toList() 사용
print(newBlackPink.toList());
}
/* 출력값
(블랙핑크 리사, 블랙핑크 지수, 블랙핑크 제니, 블랙핑크 로제)
[블랙핑크 리사, 블랙핑크 지수, 블랙핑크 제니, 블랙핑크 로제]
*/
1.4 reduce() 함수
`reduce()` 함수 역시 List에 있는 값들을 순회하면서 매개변수에 입력된 함수를 실행함. 다만 `reduce()`함수는 순회할 때마다 값을 쌓아가는 특징이 있음. 지금까지 배운 함수들은 모두 Iterable을 반환했지만 `reduce()`함수는 List 멤버의 타입과 같은 타입을 반환함.
void main() {
List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
// 리스트를 순회하며 값들을 더함
final allMembers = blackPinkList.reduce((value, element) => value + ', ' + element);
print(allMembers);
}
/* 출력값
리사, 지수, 제니, 로제
*/
기존 함수들과 다르게 reduce() 함수는 매개변수로 함수를 입력받고 해당 함수는 매개변수 2개를 입력받음. 순회가 처음 시작될 때
첫 번째 매개변수(value)는 리스트의 첫 번째 값 즉, '리사'를 받게 되고 두 번째 매개변수(element)는 '지수'를 받게됨.
첫 번째 순회 이후로는 첫 번째 매개변수에 기존 순회에서 반환한 값이 첫 번째 매개변수에 입력되고 리스트에서의 다음 값이(제니) 두 번째 매개변수에 입력이 됨. 그래서 reduce() 함수는 리스트 내부의 값들을 점차 더해가는 기능으로 사용됨.
1.5 fold() 함수
`fold()`함수는 reduce() 함수와 실행되는 논리는 똑같음! `reduce()`함수는 함수가 실행되는 리스트 요소들의 타입이 같아야 하지만, `fold()`함수는 어떠한 타입이든 반환할 수 있음.
void main() {
List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
// reduce() 함수와 마찬가지로 각 요소를 순회하며 실행됨.
final allMembers = blackPinkList.fold<int>(0, (value, element) => value + element.length);
print(allMembers);
}
/* 출력값
8
*/
`reduce()`과 `fold()`비교
| 초기값 | 리스트의 첫 번째 요소 사용 | 내가 원하는 값 지정 가능 |
| 빈 리스트 | 에러 발생 | 초기값 그대로 반환 |
| 데이터 타입 변환 | 불가능 (리스트와 같은 타입) | 가능 (타입을 바꿀 수 있음) |
`reduce()`
- 리스트의 첫 번쨰 요소를 초기값으로 사용
- 빈 리스트에서 에러 발생
- 같은 타입끼리만 연산 가능
- 간단한 합계, 최대값, 최소값 찾기에 적합
`fold()`
- 초기값을 직접 지정 가능
- 빈 리스트에서도 안전하게 동작
- 다른 데이터 타입으로 변환 가능
- 리스트를 문자열로 변환하거나, 복잡한 연산을 할 때 유용함
2. Map 타입
Map타입은 Key와 Value의 짝을 저장함. 순서대로 값을 저장하는데 중점을 두는 리스트와 달리 맵은 Key를 이용해서 원하는 값을 빠르게 찾는데 중점을 둠. Map<Key타입, Value타입> 맵 이름 형식으로 생성함
void main() {
Map<String, String> dictionary = {
"Harry Potter" : "해리포터", // 키타입 : 값타입
"Ron Weasley" : "론 위즐리",
"Hermione Granger" : "헤르미온느 그레인저",
};
print(dictionary["Harry Potter"]);
print(dictionary["Hermione Granger"]);
}
/* 출력값
해리포터
헤르미온느 그레인저
*/
2.1 키와 값 반환받기
모든 Map타입은 키와 값을 모두 반환받을 수 있음. 값을 반환받고 싶은 Map 타입의 변수에 Key와 Value 게터를 실행하면 됨.
(게터와 세터에 대해서는 나중에 정리한다고 나옴!)
void main() {
Map<String, String> dictionary = {
"Harry Potter" : "해리포터",
"Ron Weasley" : "론 위즐리",
"Hermione Granger" : "헤르미온느 그레인저",
};
print(dictionary.keys);
// Iterable이 반환되기 때문에 .toList()를 실행해서 List를 반환받을 수도 있음.
print(dictionary.values);
print(dictionary.keys.toList());
print(dictionary.values.toList());
}
/* 출력값
(Harry Potter, Ron Weasley, Hermione Granger)
(해리포터, 론 위즐리, 헤르미온느 그레인저)
[Harry Potter, Ron Weasley, Hermione Granger]
[해리포터, 론 위즐리, 헤르미온느 그레인저]
*/
여기서 주석을 보면 Iterable이 반환되기 떄문에 .toList()를 실행해서 List를 반환받을 수도 있다고함. 이게 무슨의미냐?
/* 위 코드 예시
print(dictionary.keys)
print(dictionary.values)
*/
var keys = dictionary.keys;
print(keys[0]); // 리스트가 아니기 때문에 인덱스로 접근이 불가능함. 즉, 오류 발생!
이렇게 값을 출력하면 이것은 Iterable 즉, 반복하는 것이지만 List는 아님. 즉 타입은 `Iterable<String>`이란 것임.
하지만, 아래 처럼 `.toList()`가 들어가면 `List<String>`타입으로 되기 때문에 인덱스로 접근도 가능함.
/* 위 코드 예시
print(dictionary.keys.toList());
print(dictionary.values.toList());
*/
var keysList = dictionary.keys.toList();
print(keysList[0]); // "Harry Potter" ← 가능!
/* 이 아래도 가능함!
print(valuesList.length);
print(valuesList.reversed);
print(valuesList.contains("해리포터"));
*/
3. Set 타입
Map이 Key와 Value의 조합이라면 Set은 중복없는 값들의 집합임. Set<타입> 세트 이름 형식으로 생성함. 중복을 방지하므로 유일한 값들만 존재하는걸 보장함.
// Set타입
void main() {
Set<String> blackPink = {"로제", "지수", "리사", "제니", "제니"}; // 제니 중복됨 -> 하지만 Set타입이므로 중복이 되지않음
print(blackPink);
print(blackPink.contains("로제")); // 값이 있는지 확인
print(blackPink.toList()); // 리스트로 변환하기
List<String> blackPink2 = ["로제", "지수", "지수"];
print(Set.from(blackPink2));
}
/* 출력값
{로제, 지수, 리사, 제니} // blackPink 자체를 출력함
true // blackPink 에서 "로제"가 있는지의 여부 파악
[로제, 지수, 리사, 제니] // blackPink를 List로 변경
{로제, 지수} // List타입이었던 blackPink2를 Set타입으로 변환함
*/
4. enum
enum은 한 변수의 값을 몇 가지 옵션으로 제한하는 기능임. 선택지가 제한적일 떄 사용함. String으로 완전 대체할 수 있지만, enum은 기본적으로 자동완성이 지원되고 정확히 어떤 선택지가 존재하는지 정의해둘 수 있음.
// enum
enum Status { // Status라는 열거형을 정의함
approved, // 승인
pending, // 대기 중
rejected, // 거절
}
void main() {
Status status = Status.approved; // status라는 변수를 선언함, 타입은 Status enum이라는 뜻
// 그리고 status의 상태를 approved 상태로 초기화했음
print(status); // 출력값을 보면 Status.approved인데, Dart의 enum은 타입명.값 형태로 출력해줌
print(status.index); // 이것은 approved가 0번째기 때문에 0이라고 출력됨, 만약 pending이었으면 1로 나옴.
}
/* 출력값
Status.approved
0
*/
https://github.com/Leedoseo/Flutter_DartBasic
GitHub - Leedoseo/Flutter_DartBasic
Contribute to Leedoseo/Flutter_DartBasic development by creating an account on GitHub.
github.com
https://www.notion.so/Dart-Flutter-Study-1cf9fd9f157980a5ab7efad394810871?pvs=4
출처:코드팩토리의 플러터 프로그래밍 3판
Dart / Flutter Study | Notion
Made with Notion, the all-in-one connected workspace with publishing capabilities.
www.notion.so
'Flutter > Dart 언어' 카테고리의 다른 글
| [Flutter / Dart] Dart 기초문법(함수와 람다) (2) (0) | 2025.04.03 |
|---|---|
| [Flutter / Dart] Dart 기초문법(함수와 람다) (1) (0) | 2025.04.02 |
| [Flutter / Dart] Dart 기초문법(제어문) (0) | 2025.03.31 |
| [Flutter / Dart] Dart 기초문법(연산자) (0) | 2025.03.31 |
| [Flutter / Dart] Dart 기초문법(변수 선언) (0) | 2025.03.17 |