- 다트 라이브러리의 주요 기능의 사용 방법 및 예시를 볼 예정 입니다.
- TL;DR : 최대한 내용을 요약하여 표현했습니다.
- 좀 더 자세하고 상세한 내용을 보고 싶으시면 위 원문 링크를 참조 바랍니다.
플러터란 ? 구글에서 개발한 크로스 플랫폼 앱 개발 프레임워크이다. 언어는 구글이 개발한 Dart 를 사용한다. 안드로이드, iOS, Web, Desktop 을 지원하며 구글의 차기 OS Fuchsia의 메인개발환경이 된다고 한다.
이전 글
4. Collections (컬렉션)
Dart는 목록(list), 세트(set) 및 맵(map) 클래스를 포함하는 핵심 콜렉션 API를 제공합니다.
4.1 Lists(리스트)
list 기초 활용
// list 생성자 사용
var vegetables = List();
// 문자열을 사용하여 list 생성
var fruits = ['apples', 'oranges'];
// list에 값 추가하기
fruits.add('kiwis');
// list에 목록 다수의 항목 추가하기
fruits.addAll(['grapes', 'bananas']);
// list의 길이 가져오기
assert(fruits.length == 5);
// 리스트 단일항목 삭제
var appleIndex = fruits.indexOf('apples');
fruits.removeAt(appleIndex);
assert(fruits.length == 4);
// list 의 모든 항목 삭제
fruits.clear();
assert(fruits.length == 0);
indexOf() 예시
var fruits = ['apples', 'oranges'];
// list의 항목 값에 index 기준으로 접근
assert(fruits[0] == 'apples');
// list의 항목 위치 찾기
assert(fruits.indexOf('apples') == 0);
list 의 정렬을 위한 sort() 메소드
sort() 메소드를 통해 값을 정렬 할 수 있습니다. 반환값은 0보다 작거나, 0이거나, 0보다 커야 되며 해당 값을 기준으로 정렬 합니다. 문자열을 비교하는 경우는 compareTo() 메소드를 활용합니다.
var fruits = ['bananas', 'apples', 'oranges'];
// list 정렬
fruits.sort((a, b) => a.compareTo(b));
assert(fruits[0] == 'apples');
generic 을 사용하는 경우 해당 타입의 값만 포함할 수 있습니다.
// 해당 list 는 string 만 포함해야 된다.
var fruits = List<String>();
fruits.add('apples');
var fruit = fruits[0];
assert(fruit is String);
4.2 Sets (세트)
다트의 set은 순차적이지 않은 고유 항목 모음입니다. 집합은 순서가 지정되지 않으므로 색인(index, 위치)별로 집합의 항목을 가져올 수 없습니다.
var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
assert(ingredients.length == 3);
// 중복된 항목을 추가해도 해당 세트에는 변화가 없습니다.
ingredients.add('gold');
assert(ingredients.length == 3);
// 세트에서 항목 제거
ingredients.remove('gold');
assert(ingredients.length == 2);
contains(), containsAll() 메소드를 통해 해당 set이 해당 object를 포함히지 여부를 확인합니다.
var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
// 해당 set 이 해당 item을 포함하는지 점검
assert(ingredients.contains('titanium'));
// 해당 set 이 해당 item 목록을 모두 포함하는지 점검
assert(ingredients.containsAll(['titanium', 'xenon']));
intersection() 을 통해 두 set간 교집합 정보를 얻을 수 있다.
var ingredients = Set();
ingredients.addAll(['gold', 'titanium', 'xenon']);
// 두 set 의 교집합 정보를 생성
var nobleGases = Set.from(['xenon', 'argon']);
var intersection = ingredients.intersection(nobleGases);
assert(intersection.length == 1);
assert(intersection.contains('xenon'));
4.3 map (맵)
일반적으로 사전(dictionary) 또는 해시(hash)라고 하는 map 은 키(key) - 값(value) 쌍의 순서가 지정되지 않은 모음입니다. map 은 쉽게 검색 할 수 있도록 key 와 value 를 연결합니다.
// map은 문자열을 주로 키값으로 사용합니다.
var hawaiianBeaches = {
'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
'Big Island': ['Wailea Bay', 'Pololu Beach'],
'Kauai': ['Hanalei', 'Poipu']
};
// 맵은 생성자로 생성할 수 있습니다.
var searchTerms = Map();
// 맵은 파라미터 타입을 지정하여 특정 key, value 형태로 입력 받을 수 있습니다.
var nobleGases = Map<int, String>();
중괄호(bracket)
[]
을 이용해 값을 설정 및 가져올 수 있으며, remove() 메소드를 통해 값을 제거 할 수 있습니다.
var nobleGases = {54: 'xenon'};
// 해당 키 값에 해당하는 값을 반환한다
assert(nobleGases[54] == 'xenon');
// 해당 map 이 해당 key 값을 가지고 있는지 점검
assert(nobleGases.containsKey(54));
// 해당 key값과 그것의 value를 제거한다
nobleGases.remove(54);
assert(!nobleGases.containsKey(54));
map 에서 모든 key값 또는 value값을 가져올 수 있습니다.
var hawaiianBeaches = {
'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
'Big Island': ['Wailea Bay', 'Pololu Beach'],
'Kauai': ['Hanalei', 'Poipu']
};
// 해당 collection에 정의된 모든 key 정보를 반환(열거형)
var keys = hawaiianBeaches.keys;
assert(keys.length == 3);
assert(Set.from(keys).contains('Oahu'));
// 해당 collection의 값 목록을 반환(열거형)
var values = hawaiianBeaches.values;
assert(values.length == 3);
assert(values.any((v) => v.contains('Waikiki')));
value가 null 도 있기 때문에
containsKey()
를 통해 key 의 존재여부를 선행 파악 합니다.
var hawaiianBeaches = {
'Oahu': ['Waikiki', 'Kailua', 'Waimanalo'],
'Big Island': ['Wailea Bay', 'Pololu Beach'],
'Kauai': ['Hanalei', 'Poipu']
};
assert(hawaiianBeaches.containsKey('Oahu'));
assert(!hawaiianBeaches.containsKey('Florida'));
putIfAbsent()
: 해당 key 가 존재 하지 않으면 대상 함수를 실행 결과를 넣어(put) 줍니다.
var teamAssignments = {};
teamAssignments.putIfAbsent(
'Catcher', () => pickToughestKid());
assert(teamAssignments['Catcher'] != null);
4.4 Collection 공용 메소드
해당 collection이, 비어 있는지(isEmpty) 아닌지(isNotEmpty) 여부 판별
var coffees = [];
var teas = ['green', 'black', 'chamomile', 'earl grey'];
assert(coffees.isEmpty);
assert(teas.isNotEmpty);
forEach()
: 해당 collection 의 item 항목 목록 반복 list, set
var teas = ['green', 'black', 'chamomile', 'earl grey'];
teas.forEach((tea) => print('I drink $tea'));
map 의 경우 key, value를 반환한다
hawaiianBeaches.forEach((k, v) {
print('I want to visit $k and swim at $v');
});
map() 메소드는 해당 item의 값을 처리 후 item의 결과값을 update 한다.
var teas = ['green', 'black', 'chamomile', 'earl grey'];
// map() 메소드는, 사용자가 반환 된 객체에서 항목을 요청할 때까지 함수가 호출되지 않습니다.
var loudTeas = teas.map((tea) => tea.toUpperCase());
loudTeas.forEach(print);
// 즉시 반영되도록 하고자 하는 경우에는 toList(), toMap() 메소드를 사용하면 됩니다.
var loudTeas =
teas.map((tea) => tea.toUpperCase()).toList();
where, any, every
var teas = ['green', 'black', 'chamomile', 'earl grey'];
// 카모마일은 디카페인 입니다.
bool isDecaffeinated(String teaName) =>
teaName == 'chamomile';
// where() 메소드는 해당 item을 가지고 처리한 결과가 true인 항목을 반환합니다.
// 하단의 단축 사용법을 잘 눈여겨 봅니다.(이런 형태를 자주 씁니다, 파라미터 생략 및 자동 대입)
var decaffeinatedTeas =
teas.where((tea) => isDecaffeinated(tea));
// or teas.where(isDecaffeinated)
// any() 메소드는 적어도 하나라도 만족시키면 true를 반환한다
assert(teas.any(isDecaffeinated));
// every() 메소드는 모든 항목이 모두 만족되면 true를 반환합니다.
assert(!teas.every(isDecaffeinated));
맺음말
이번 시간에는 collection 에 대해 알아 봤습니다. javascript의 array가 좀 더 확장된 느낌이랄까요 ? java와 유사점이 많이 있네요 :)
- 이전 시간에 배운 A Tour of the Dart Language 1 2 3 4 는 여유 되시면 반복 학습 부탁 드립니다. 위 내용이 학습된 상태에서 본 내용을 습득해야 이해가 빠른편인지라 :)
읽기 힘든 글 읽어주셔서 (또는 눈팅 이라도) 감사합니다
관련 글 링크
@flutters : 제가 작성한 글 중 fluter 관련 글만 모아서 리스팀 처리
관련글(영문)
연재글
- [FLUTTER] 다트 주요 라이브러리 둘러보기 - 1 / A Tour of the Dart Libraries
- [FLUTTER] DART 언어 기초과정 - 4 / A Tour of the Dart Language
- [FLUTTER] DART 언어 기초과정 - 3 / A Tour of the Dart Language
- [FLUTTER] DART 언어 기초과정 - 2 / A Tour of the Dart Language
- [FLUTTER] DART 언어 기초과정 - 1 / A Tour of the Dart Language
흐으음... 제가 보기엔 완벽하네요...!!! 음... 커피도 java가 맛있고... 음...
커피는 아메리카 NO !
여느 랭기나처럼 대부분 비슷하면서 편리해 보이는게 많네요 ㅎ
네 크게 많이 다르진 않은지라 기본적으로 비슷한거 위주로 사용해 보다가 추후 lib document 참조하여 필요할 때마다 보면서 하면 될거 같을거 같네요 :)