본문 바로가기
Flutter/Dart 입문

[Dart] 6. collection : Lists, Sets, Maps

by Couldi 2021. 10. 12.
반응형

21. 10. 12.

- Could -

 

이 글은 프로그래밍 입문을 Flutter 때문에 Dart로 시작하는 사람들을 위한 글입니다.
프로그래밍 언어가 가지고 있는 기본 컨셉 자체를 Dart라는 언어를 통해 설명하고,
많은 분들이 Flutter를 위해 학습한다고 생각해, 추후 Flutter 학습에 도움이 되는 방향으로 작성되었습니다.
1. collections
    - Lists
    - Sets
    - Maps

 

1. collections

콜렉션이라고 구분을 해서 뭔가 새로운 건가 싶겠지만, 새로운건 아니다. 그저 앞서 배웠던 데이터 타입에 추가로 조금 더 배우는 데이터 타입들이라고 생각하면 된다. 콜렉션이라는 이름에서 느껴지듯, 이 데이터 타입들은 데이터들이 모여있는 일종의 데이터 묶음이라고 생각하자. 

 

https://dart.dev/guides/language/language-tour#lists

 

A tour of the Dart language

A tour of all the major Dart language features.

dart.dev

 

doc 을 보면 collecions이라고 따로 분류도 않고 그냥 built-in datatypes에 Lists, Sets, Maps 등이 있다. 일단 이 세개가 데이터 묶음을 다루는 데이터 타입이라고 생각하고 차근차근 다루는 법을 알아보자.

 

Lists

List 만들기

[7, 13, 25, 3]
['사과', '배', '포도', '귤', '딸기']

 

리스트는 위와 같은 형태로 적는 데이터 타입이다. 중요한 점은 데이터들의 나열을 대괄호를 사용해서 묶어 두었다는 점이다.

10, 123, 55, 35 전부 int 타입의 데이터이고, '사과', '배', '포도', '귤', '딸기' 는 String 타입의 데이터다.

이런 열거된 타입의 데이터들을 프로그래밍을 처음 공부하는 입장에서는 왜 배워야 하나 싶을 지도 모른다. 하지만 매우 중요하다. 이런 데이터 타입을 능숙하게 다룰 수 있냐 없냐가 향후 프로그래밍의 학습 난이도를 결정한다.

 

리스트라는 데이터 타입이 어떻게 생긴 애들인 줄 알았으니 이제 '변수'에 넣어 다뤄보자.

 

List<int> studentNumbers = [7, 13, 25, 3];
List<String> fruits = ['사과', '배', '포도', '귤', '딸기'];

 

변수에 넣을때는 위와 같이 선언해주는게 정석이다. List를 적고, 리스트 안에 들어갈 데이터타입의 종류 <>를 사용하여 적어준다. 

위의 예제처럼 int형 데이터들이 모여있는 리스트는 List<int>로 String형 데이터들이 모여있는 리스트는 List<String> 이라고 데이터타입을 적어준다.

 

cf. doc를 보면 var 라는데 이건 뭔가요?
doc을 보면 리스트에 설명하는 예제에서 var라는 데이터 타입을 사용한다. 이건 상자를 만들때 데이터타입 상관없이 아무거나 넣을 수 있는 상자를 정의하는 거라고 보면 된다.
var box1 = [1, 2, 3, 4, 5];
var box2 = 10;
var box3 = '아무거나';


변수를 선언할 때 이처럼 var를 사용하면 안에 어떤 데이터를 담아도 된다. 하지만 가능하면 사용하지 않기를 권한다. 특정 데이터 타입만을 받아야하는 구조에서 var를 활용해 코드를 짜두면 온갖 타입의 데이터들이 들어올 수도 있고, 추후 코드를 다시 봐야하는 경우, 각 변수들에 어떤 데이터타입이 들어가는지 데이터를 하나하나 살펴보며 타입을 확인해야하는 불편함이 생기게 된다.

그러니 예제 혹은 정말 불가피한 경우에만 사용하는 걸로 약속하자.

 

List 활용

 

  List<int> studentNumbers = [7, 13, 25, 3];
  List<String> fruits = ['사과', '배', '포도', '귤', '딸기'];
  
  print(studentNumbers);
  print(fruits);
  
  print(studentNumbers[0]);
  print(fruits[3]);
  
  print(studentNumbers.length);
  print(fruits.length);

 

  • List 출력하기
    기본적으로 List를 다룰때 할 줄 알아야 하는 것들이다. 위의 코드는 List출력하기, List 안 데이터 출력하기, List 길이 세기를 설명한다.먼저, List를 출력하는건 다른 변수들을 사용할 때와 크게 다르지 않다. 리스트가 들어있는 변수의 변수명을 적어주면 간단히 해결된다.

  • List 안 데이터 출력하기
    List안 데이터를 출력하는 법을 이해는 것이 가장 중요하다. 리스트 안에 데이터는 나열되어있는 순으로 순서가 메겨지는데 index가 메겨졌다고 표현한다. 이때 부여된 데이터의 인덱스 숫자를 통해 리스트에서 데이터를 꺼내온다.

    index가 메겨지는 순서는 아래와 같다.


    눈여겨 봐야할 점은 숫자가 0부터 메겨진다는 점이다. 컴퓨터는 숫자를 0부터 세기때문에 index도 0, 1, 2, 3, ... 순으로 메겨진다.
    그러면 아래 코드의 결과값을 예측해보자.

    print(studentNumbers[0]);
    print(fruits[3]);​

    studentNumbers[0]은 studentNumbers에서 맨 처음 값인 7이 나오게 되고, fruits[3]에서는 4번째 값인 '귤'이 나오게 된다.
    DartPad를 이용해 이숫자 저숫자 바꿔보면서 테스트 해보자.

  • List 길이 세기: .length
    List의 길이는 List안에 몇개의 데이터가 들어있는지를 나타낸다. 리스트 안에 데이터가 6개가 들어있다면 List의 length는 6이 된다.변수명을 적고 .을 찍으면 사용할 수 있는 메소드 들이 나오는데 그 중 length라는 메소드를 통해 알아 볼 수 있다.
메소드?
복잡하게 설명하면 한도 끝도 없으니 간단하게 설명한다. 메소드는 자주 사용하게되는 기능들을 사전에 명령어로 만들어 둔거라 생각하면 된다. 엉터리 설명이지만 하지만 초보자들은 이정도만 알아도 메소드를 사용하는데 큰 무리 없다. 나중에 클래스를 공부하거든 그 이후에 더 자세히 알아보자. 

 

  • List 에 데이터 추가하기: .add()
    List에 데이터를 추가하는 방법 중 가장 간편하게 사용하는 것은 add 메소드를 사용하는 것이다.
    studentNumbers.add(19);

    이런 식으로 add를 적고 괄호안에 추가하고 싶은 데이터를 집어넣으면 된다. 그러면 리스트의 제일 마지막에 19 라는 데이터가 추가된다.
    여기서 설명할 메소드들 말고도 많은 메소드들이있다. DartPad를 통해 각 메소드가 어떤 기능을 하는지 알아보면 추후 공부할때 도움이 된다. 굳이 외울 필요는 없다. 자주 쓰다보면 저절로 외워질 것이니, 필요할때 마다 검색해서 찾아 쓰는 습관을 들이자.위의 studentNumbers 리스트가 [7, 13, 25, 3, 19] 이렇게 된다. 19를 불러오기 위해서는 index가 4이므로 studentNumber[4]로 불러올 수 있다.

 

 

 

Sets

Set은 설명을 안할까하다가 List를 설명한 김에 곁다리로 설명한다. List와 비슷하다. 차이가 있다면 리스트의 경우, 리스트안 데이터에 순서(index)가 있고, 중복이 가능한 데이터 타입이지만, Set의 경우는 순서가 없고, 중복된 데이터가 존재할 수 없다는 특징을 가진다.

 

Set<String> halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

 

List와 거진 사용방법은 동일하다. 차이가 있다면 List가 아니라 Set이라 적는 점, [] 대신 {} 를 사용한다는 점이 있다.

List만으로도 머리가 터질것 같다면, 이 아이를 생각하는 건 조금 미뤄두자. 이런게 있었구나만 기억하기.

 

Maps

Map은 List와 양대산맥을 이룬다고 할 정도로 중요한 데이터 타입이다. List가 입력되어있는 순서에 따라 index를 부여했다면, Map은 key-value 쌍이라는 구조를 가지는 데이터 타입이다.

 

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

Map<String, String> gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

 

위와 같은 방식으로 작성한다. doc에서는 var를 사용해서 변수를 정의해주었지만 그렇게 하는 것보단 Map<key의 데이터타입, value의 데이터타입> 이런 식으로 적어주는게 더 좋다. 콜론을 기준으로 앞에 적히는 것은 Key이고 뒤에 적히는 것은 Value이다.

 

Maps 활용

 

Map<String, String> gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};
  
    // map 출력하기
    print(gifts);
  
  
    // map 안에 데이터 출력하기 
    print(gifts['second']);
  
    // map에 데이터 추가하기
    gifts['fourth'] = 'flower';
    print(gifts['fourth']);

 

  • Map 출력하기
    다른 변수를 사용하는 것이나 리스트를 사용할 때와 동일하다. print문을 사용했을 경우 어떤 식으로 출력되는지 확인해두자.
  • Map 안 데이터 출력하기
    리스트를 사용할때와 비슷하다. 리스트는 변수명을 적고 []안에 index를 넣었다면, Map에서는 index 대신 key를 적어준다.
  • Map에 데이터 추가하기
    Map과 List의 가장 다른 점이라고 한다면, Map이 key-value 쌍 구조로 이루어 졌다는 점이다. 그래서 데이터를 추가할때도 key와 value 쌍을 맞춰서 적어주어야하는데 추가하고 싶은 key를 [] 안에 적고, 거기에 데이터를 할당하는 식으로 작성하면 된다.

 

추가적으로 Map 역시 List와 마찬가지로 많은 메소드를 가지고 있다. 메소드를 사용하는 방법만 익혀두고, 어떤 메소드가 있는지는 DartPad를 통해 하나하나 읽어보며 알아가자.

 

dynamic
Dart를 공부하다보면 아까 다뤘던 var 말고도 dynamic이라는 데이터타입을 다루게 된다. dynamic도 var와 같이 데이터타입 상관없이 내용물을 담을 수 있는 상자 같은 것이라 생각하면 된다. Map을 다룰때 비교적 많이 사용하게 되는데, 이는 value가 통일된 데이터타입을 가지고 있지 않은 경우가 많기 때문이다. 아래와 같이 다소 복잡한 구조의 Map도 사용이 된다. Map안에 들어가는 value로 List도 올수 있고, 또다른 Map이 올 수도 있다. 이런 경우 dynamic을 사용하게 된다고 알아두자.
(Tip. 데이터 구조가 복잡할수록 코딩의 피로도가 올라가므로, 가능한 직관적이고 간단한 구조로 데이터를 관리하는 것이 중요하다.)
Map<String, dynamic> james = {
    'name': 'James',
    'Height': 186.5,
    'Weight': 78.1,
    'age': 43,
    'favorit color': ['red','orange', 'green'],
    'family': { 'wife': 'Lily',
                'son': 'Harry',
                'daugther': 'Marry'},
};​

 

 

여기까지 공부했다면 List와 Map이라는 특이한 데이터자료형을 배우긴 배웠는데, 이게 왜 필요한지, 그리고 어떻게 사용해야할지 의문이 들 수 있다. 그런 의문이 들면 좋고, 안들어도 괜찮다. 다음으로 다룰 반복문을 통해 List와 Map을 복습해 보면서 조금씩 사용법에 익숙해져 나가면 된다.

 

추가. 위의 james라는 Map에서 orange를 출력하고 싶다면 어떻게 코드를 작성해야할까?

print(james['favorit color'][1]);

 

그렇다면 Harry나 Marry를 가져오려면?? 한번 생각해 보도록 하자.

반응형

'Flutter > Dart 입문' 카테고리의 다른 글

[Dart] 8. Function  (0) 2021.10.15
[Dart] 7. 반복문 : while, for, forEach, for (... in...)  (0) 2021.10.14
[Dart] 5. 조건문  (0) 2021.10.08
[Dart] 4. 변수와 연산  (0) 2021.10.07
[Dart] 3. 데이터, 값, 타입  (0) 2021.10.06

댓글