์ปฌ๋ ์ - List, Map, Set๊ณผ map / where / fold
์ง๋ ๊ธ์์ extension์ ๋ค๋ค์ผ๋, ์ด๋ฒ์ ๊ฐ์ ์ฌ๋ฌ ๊ฐ ๋ด๋ ์ปฌ๋ ์ ์ด๋ค. Kotlin ํ๋ ์ต๊ด์ผ๋ก ์ง๋ฉด ์ฒ์๋ถํฐ ์ด์ํ ๊ณณ์ด ๋ช ๊ตฐ๋ฐ ์๋ค. ์ซ์ ๋ฆฌ์คํธ์์ ์ง์๋ง ๋ฝ์์ 2๋ฐฐ๋ก ๋ง๋ค์ด๋ณด์.
void main() {
final numbers = [1, 2, 3, 4, 5];
final result = numbers.filter { it % 2 == 0 }.map { it * 2 }; // ์ฌ๊ธฐ์ ์๋ฌ๋จ
print(result);
}filter๋ผ๋ ๋ฉ์๋๊ฐ ์๋ค๊ณ ์๋ฌ๊ฐ ๋๋ค. Kotlin์ filter๋ Dart์์ **where**๋ผ๋ ์ด๋ฆ์ด๊ณ , ์ง๋ ๊ธ๋ค์์ ๋ณธ ๋๋ก { it ... } ํํ๋ ์ ๋๋ค.
๊ณ ์น ์ฝ๋
void main() {
final numbers = [1, 2, 3, 4, 5];
final result = numbers.where((n) => n % 2 == 0).map((n) => n * 2);
print(result); // (4, 8)
}์ถ๋ ฅ์ด [4, 8]์ด ์๋๋ผ (4, 8)๋ก ๋์จ๋ค. ๊ดํธ ๋ชจ์์ด ๋ค๋ฅธ ๋ฐ๋ ์ด์ ๊ฐ ์๋ค.
map, where๋ List๊ฐ ์๋๋ผ Iterable์ ๋๋ ค์ค๋ค
where์ map์ ๊ฒฐ๊ณผ๋ List๊ฐ ์๋๋ผ Iterable์ด๋ค. Iterable์ "ํ๋์ฉ ๊บผ๋ด ๋ณผ ์ ์๋ ๊ฒ"์ด๊ณ , ๊ฐ์ ๋ฏธ๋ฆฌ ๋ค ๊ณ์ฐํด๋์ง ์๊ณ ํ์ํ ๋ ๊ณ์ฐํ๋(lazy) ์ฑ์ง์ด ์๋ค. ์ถ๋ ฅ์ด (4, 8)์ฒ๋ผ ์๊ดํธ๋ก ์ฐํ๋ ๊ฒ Iterable์ด๋ผ๋ ํ์๋ค.
List๋ก ์ฐ๊ณ ์ถ์ผ๋ฉด .toList()๋ฅผ ๋ถ์ธ๋ค.
final result = numbers.where((n) => n % 2 == 0).map((n) => n * 2).toList();
print(result); // [4, 8]
print(result.length); // 2
print(result[0]); // 4.toList()๋ฅผ ๋นผ๋จน๊ณ result[0]์ ์ฐ๋ฉด ์๋ฌ๊ฐ ๋๋ค. Iterable์๋ [0] ๊ฐ์ ์ธ๋ฑ์ค ์ ๊ทผ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. Kotlin์ filter, map์ด ๋ฐ๋ก List๋ฅผ ๋๋ ค์ฃผ๋๊น ์ด ๋ถ๋ถ์ด ์ ์ผ ํท๊ฐ๋ฆฐ๋ค. Dart์์ map, where ๋ค์๋ .toList()๊ฐ ๊ฑฐ์ ์ต๊ด์ฒ๋ผ ๋ถ๋๋ค๊ณ ๊ธฐ์ตํ๋ฉด ๋๋ค.
List, Set, Map ์ธ ๊ฐ์ง
final list = [1, 2, 2, 3]; // List: ์์ ์์, ์ค๋ณต ํ์ฉ
final set = {1, 2, 2, 3}; // Set: ์ค๋ณต ์ ๊ฑฐ -> {1, 2, 3}
final map = {'์ด๋ฆ': 'ํ๊ธธ๋', '๋์ด': 20}; // Map: ํค-๊ฐ ์[ ]โ List{ }์์ ๊ฐ๋ง โ Set{ }์์ํค: ๊ฐโ Map
์ค๊ดํธ๊ฐ Set๊ณผ Map ๋ ๋ค์ ์ฐ์ด๋๋ฐ, ์์ ํค: ๊ฐ์ด ์๋๋๋ก ๊ตฌ๋ถ๋๋ค. ์ฃผ์ํ ์ ์ ๋น {}๋ Set์ด ์๋๋ผ Map์ด ๋๋ค๋ ๊ฒ์ด๋ค. ๋น Set์ ๋ง๋ค๋ ค๋ฉด ํ์
์ ์ง์ ์ ์ด์ค๋ค.
final emptyMap = {}; // Map<dynamic, dynamic>
final emptySet = <int>{}; // Set<int>
final emptyList = <int>[]; // List<int>Map์ ํค๋ก ๊ฐ์ ๊บผ๋ธ๋ค. ์๋ ํค๋ฅผ ๊บผ๋ด๋ฉด ์๋ฌ๊ฐ ์๋๋ผ null์ด ๋์จ๋ค๋ ์ ์ด null safety์ ์ฐ๊ฒฐ๋๋ค.
dart
final user = {'์ด๋ฆ': 'ํ๊ธธ๋', '๋์ด': 20};
print(user['์ด๋ฆ']); // ํ๊ธธ๋
print(user['์ฃผ์']); // null (์๋ ํค)๊ทธ๋์ user['์ฃผ์']์ ํ์
์ String?์ฒ๋ผ null ๊ฐ๋ฅ ํ์
์ด๊ณ , ์ฐ๋ ค๋ฉด ?.๋ ??๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
print(user['์ฃผ์'] ?? '์ฃผ์ ์์'); // ์ฃผ์ ์์fold - ์ฌ๋ฌ ๊ฐ์ ํ๋๋ก ํฉ์น๊ธฐ
fold๋ ๋ฆฌ์คํธ๋ฅผ ๋๋ฉด์ ๊ฐ์ ํ๋๋ก ๋์ ํ๋ค. ํฉ๊ณ๋ฅผ ๊ตฌํด๋ณด์.
final numbers = [1, 2, 3, 4, 5];
final total = numbers.fold(0, (sum, n) => sum + n);
print(total); // 15fold(์ด๊ธฐ๊ฐ, (์ง๊ธ๊น์ง ๋์ ๊ฐ, ํ์ฌ ํญ๋ชฉ) => ์ ๋์ ๊ฐ) ๊ตฌ์กฐ๋ค. ์์๋๋ก ํ์ด๋ณด๋ฉด ์ด๋ ๋ค.
- ์์:
sum = 0 - ํญ๋ชฉ 1 โ
0 + 1 = 1 - ํญ๋ชฉ 2 โ
1 + 2 = 3 - ํญ๋ชฉ 3 โ
3 + 3 = 6 - ํญ๋ชฉ 4 โ
6 + 4 = 10 - ํญ๋ชฉ 5 โ
10 + 5 = 15
์ฒซ ๋ฒ์งธ ์ธ์ 0์ด ์ด๊ธฐ๊ฐ์ด๋ค. ์ซ์ ํฉ๊ณ๋ฟ ์๋๋ผ, ์ด๊ธฐ๊ฐ์ ๋ฐ๊พธ๋ฉด ๋ค๋ฅธ ํ์
์ผ๋ก๋ ํฉ์น ์ ์๋ค.
final names = ['ํ๊ธธ๋', '๊น์ฒ ์', '์ด์ํฌ'];
final joined = names.fold('', (text, name) => '$text$name ');
print(joined); // ํ๊ธธ๋ ๊น์ฒ ์ ์ด์ํฌKotlin๊ณผ ๋น๊ตํ๋ฉด
ํ๊ณ ์ถ์ ๊ฒ | Dart | Kotlin |
์กฐ๊ฑด์ ๋ง๋ ๊ฒ๋ง |
|
|
๊ฐ ํญ๋ชฉ ๋ณํ |
|
|
ํ๋๋ก ํฉ์น๊ธฐ |
|
|
๊ฒฐ๊ณผ ํ์ |
|
|
ํญ๋ชฉ ํ๋ ์ด๋ฆ | ์ง์ ์ง์ |
|
fold๋ ์ด๋ฆ๋ ๊ตฌ์กฐ๋ ๊ฐ๊ณ , ์ฐจ์ด๋ ๋๋ค๋ฅผ ๊ดํธ ์์ ๋ฃ๋๋ค๋ ๊ฒ๋ฟ์ด๋ค. ์ง์ง ํจ์ ์ ์ด๋ฆ์ด ๋ค๋ฅธ where์, ๊ฒฐ๊ณผ๊ฐ Iterable์ด๋ผ๋ ์ ๋ ๊ฐ์ง๋ค.
์ ๋ฆฌ
- Kotlin์
filter๋ Dart์์where์ด๊ณ , ํญ๋ชฉ ์ด๋ฆ์(n) => ...์ฒ๋ผ ์ง์ ์ ํด์ผ ํ๋ค map,where์ ๊ฒฐ๊ณผ๋ List๊ฐ ์๋๋ผ Iterable์ด๋ผ์, ์ธ๋ฑ์ค ์ ๊ทผ์ด๋length๊ฐ ํ์ํ๋ฉด.toList()๋ฅผ ๋ถ์ธ๋ค[ ]๋ List,{ }์์ ๊ฐ๋ง ์์ผ๋ฉด Set,ํค: ๊ฐ์ด ์์ผ๋ฉด Map์ด๊ณ , ๋น{}๋ Map์ด ๋๋ค- Map์์ ์๋ ํค๋ฅผ ๊บผ๋ด๋ฉด null์ด ๋์ค๋ฏ๋ก
??๋?.๋ก ์ฒ๋ฆฌํ๋ค fold(์ด๊ธฐ๊ฐ, (๋์ , ํ์ฌ) => ์ ๋์ ๊ฐ)์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ํ๋๋ก ํฉ์น๋ค
๋ค์ ๊ธ์์๋ ๋น๋๊ธฐ, Future์ async/await๋ฅผ ๋ค๋ค๋ณด๊ฒ ๋ค.
