3. [Flutter] 컬렉션 - 데이터의 저장, 조작 (본문)
- 컬렉션은 여러 값을 하나의 변수에 저장할 수 있는 타입이다.
- 여러 값을 순서대로 저장하거나(
List
), 특정 키 값을 기반으로 빠르게 검색해야 하거나(map
), 중복된 데이터를 제거할 때 사용한다(set
).- 컬렉션 타입은 서로의 타입으로 자유롭게 형 변환이 가능하다는 큰 장점이 있다.
List<자료형> 리스트명 = ['데이터1', '데이터2];
형식으로 선언한다.리스트명[index] 형식으로 원소에 접근이 가능하다.
index는
0부터 시작
, 마지막 원소는리스트의 길이 -1
이다. (length로 길이 확인 가능)
void main() {
List<int> myNumber = [1, 2, 3, 4];
print(myNumber);
print(myNumber[0]); // 0번 index의 값 출력 = '1'
print(myNumber[3]); // 3번 index의 값 출력 = '4'
print(myNumber.length); // myNumber 리스트의 길이 출력(자료의 개수)
myNumber[3] = 5; // myNumber의 3번 index의 값을 5로 변경
print(myNumber[3]); // 3번 index의 값 출력 = '5'
}
}
//void는 아무 값도 반환하지 않는다는 의미
//()에 입력받은 매개변수 지정 가능
한 변수에 여러 값을 순서대로 저장할 때 사용한다.
- add()
- List의 끝에 값을 추가할 때 사용한다.
void main() {
List<int> numberList = [1, 2, 3, 4, 5];
List<int> newList = [];
for (int number in numberList) {
if (number % 2 == 0) {
newList.add(number);
}
}
print(newList);
}
- where()
- List의 값들을 순회해 조건에 맞는 값만 필터링하는 데 사용한다.
- 각 값 별로 true 반환 시 값을 유지하고, false 반환 시 값을 폐기한다.
void main(){
List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
final newList = blackPinkList.where((name) => name=='리사' || name=='지수',);
// blackPinkList 리스트에서 조건을 만족하는 요소들로 새로운 Iterable을 생성
// 각 요소의 이름을 name으로 받아와 조건을 확인
// 조건 중 하나라도 참이면 해당 요소는 새로운 Iterable에 포함
// newList는 blackPinkList에서 '리사' 또는 '지수'인 요소들로 구성된 Iterable임
// 이 때 newList는 Iterable 타입
// .toList() 메소드를 사용하면 List 타입으로 변환 가능함.
print(newList);
print(newList.toList()); // Iterable을 List로 다시 변환할 때 .toList() 사용
}
- map()
- List의 값들을 순회해 값을 변경하는 데 사용한다.
- 매개변수에 함수를 입력해야 하며, 반환 값이 현재 값을 대체한다.
- 순회가 끝나면 Iterable이 반환된다.
void main(){
List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
print(blackPinkList);
final newList = blackPinkList.map((name) => '블핑 $name',);
// 리스트의 모든 값을 순회하며 값 앞에 '블랙핑크' 추가
print(newList);
print(newList.toList()); // Iterable을 List로 다시 변환할 때 .toList() 사용
}
- reduce()
- List에 있는 값들을 순회하며 매개변수에 입력된 함수를 실행한다.
- 순회할 때마다 값을 쌓아간다.
- List 멤버의 타입과 같은 타입을 반환한다.
void main(){
List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
final allMembers = blackPinkList.reduce((value, element) => value + ', '+ element);
// 리스트를 순회하며 값들을 더함
// 순회가 시작될 때 첫 번째 매개변수(value)는 리스트의 첫 번째 값을 받음
// 두 번째 매개변수(element)는 두 번째 값을 받음
// 두 번째 사이클에서 value에 전 사이클의 'value, element' 값이 들어감, 반복
print(allMembers);
}
- fold()
- List에 있는 값들을 순회하며 매개변수에 입력된 함수를 실행한다.
- 순회할 때마다 값을 쌓아간다.
어떠한 타입이든
반환 가능하다.
void main() {
List<String> black = ['글자수', '만큼출력'];
final all = black.fold<double>(0.1, (value, element) => value + element.length);
// index의 개수만큼 사이클 순환
// double 값으로 index의 값들을 변환함
// 초기 value 값을 0.1로 지정, 다음 값인 '글자수'를 element에 지정
// 첫 사이클 순환 시 value = 0.1 + '글자수.length'(3)
// 두 번째 사이클 시 value = 3.1 + '만큼출력.length'(4)
print(all);
}
Map<key 타입, value 타입> map이름 = {키:값, 키:값};
의 형식으로 선언한다.- key를 이용해 원하는 값을 빠르게 찾는 데 중점을 둔다.
void main() {
Map<int, String> intmember = {
1: '해리 포터', // int 키: 'String' 벨류
2: '론 위즐리',
3: '헤르미온느',
};
print(intmember[1]); // int 키에 해당하는 벨류 출력
print(intmember[2]);
Map<String, String> stringmember = {
'1번': 'Harry Poter', // 'String' 키:'String' 벨류
'2번': 'Ron Weasley',
'3번': 'Hermione Granger',
};
print(stringmember['2번']); // 'String' 키에 해당하는 벨류 출력
print(stringmember['3번']);
print(stringmember.keys); // 키 반환, Iterable로 반환되므로 .toList()로 반환 가능
print(stringmember.values);// 벨류 반환, Iterable로 반환되므로 .toList()로 반환 가능
}
Set<타입> set이름 = {값1, 값2};
의 형식으로 선언한다.- 중복되는 값을 제거하여 한 번만 반환한다.
void main() {
Set<String> black = {'로제','지수','리사','제니','제니'}; // 제니 중복
print(black);
print(black.contains('로제')); // 값의 존재 여부 T/F로 반환
print(black.toList()); // List로 변환
List<String> black2 = ['로제','지수','지수'];
print(Set.from(black2)); //List 타입을 Set으로 변환, 중복 제거
}
enum enum이름 {value1, value2, value3};
의 형식으로 선언한다.- 선택지가 제한적일 때 사용한다.
- enum을 사용하면 자동 완성 기능을 통해 가능한 상수 값을 빠르게 확인할 수 있다.
- 컴파일러가 검사할 수 있는 타입이므로, 올바른 상수 값만 사용할 수 있어 잘못된 값을 사용하는 실수를 방지할 수 있다.
enum Color {
Red,
Green,
Blue,
}
void main() {
Color myColor = Color.Green;
print(myColor);
if (myColor == Color.Red) {
print("빨간색입니다.");
} else if (myColor == Color.Green) {
print("초록색입니다.");
} else if (myColor == Color.Blue) {
print("파란색입니다.");
}
}
Must Have 코드팩토리의 플러터 프로그래밍 - 최지호(코드팩토리) [도서]