카테고리 없음

[Flutter 스터디 2주차] Dart 언어를 익혀보자 (2)

이매애진 2024. 5. 3. 00:11
작성자 이재영
일 시 2024. 5. 2  (목) 18:00 ~ 21:00
장 소 복지관 b128-1호
참가자 명단 임혜진, 이재영, 성창민, 김명원, 장원준
 사 진

 

더보기

목차

  1. Records
  2. Lists
  3. Sets
  4. Maps
  5. Generics

저번 주차에 이어 Dart 언어에 대해 알아보겠다. 이번 주차는 Dart에 내장되어 있는 여러 개의 타입들을 더 살펴보려고 한다.

 

Records

Dart 3.0 버전부터 사용이 가능한 신규 타입이다. Records는 익명성, 불변성, 집계성을 가진 타입으로 다른 컬렉션 유형과 마찬가지로 여러 개체를 하나의 개체로 묶을 수 있다. 하지만 다른 컬렉션 유형과 달리 Record는 크기와 유형이 고정되어 있다. Record는 실제 값이므로 변수에 저장하고, 중첩하고, 함수와 주고받을 수 있으며, list, map, set과 같은 데이터 구조에 저장할 수 있다. 다음으로 사용법을 알아보겠다.

var record = ('first', a: 2, b: true, 'last');

(int, String) record2 = (123, 'A string');

우선 Records의 선언 방법이다. Records를 선언할 때는 변수에 넣을 타입들을 괄호로 묶어서 타입을 지정해준다. var를 사용하여도 된다.

  var record = ('first', a: 2, b: true, 'last');
  print(record);
  print(record.$1);
  print(record.$2);
  print(record.a);
  print(record.b);

사용 방법은 이처럼 Records 필드의 내장된 getter를 통해 엑세스할 수 있다. 레코드는 변경할 수 없으므로 필드에 setter는 없다. 괄호 안에 넣어둔 타입이 record 객체 안에 가진 값들의 타입, 순서가 된다. 위 코드와 같이 record 객체의 해당 순서에 있는 값을 사용할 수 있다.

(실행결과)

Lists

모든 프로그래밍 언어에서 가장 많이 보이는 타입인 List이다. 흔히 배열이라고도 부르며 Dart에서 List 객체로 존재한다.

  var list1 = [1, 2, 3];
  
  List list2 = [1,2,3];

 

 

이런 식으로 선언이 가능하다. 그러나 이 둘에는 차이점이 존재하는데 var로 선언한 list1의 원소들을 보면 모두 정수형인 것을 볼 수 있다. var 타입은 처음 변수 초기화가 발생할 때 그 원소의 자료형을 추정하여 고정시킨다. 때문에 list1의 자료형은 List<int> 형으로 고정되었고, list1에는 정수형을 제외하고 다른 타입의 원소는 들어갈 수 없게된다. 반면 list2는 그런 제약없이 다른 타입의 값들도 들어갈 수 있다.

  var list1 = [1, 2, 3];
  List list2 = [1, 2, 3];
  
  list1[0] = 'A';
  list2[0] = 'A';

  print(list1);
  print(list2);

이런 실행결과를 볼 수 있다.

Sets

Set은 유니크한 항목들로 이루어진 정렬되지 않은 타입이다. Python의 set과 비슷해보인다.

  var set1 = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
  
  Set set2 = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

List와 마찬가지로 var를 통한 선언은 자료형을 추정하기 때문에 set1은 Set<String> 형으로 고정되었고, 값을 추가하려면 고정된 타입으로만 가능하다. List와 굉장히 비슷하지만 다른 점이 있다면 순서가 없기 때문에 인덱싱할 수 없다는 것이다. 그리고 중복이 되지 않기 때문에 같은 값을 Set에 넣으면 추가되지 않는다.

  var set1 = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
  Set set2 = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
  
  set1.add('fluorine');
  print(set1);

Maps

map은 키와 값으로 구성된 객체이다. 키와 값 모두 어떤 타입의 객체든 할당이 가능하다. 각 키들은 유일하지만 값은 중복될 수 있다. Python의 딕셔너리와 비슷해보인다.

  var map1 = {
    'A' : 'A',
    'B' : 'B',
    'C' : 'C'
  };

  Map map2 = {
    1 : 'A',
    2 : 'B',
    3 : 'C',
  };

이런 식으로 Key : Value 로 선언이 가능하며 Lists, Sets과 마찬가지로 var를 사용한 선언은 타입을 추정 후 고정시키는 공통점이 있다. 값을 불러올 때는 map[key]를 통해 Value에 접근이 가능하다. 변수 선언 후 값을 할당하려면 다음과 같이 코드를 작성하면 된다.

  Map map2 = {
    1 : 'A',
    2 : 'B',
    3 : 'C',
  };

  print(map2);

  map2[4] = 'D';

  print(map2);

그리고 만약 Map 객체에 없는 키로 값에 접근하면 Null을 반환한다.

Generics

위에 내용을 보면 <...>로 표시되어 있는 것들을 볼 수 있다. 저 표시는 Collections의 타입을 고정해주는 역할을 한다. 

  List<String> names = [];
  names.addAll(['Seth', 'Kathy', 'Lars']);
  names.add(42); // Error

이렇게 List를 선언하게 될 경우 names 변수에는 String 타입의 원소만 넣을 수 있게된다. 이렇게 Generics을 사용하는 이유는 여러 가지가 있는데 다음과 같다.

  1. Generics 타입을 적절하게 지정하면 생산성이 올라간다.
  2. Generics을 사용하여 코드 중복을 줄일 수 있다.
  3. Generics을 사용하여 코드 안정성을 높일 수 있다.

Dart를 공부할 수록 생각보다 매력적인 언어라는 것을 느낄 수 있었다. Dart 공부를 마치는대로 바로 Flutter 프로젝트를 진행하고 싶다.