Frontend ๐Ÿ“š/Flutter

[Dart] Dart ๊ธฐ๋ณธ ๋ฌธ๋ฒ•_(3)

leejaejae 2022. 2. 12. 15:30

7. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

1) ์ผ๊ธ‰ ๊ฐ์ฒด

  • first-class object(์ผ๊ธ‰ ๊ฐ์ฒด): ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ, ์ˆ˜์ •, ๋ณ€์ˆ˜์— ๋Œ€์ž…์ด ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด
  • Dart์—์„  ํ•จ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค(๋žŒ๋‹ค์‹, ์ต๋ช… ํ•จ์ˆ˜, ๋ฉ”์„œ๋“œ)์€ ๋ชจ๋‘ ๊ฐ’์„ ์ทจ๊ธ‰ ๊ฐ€๋Šฅ
void greeting(String text) {
print(text);
}
void main() {
var f = greeting; // ํ•จ์ˆ˜, ๋‹ค๋ฆ„ ๋ณ€์ˆ˜์— ๋Œ€์ž… ๊ฐ€๋Šฅ
f('hello');
}
// ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ „๋‹ฌ or ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ
void something(Function(int i) f) {
f(10);
}
// case1
void main() {
something((value) {
print(value);
});
}
// case2
void myPrintFunction(int i) {
print('์–์– $i');
}
void main() {
something((i) => myPrintFunction(i)); // ์–์– 10
something((i) => print(i)); // 10

2) for ๋ฌธ๊ณผ forEach() ํ•จ์ˆ˜

  • forEach(): ๋‚ด๋ถ€ ๋ฐ˜๋ณต (vs for(): ์™ธ๋ถ€ ๋ฐ˜๋ณต)
  • (E element) {} ํ˜•ํƒœ์˜ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์Œ(E๋Š” ๋ชจ๋“  ํƒ€์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ)
final items = [1, 2, 3, 4, 5];
items.forEach(print); // 1, 2, 3, 4, 5
// ์ต๋ช… ํ•จ์ˆ˜
items.forEach((e) {
print(e);
});
// ๋žŒ๋‹ค์‹
items.forEach((e) => print(e)); // e: items์˜ ๊ฐ ์š”์†Œ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ํ•˜๋‚˜์”ฉ ๋“ค์–ด์˜ฌ ์ธ์ˆ˜, ์ด๊ฒƒ์„ print ํ•จ์ˆ˜์— ์ „๋‹ฌํ•œ๋‹ค๋Š” ์˜๋ฏธ

3) where

  • where(): ์กฐ๊ฑด์„ ํ•„ํ„ฐ๋งํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜
final items = [1, 2, 3, 4, 5];
for (var i = 0; i < items.length; i++) {
if(items[i] % 2 == 0) {
print(items[i]); // 2, 4
}
}
-------------------------------------------------------
// where() ์‚ฌ์šฉ
items.where((e) => e % 2 == 0).forEach(print); // 2, 4

4) map

  • map(): ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ’์„ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜
final items = [1, 2, 3, 4, 5];
for (var i = 0; i < items.length; i++) {
if(items[i] % 2 == 0) {
print('์ˆซ์ž $items[i]'); // ์ˆซ์ž 2, ์ˆซ์ž 4
}
}
--------------------------------------------------------------------------------------
// map() ์‚ฌ์šฉ
items.where((e) => e % 2 == 0).map((e) => '์ˆซ์ž $e').forEach(print); // ์ˆซ์ž 2, ์ˆซ์ž 4

5) toList

  • Dart์—์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜ ๋Œ€๋ถ€๋ถ„์€ Interble<T>๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜ -> ์‹ค์‚ฌ์šฉ์—” ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์ˆ˜
final result = items.where((e) => e % 2 == 0).toList();

6) toSet

  • toSet(): ๋ฆฌ์ŠคํŠธ ์ค‘๋ณต ์ œ๊ฑฐ ํ•จ์ˆ˜
final result = items.where((e) => e % 2 == 0).toSet().toList();

7) any

  • any(): ๋ฆฌ์ŠคํŠธ์— ํŠน์ • ์กฐ๊ฑด ์ถฉ์กฑํ•˜๋Š” ์š”์†Œ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜
print(items.any((e) => e % 2 == 0)); // true

8) reduce

  • reduce(): ๋ฐ˜๋ณต ์š”์†Œ ์ค„์—ฌ๊ฐ€๋ฉด์„œ ๊ฒฐ๊ณผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ ํ•จ์ˆ˜
  • [ํƒ€์ž…]([ํƒ€์ž…] value, [ํƒ€์ž…] element) ํ˜•ํƒœ๋กœ ์ •์˜ -> ํ•ญ์ƒ ๋‘ ์ธ์ˆ˜๋ฅผ ๋ฐ›๊ณ , ๋ฐ˜ํ™˜๊ฐ’์€ ์ธ์ˆ˜์™€ ๊ฐ™์€ ํƒ€์ž…์ด์—ฌ์•ผ ํ•จ
import 'dart:math';
final items = [1, 2, 3, 4, 5];
var maxResult = items[0];
for (var i = 1; i < items.length; i++) {
maxResult = max(items[i], maxResult);
}
print(maxResult); // 5
----------------------------------------------
final items = [1, 2, 3, 4, 5];
print(items.reduce((e,v) => max(e,v))); // 5


8. ๊ธฐํƒ€ ์œ ์šฉํ•œ ๋ฌธ๋ฒ•

1) ๊ณ„๋‹จ์‹ ํ‘œ๊ธฐ๋ฒ•(cascade natation) .. ์—ฐ์‚ฐ์ž

  • ..์—ฐ์‚ฐ์ž: ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜
final items = [1,2,3,4,5];
var result = items;
result.add(6);
result.remove(2);
print(result); // 1, 3, 4, 5, 6
-----------------------------------
print(items
..add(6)
..remove(2)); // 1, 3, 4, 5, 6

2) ์ปฌ๋ ‰์…˜ if

bool promoActive = false;
if (promoActive) {
print([1,2,3,4,5,6]);
} else {
print([1,2,3,4,5]);
}
-------------------------------------
bool promoActive = true;
print([1,2,3,4,5, if (promoActive) 6]); // 1, 2, 3, 4, 5, 6

3) ์ปฌ๋ ‰์…˜ for

var listOfInts = [1,2,3];
var listOfStrings = [
'#0',
for (var i in listOfInts) '#$i'
];
listOfStrings.forEach(print); // #0, #1, #2, #3

4) null ์ฒ˜๋ฆฌ์— ๊ด€ํ•œ ๊ธฐ๋Šฅ

  • null์€ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•˜๊ธฐ ์‰ฌ์›€ -> ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„  if๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ null์ธ์ง€ ์•„๋‹Œ์ง€ ๊ฒ€์‚ฌ
if (name != null){
print(name.length);
}
  • ?.์—ฐ์‚ฐ์ž: Dart์—์„œ ์ œ๊ณต, ๊ฐ์ฒด๊ฐ€ null์ผ ๋•Œ ์—˜๋ฅผ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€์‹  null ๋ฐ˜ํ™˜
print(name?.length); // null ์ถœ๋ ฅ
  • ??์—ฐ์‚ฐ์ž: ๊ฐ์ฒด๊ฐ€ null์ผ ๋•Œ ์ž‘๋™์„ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
if (name != null) {
print(name.length);
} else {
print(0);
}
----------------------------------------------------
print(name?.length ?? 0); // name์ด null ์ด๋ฉด 0์„ ์ถœ๋ ฅ