작성자 | 이재영 |
일 시 | 2024. 5. 2 (목) 18:00 ~ 21:00 |
장 소 | 복지관 b128-1호 |
참가자 명단 | 임혜진, 이재영, 성창민, 김명원, 장원준 |
사 진 |
목차
- Records
- Lists
- Sets
- Maps
- 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을 사용하는 이유는 여러 가지가 있는데 다음과 같다.
- Generics 타입을 적절하게 지정하면 생산성이 올라간다.
- Generics을 사용하여 코드 중복을 줄일 수 있다.
- Generics을 사용하여 코드 안정성을 높일 수 있다.
Dart를 공부할 수록 생각보다 매력적인 언어라는 것을 느낄 수 있었다. Dart 공부를 마치는대로 바로 Flutter 프로젝트를 진행하고 싶다.