[Flutter] 컬렉션 - 데이터의 저장, 조작

kk_0128_·2024년 1월 16일
1

플러터

목록 보기
3/4
post-thumbnail

시리즈 목록


1. [Flutter] 플러터 개발환경 세팅하기

2. [Flutter] 다트 기초 문법

3. [Flutter] 컬렉션 - 데이터의 저장, 조작 (본문)




  • 컬렉션은 여러 값을 하나의 변수에 저장할 수 있는 타입이다.
  • 여러 값을 순서대로 저장하거나(List), 특정 키 값을 기반으로 빠르게 검색해야 하거나(map), 중복된 데이터를 제거할 때 사용한다(set).
  • 컬렉션 타입은 서로의 타입으로 자유롭게 형 변환이 가능하다는 큰 장점이 있다.

1. List 타입


  • 한 변수에 여러 값을 순서대로 저장할 때 사용한다.
  • 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는 아무 값도 반환하지 않는다는 의미
//()에 입력받은 매개변수 지정 가능

List 타입의 기본 제공 함수


  • 한 변수에 여러 값을 순서대로 저장할 때 사용한다.

    1. 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);
    }



    1. 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() 사용
    }



    1. map()
      • List의 값들을 순회해 값을 변경하는 데 사용한다.
      • 매개변수에 함수를 입력해야 하며, 반환 값이 현재 값을 대체한다.
      • 순회가 끝나면 Iterable이 반환된다.
    void main(){
      List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
      print(blackPinkList);
    
      final newList = blackPinkList.map((name) => '블핑 $name',);
      // 리스트의 모든 값을 순회하며 값 앞에 '블랙핑크' 추가
    
      print(newList);
      print(newList.toList()); // Iterable을 List로 다시 변환할 때 .toList() 사용
    }



    1. reduce()
      • List에 있는 값들을 순회하며 매개변수에 입력된 함수를 실행한다.
      • 순회할 때마다 값을 쌓아간다.
      • List 멤버의 타입과 같은 타입을 반환한다.
    void main(){
     List<String> blackPinkList = ['리사', '지수', '제니', '로제'];
    
    final allMembers = blackPinkList.reduce((value, element) => value + ', '+ element);
    // 리스트를 순회하며 값들을 더함
    // 순회가 시작될 때 첫 번째 매개변수(value)는 리스트의 첫 번째 값을 받음
    // 두 번째 매개변수(element)는 두 번째 값을 받음
    // 두 번째 사이클에서 value에 전 사이클의 'value, element' 값이 들어감, 반복
    
    print(allMembers);
    }


    1. 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);
    }





2. Map 타입


  • Key와 value의 짝을 저장한다.
  • 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()로 반환 가능
}





3. Set 타입


  • 중복 없는 값들의 집합이며, 중복을 방지하여 유일한 값들만 존재한다.
  • 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으로 변환, 중복 제거
}





4. enum 타입


  • 열거형(Enumeration)의 줄임말로, 한 변수의 값을 연관된 몇 가지 상수 옵션으로 제한하는 기능이다.
  • 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 코드팩토리의 플러터 프로그래밍 - 최지호(코드팩토리) [도서]

profile
공부 노트 겸 기록장

0개의 댓글