๐ Today I Learned 7ํ์ฐจ(1) - Dart ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด 2ํ์ฐจ ๐ก
๐ Dart ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด 2ํ์ฐจ
๐ฏ ํ์ต ๋ชฉํ
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ํจ์๋ค์ ์ดํดํ๊ณ ํ์ฉํ ์ ์๋ค
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํด๋์ค, ์์ฑ, ๋ฉ์๋ ๊ฐ๋ ์ ์์งํ๋ค
- ์์ธ ์ฒ๋ฆฌ๋ฅผ ํตํด ์์ ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค
- ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ํ์ ํ๋ค
๐ ์ฃผ์ ๋ด์ฉ
โญ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ๋ง์ด ์ฌ์ฉํ๋ ํจ์
๐ ํ๋ณํ ํจ์
toString()
: ๊ฐ์ ๋ฌธ์์ด๋ก ๋ณํint.parse('')
: String ํ์ ์ ๊ฐ์ int ํ์ ์ผ๋ก ๋ณํdouble.parse('')
: String ํ์ ์ ๊ฐ์ double ํ์ ์ผ๋ก ๋ณํtoList()
: Collection ํ์ ์ ๊ฐ์ List ํ์ ์ผ๋ก ํ ๋ณํSet<String> fruitSet = {'์ฌ๊ณผ', '์ค๋ ์ง', '์๋ฐ'}; var fruitList = fruitSet.toList(); print(fruitList); // [์ฌ๊ณผ, ์ค๋ ์ง, ์๋ฐ] print(fruitList.runtimeType); // List<String>
๐ก ์ฃผ์: Map ํ์ ์
toList()
ํจ์๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
toSet()
: ํน์ Collection ํ์ ์ ๊ฐ์ Set ํ์ ์ผ๋ก ๋ณํํ ๊ฐ์ ๋ฐํList<String> fruitList = ['์ฌ๊ณผ', '์ค๋ ์ง', '์๋ฐ']; var fruitSet = fruitList.toSet(); print(fruitSet); // {์ฌ๊ณผ, ์ค๋ ์ง, ์๋ฐ} print(fruitSet.runtimeType); // Set<String>
asMap()
: ํน์ Collection ํ์ ์ ๊ฐ์ Map ํ์ ์ผ๋ก ๋ณํํ ๊ฐ์ ๋ฐํList<String> fruitList = ['์ฌ๊ณผ', '์ค๋ ์ง', '์๋ฐ']; var fruitMap = fruitList.asMap(); print(fruitMap); // {0: ์ฌ๊ณผ, 1: ์ค๋ ์ง, 2: ์๋ฐ}
๐ก ํต์ฌ: List์ Index๊ฐ Map์ ํค๋ก, List์ ๊ฐ์ด Map์ ๊ฐ์ผ๋ก ํ ๋น๋ฉ๋๋ค. Map์ ํค๋ ๊ณ ์ ํ๊ณ List์ Index๋ ๊ณ ์ ํ๋ฏ๋ก ์๋ฒฝํ ์กฐํฉ์ ๋๋ค! ๐๐ผ
List<String> fruitList = ['์ฌ๊ณผ', '์ค๋ ์ง', '์๋ฐ', '์ฌ๊ณผ']; var fruitMap = fruitList.asMap(); print(fruitMap); // {0: ์ฌ๊ณผ, 1: ์ค๋ ์ง, 2: ์๋ฐ, 3: ์ฌ๊ณผ}
โ ๏ธ ์ค์ ํฌ์ธํธ:
- Map์ ๊ฐ์ ์ค๋ณต์ด ํ์ฉ๋๋ฏ๋ก List์ ์ค๋ณต ๊ฐ๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค
- List โ Map ๋ณํ ์ index๊ฐ key, List์ ๊ฐ์ด value๊ฐ ๋ฉ๋๋ค
- Set์ index๊ฐ ์์ด ์ง์ Map ๋ณํ ๋ถ๊ฐ โ Set์ List๋ก ๋จผ์ ๋ณํ ํ Map์ผ๋ก!
โก ๊ณ ์ฐจ ํจ์
Collection ํ์ ์ ๋ฐ์ดํฐ์ ์๋ ์์๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ณํํ ๋ ์ฌ์ฉํ๋ ๊ฐ๋ ฅํ ํจ์๋ค์ ๋๋ค.
๐ ์ฃผ์ ๊ณ ์ฐจ ํจ์ ์ข ๋ฅ
๐ map()
Collection ํ์ ์ธ ๋ฐ์ดํฐ์ ๊ฐ ์์์ ํน์ ํจ์๋ฅผ ์ ์ฉํ ์๋ก์ด Collection ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
List<String> fruitList = ['์ฌ๊ณผ', '์ค๋ ์ง', '์๋ฐ'];
var delicious = fruitList.map((fruit) {
var word = '๋ง์๋ ';
word += fruit;
return word;
});
print(delicious); // (๋ง์๋ ์ฌ๊ณผ, ๋ง์๋ ์ค๋ ์ง, ๋ง์๋ ์๋ฐ)
Set<String> carSet = {'BMW', 'ํ๋', '๊ธฐ์'};
var goodCar = carSet.map((car) {
return '์งฑ ๋ฉ์ง $car';
});
print(goodCar); // (์งฑ ๋ฉ์ง BMW, ์งฑ ๋ฉ์ง ํ๋, ์งฑ ๋ฉ์ง ๊ธฐ์)
List<int> numbers = [1, 2, 3, 4, 5];
var doubledNumbers = numbers.map((n) => n * 2);
print(doubledNumbers); // (2, 4, 6, 8, 10)
๐ where()
Collection ํ์ ์ ๋ฐ์ดํฐ์์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ค๋ง ํํฐ๋งํ ์๋ก์ด Collection ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.where((number) {
return number > 5;
});
print(result); // (6, 7, 8, 9, 10)
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var result = numbers.where((n) => n > 5);
print(result); // (6, 7, 8, 9, 10)
๐ฏ firstWhere()
& lastWhere()
Collection ํ์ ์ ๋ฐ์ดํฐ์์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ/๋ง์ง๋ง ์์๋ฅผ ๋ฐํํฉ๋๋ค.
// ๋ฌธ๋ฒ ํํ
firstWhere(([๋งค๊ฐ๋ณ์]) { return [์กฐ๊ฑด์]; });
firstWhere(([๋งค๊ฐ๋ณ์]) => [์กฐ๊ฑด์]);
๐ reduce()
Collection ํ์ ์ ๋ฐ์ดํฐ์ ์๋ ์์๋ค์ ํ๋์ ๊ฐ์ผ๋ก ๊ฒฐํฉํฉ๋๋ค.
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.reduce((a, b) { // 15
return a + b;
});
๐ฆ fold()
Collection ํ์
์ ๋ฐ์ดํฐ์ ์๋ ์์๋ค์ ํ๋์ ๊ฐ์ผ๋ก ๊ฒฐํฉํฉ๋๋ค. reduce()
์ ๋ฌ๋ฆฌ ์ด๊ธฐ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.fold(1, (a, b) { // 16
return a + b
});
๐ก ํต์ฌ ์ฐจ์ด์ : ์ด๊ธฐ๊ฐ(1)์ ํ ๋นํ ํ ๊ฐ ์์๋ค์ ๊ฐ์ ํ๋๋ก ๊ฒฐํฉ
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.fold('', (a, b) => '$a' + '$b');
print(result); // 12345
print(result.runtimeType); // String
โก ํ์ฉ ํ: ์ด๊ธฐ๊ฐ ํ์ ๊ณผ ๋ฆฌํด ํ์ ์ ์กฐ์ ํ์ฌ ์๋ก์ด ํ์ ์ผ๋ก ํ๋ณํ ๊ฐ๋ฅ
โ
any()
Collection ํ์
์ ๋ฐ์ดํฐ์ ์๋ ์์ ์ค ํ๋๋ผ๋ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด true
๋ฅผ ๋ฐํํฉ๋๋ค.
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.any((number) {
return number.isEven; // ์ง์ ์ฌ๋ถ ํ์ธ (boolean ๋ฐํ)
}); // ๊ฒฐ๊ณผ๊ฐ๋ boolean ํ์
print(result); // true
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.any((n) => n.isEven);
print(result); // true
โ
every()
Collection ํ์
์ ๋ฐ์ดํฐ์ ์๋ ๋ชจ๋ ์์๊ฐ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด true
๋ฅผ ๋ฐํํฉ๋๋ค.
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.every((number) {
return number > 0;
});
print(result); // true
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.every((number) => number > 0);
print(result); // true
โก๏ธ takeWhile()
Collection ํ์ ์ ๋ฐ์ดํฐ์์ ์กฐ๊ฑด์ ๋ง๋ ์์๋ฅผ ์ฐ์์ ์ผ๋ก ๊ฐ์ ธ์ค๋ค๊ฐ, ์กฐ๊ฑด์ ๋ง์ง ์๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋ง๋๋ ์๊ฐ ์์ ์ ๋ฉ์ถ๊ณ ๋ฐํํฉ๋๋ค.
List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.takeWhile((number) {
return number < 4;
});
print(result); // (1, 2, 3)
List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.takeWhile((number) => number < 4);
print(result); // (1, 2, 3)
โฌ
๏ธ skipWhile()
Collection ํ์ ์ ๋ฐ์ดํฐ์์ ์กฐ๊ฑด์ ๋ง๋ ์์๋ฅผ ์ฐ์์ ์ผ๋ก ๊ฑด๋๋ฐ๋ค๊ฐ, ์กฐ๊ฑด์ ๋ง์ง ์๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๋ง๋๋ ์๊ฐ ์์ ์ ๋ฉ์ถ๊ณ ์ดํ ๋ชจ๋ ์์๋ค์ ๋ฐํํฉ๋๋ค.
List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.skipWhile((number) {
return number < 4;
});
print(result); // (4, 5, 6)
List<int> numbers = [1, 2, 3, 4, 5, 6];
var result = numbers.skipWhile((number) => number < 4);
print(result); // (4, 5, 6)
๐ข ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ Dart(1) - ํด๋์ค์ ์์ฑ
๐ ์์ฑ(Properties) ์ข ๋ฅ
์์ฑ ์ข ๋ฅ | ์ค๋ช | ์ฌ์ฉ๋ฒ |
---|---|---|
์ธ์คํด์ค ๋ณ์ | ๊ฐ์ฒด์ ์ํด ์๋ ๋ณ์ | String name; |
์ง์ญ ๋ณ์ | ํน์ ์ฝ๋ ๋ธ๋ก ์์ ์ ์ธ๋ ๋ณ์ | void method() { int temp = 5; } |
์ ์ ๋ณ์ | ํด๋์ค ์์ฒด์ ์ํ๋ ๋ณ์ | static int count; |
๐ข ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ Dart(2) - ํด๋์ค์ ๋ฉ์๋
๐ ๋ฉ์๋ vs ํจ์
๊ตฌ๋ถ | ๋ฉ์๋ | ํจ์ |
---|---|---|
์์ | ํด๋์ค์ ์ข ์ | ํด๋์ค์ ๋ฌด๊ด |
ํธ์ถ | ๊ฐ์ฒด.๋ฉ์๋() | ํจ์๋ช () |
์์ | car.start() |
print() |
๐ ๋ฉ์๋ ์ข ๋ฅ
๐ต ์ธ์คํด์ค ๋ฉ์๋
- ๊ฐ์ฒด๋ฅผ ํตํด ํธ์ถ๋๋ ๋ฉ์๋
- ์ธ์คํด์ค ๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅ
โก ์ ์ ๋ฉ์๋
- ํด๋์ค๋ช ์ ํตํด ์ง์ ํธ์ถ
- ์ธ์คํด์ค ์์ฑ ์์ด ์ฌ์ฉ ๊ฐ๋ฅ
๐ ์์ฑ์ (Constructor)
โ ๏ธ ์ค์: ์ธ์คํด์ค ๋ณ์๊ฐ ์๋ค๋ฉด ๊ธฐ๋ณธ ์์ฑ์์์ ๋ชจ๋ ์ด๊ธฐํํด์ผ ํฉ๋๋ค.
1๏ธโฃ ๋งค๊ฐ๋ณ์ ์์ฑ์
```dart
// Dart๋ง์ ๊ฐ๊ฒฐํ ๋ฌธ๋ฒ
class Car {
String name;
List
Car(this.name, this.models);
}
```
```dart
// C++ ์คํ์ผ ์์ฑ์
class Car {
String name;
List<String> models;
Car(String name, List<String> models)
: this.name = name,
this.models = models;
}
```
```dart
// Java ์คํ์ผ ์์ฑ์
class Car {
String name = '';
List<String> models = [];
Car(String name, List<String> models) {
this.name = name;
this.models = models;
}
}
2๏ธโฃ ๋ค์๋ ์์ฑ์ (Named Constructor)
ํด๋์ค ๋ฉ์๋์ ๊ฐ์ ํ์์ผ๋ก ํธ์ถํ๋ ์์ฑ์
// ๋ฌธ๋ฒ: [ํด๋์ค๋ช
].[๋ฉ์๋๋ช
]([ํ์
] [๋งค๊ฐ๋ณ์๋ช
]) : this.๋ณ์;
```dart
class Car {
String name;
List<String> models;
Car.fromList(List values)
: this.name = values[0],
this.models = values[1];
}
```
```dart
class Car {
String name;
List<String> models;
Car.fromList(List values)
: this.name = values[0],
this.models = values[1];
void speakName() {
print('์ ํฌ๋ $name ์
๋๋ค !');
}
void speakModels() {
print('$models ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์์ต๋๋ค !');
}
}
void main() {
Car car = Car.fromList([
'BMW',
['320i', '340i', 'M3']
]);
car.speakName(); // ์ ํฌ๋ BMW ์
๋๋ค !
car.speakModels(); // [320i, 340i, M3] ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์์ต๋๋ค !
}
```
๐ ์ ๋ค๋ฆญ ํด๋์ค
๋ค์ํ ํ์ ์ ๋ํด ๋์ผํ ๋ก์ง์ ์ ์ฉํ ์ ์๋ ํด๋์ค์ ๋๋ค.
class Box<T> {
T value;
Box(this.value);
T getValue() {
return value;
}
}
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ Dart(3) - ๊ฐ์ฒด ์งํฅ๊ณผ ์์
์์
- super ๋ฅผ ํตํด ์์ ํด๋์ค ๊ฐ ๋ถ๋ชจ ํด๋์ค ์ ์์ฑ ๊ณผ ๋ฉ์๋ ๋ฅผ ์ฌ์ฉํ ์ ์์ด์.
- ์์ ํด๋์ค ๋ ์์ ๋ฐ์ ์์ฑ ๊ณผ ๋ฉ์๋ ๋ฅผ ์ฌ์ ์ (Overriding) ํ๊ฑฐ๋ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ด์.
- ๊ทผ๋ฐ์ .. ์ด๋ค ํด๋์ค ๋ ์์ ๋นํ์ง (?) ์๊ฒ ํ๊ณ ์ถ์ ๋๋ final ์ ์ฌ์ฉํ๋ฉด ๋ผ์
final class Person { void eat() { print('๋ ๋ !'); } } class Student extends Person { // Error: The type 'Student' must be 'base', 'final' or 'sealed' because the supertype 'Person' is 'final'. }
๐ extends vs implements
๊ตฌ๋ถ | extends |
implements |
---|---|---|
๐ฏ ๋ชฉ์ | ํด๋์ค ํ์ฅ ๋ฐ ์ฝ๋ ์ฌ์ฌ์ฉ | ์ธํฐํ์ด์ค ๊ตฌํ ๋ฐ ๊ท๊ฒฉ ์ค์ |
๐ป ์ฝ๋ | ๋ถ๋ชจ์ ๊ตฌํ๋ ์ฝ๋๋ฅผ ๋ฌผ๋ ค๋ฐ์ | ๋ถ๋ชจ์ ๊ตฌํ๋ ์ฝ๋๋ ๋ฌผ๋ ค๋ฐ์ง ์์ |
โ๏ธ ์๋ฌด | ๋ฉ์๋ ์ฌ์ ์๋ ์ ํ ์ฌํญ | ๋ชจ๋ ๋ฉ์๋๋ฅผ ๋ฐ๋์ ์ฌ์ ์ํด์ผ ํจ |
๐ ๊ฐ์ | ๋จ์ผ ์์๋ง ๊ฐ๋ฅ | ๋ค์ค ๊ตฌํ์ด ๊ฐ๋ฅ |
โ ๏ธ ์์ธ ์ฒ๋ฆฌ๋ก ๋จ๋จํ ์ฝ๋ ๋ง๋ค๊ธฐ
๐จ ์์ธ(Exception) ์ข ๋ฅ
- DeferredLoadException: ํ์ํ ์์ ์ ๋ก๋๋๋๋ก ์ค์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ก๋๋์ง ๋ชป ํ์ ๋ ๋ฐ์ํด์.
- FormatException: ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ ๊ฐ๋ฅํ ํํ๊ฐ ์๋์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ค์ธ ๋ ๋ฐ์ํด์.
- IOException: ์
์ถ๋ ฅ ๊ด๋ จ ๋์์ ํ๋ ์ค์ ๋ฐ์ํ๋ ์ค๋ฅ ๐จ
- FileSystemException
- HttpException
- ProcessException
- SignalException
- SocketException
- StdinException
- StdoutException
- TlsException
- WebSocketException
- OSError: ์ด์์ฒด์ ๋ ๋ฒจ์์ ๋ฐ์ํ๋ ์ค๋ฅ ๐ฅน
- TimeoutException: ๋น๋๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ํน์ ์๊ฐ์ด ์ด๊ณผ๋์์ ๋ ๋ฐ์ํด์.
- ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ํ ์์ธ:
class AgeException implements Exception { final String? message; AgeException(this.message); @override String toString() => message ?? 'AgeException ์ด ๋ฐ์ํ์ด์ !'; }
๊ด๋ จ ํค์๋
- try
- catch
- on: try ์ ์ฝ๋ ๋ธ๋ก์์ ๋ฐ์ํ ์ ์๋ ์์ธ ์ค ํน์ ํ์
์ ์์ธ๋ฅผ ๋ค๋ฃจ๋ ๋ถ๋ถ
on IOException catch (e) { // IOException ์ด ๋ฐ์ํ์ ๋ ์คํํ ์ฝ๋ }
- finally
์ค๋ฅ(Error)
์ข ๋ฅ
- ArgumentError
- AssertionError
void checkAge(int age) { assert(age > 0, 'Age must be positive'); } void main() { checkAge(-5); // AssertionError ๋ฐ์ }
assert(text != null); assert(number < 100, '100 ์ด์์ด๋ฉด ์ ๋ผ์ !');
- RangeError: ํ์ฉ๋์ง ์๋ ๋ฒ์์ ๊ฐ์ด ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋์์ ๋ ๋ฐ์ํด์.
- IndexError
- NoSuchMethodError: ํจ์ ๋ ๋ฉ์๋ ๋ฅผ ์คํํ ์ ์๋ ๊ฒฝ์ฐ์ ๋ฐ์ํด์.
- OutOfMemoryError
- StackOverflowError
- StateError: ๊ฐ์ฒด์ ํ์ฌ ์ํ๋ก๋ ํน์ ๋์ ์ํ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ๋ฐ์ํด์.
List<int> numbers = []; print(numbers.first);
- TypeError
- UnimplementedError
- UnsupportedError: ๊ฐ์ฒด๋ฅผ ํตํด ์คํ๋ ์ ์๋ ๋์์ผ ๋ ๋ฐ์ํด์.
๐ ์์ธ vs ์ค๋ฅ ๋น๊ต
๊ตฌ๋ถ | ์์ธ (Exception) | ์ค๋ฅ (Error) |
---|---|---|
๐ฏ ๋ฐ์ ์์ธ | ์ฝ๋๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ง์ง ์๊ฑฐ๋ ๋ถ์ ์ ํ ๊ฐ ์ ๋ ฅ | ์์คํ ๋ฌธ์ (๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฑ) |
๐ฎ ์์ธก ๊ฐ๋ฅ์ฑ | ์์ํ ์ ์์ | ์์ํ ์ ์์ |
๐ ๏ธ ์ฒ๋ฆฌ ๊ฐ๋ฅ์ฑ | try-catch ๋ฅผ ํตํด ์ฒ๋ฆฌ ๊ฐ๋ฅ |
๋ฐ์์ ์์ํ ์ ์์ด ์ฒ๋ฆฌ ๋ถ๊ฐ๋ฅ |
๐ ์์ | FormatException , TimeoutException |
OutOfMemoryError , StackOverflowError |
๐ก ํต์ฌ ํฌ์ธํธ: ์์ธ๋ ๊ฐ๋ฐ์๊ฐ ์์ํ๊ณ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ์ค๋ฅ๋ ์์คํ ๋ ๋ฒจ์ ๋ฌธ์ ๋ก ์์ํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๐ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ํ์ฅํ๊ธฐ
๐ ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
dart:core
: Dart์ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (์๋ import)dart:async
: ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ์ง์dart:collection
: ์ปด๋ ์ ํ์ ์ถ๊ฐ ๊ธฐ๋ฅdart:convert
: JSON, UTF-8 ๋ฑ ๋ฐ์ดํฐ ๋ณํdart:developer
: ๋๋ฒ๊น ๋ฐ ๊ฐ๋ฐ ๋๊ตฌdart:math
: ์ํ ๊ด๋ จ ํจ์๋ค
๐ป Native platform์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
dart:ffi
: C API๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ Foreign Function Interfacedart:io
: ํ์ผ ์์คํ , ๋คํธ์ํฌ, ํ๋ก์ธ์ค ์ฒ๋ฆฌ
๐ Web platform์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
package:web
: ์น ๊ฐ๋ฐ์ ์ํ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌdart:js_interop
: JavaScript์์ ์ํธ ์์ฉdart:html
: HTML DOM ์กฐ์ ๋ฐ ์น API
๐ Dart SDK์ ํฌํจ๋์ด ์์ง ์์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Pub.dev์์ ๋ค์ํ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ฐพ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค! ๐คฉ
๐ฅ ๋ง์ด ์ฐ์ด๋ ์ธ๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ๊ธฐ๋ฅ ์ค๋ช
|
|:โ|:โ|
| cupertino_icons
| iOS ์คํ์ผ ์์ด์ฝ |
| intl
| ๋ฒ์ญ, ๋ ์ง/์ซ์ ํฌ๋งทํ
๋ฑ ๊ตญ์ ํ ๊ธฐ๋ฅ |
| shared_preferences
| ๋ก์ปฌ ๋ฐ์ดํฐ ์ ์ฅ (iOS NSUserDefaults, Android SharedPreferences) |
| url_launcher
| URL, ์ด๋ฉ์ผ, ์ ํ ๋ฑ ์ธ๋ถ ์ฑ ์ฐ๋ |
| image_picker
| iOS/Android์์ ์ฌ์ง ์ ํ ๋ฐ ์ดฌ์ |
| firebase_core
& firebase_auth
| Firebase ์๋น์ค ํตํฉ ๋ฐ ์ธ์ฆ |
| google_fonts
| Google Fonts ์ฌ์ฉ |
| permission_handler
| iOS/Android ๊ถํ ๊ด๋ฆฌ |
| custom_lint
| ์ปค์คํ
Lint ๊ท์น ์ ์ฉ |
| flutter_svg
| SVG ์ด๋ฏธ์ง ๋ ๋๋ง |
| cached_network_image
| ๋คํธ์ํฌ ์ด๋ฏธ์ง ์บ์ฑ |
| flutter_local_notifications
| ๋ก์ปฌ ์๋ฆผ ๊ธฐ๋ฅ |
| path_provider
| ์์คํ
๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก ์ ๊ณต |
| geolocator
| GPS ์์น ์ ๋ณด ์ฒ๋ฆฌ |
| dio
| ๊ฐ๋ ฅํ HTTP ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
๐ ์ฐธ๊ณ : pub.dev์ ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ฌ ๋
package:
์ ๋์ฌ๊ฐ ๋ถ์ต๋๋ค.
๐ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ํน์ง
๐ท๏ธ ๋ณ์นญ(Alias) ์ฌ์ฉ
import 'package:http/http.dart' as http;
๐ฏ ์ ํ์ Import (show)
import 'package:lib1/lib1.dart' show foo;
๐ซ ์ ์ธ Import (hide)
import 'package:lib2/lib2.dart' hide foo;
โณ ์ง์ฐ ๋ก๋ฉ (deferred as)
โ ๏ธ ์ฃผ์: ๋ชจ๋ ํ๋ซํผ์์ ์ง์ํ์ง ์์ผ๋ฉฐ, Web platform์์๋ง ์ง์ํฉ๋๋ค.
import 'package:greetings/hello.dart' deferred as hello;
Future<void> greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
โฑ๏ธ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ๊ณผ Dart
์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ธ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๊ฐ์ด ๋์ค๋ ๋์ CPU ๋ธ๋ญ์ ๋ง๊ธฐ ์ํด์ ๋น๋๊ธฐ ๋์์ ์คํํ์ฌ ํจ์จ์ฑ์ ํฅ์์ํต๋๋ค.
๐ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ด ํ์ํ ๊ฒฝ์ฐ
- ๐ ํ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋
- ๐พ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ธ ๋
- ๐ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๋
๐ฎ Future
์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์์ ๋ ํด๋น ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๊ณ , ์คํ์ ์ข ๋ฃํ๋ ์ผํ์ฑ ๋น๋๊ธฐ ์์ ์ ๋๋ค.
Future<String> introduce(String name) async {
print('$name์ ์๊ธฐ์๊ฐ ์์ !');
await Future.delayed(Duration(seconds: 2), () {
print('์๋
? ๋๋ $name ~');
});
print('$name์ ์๊ธฐ์๊ฐ ๋ !');
return '์ด๋ฆ์ $name ~';
}
void main() async {
var riverfuture = await introduce('๊ฐ๋ฏธ๋');
var riverpresent = await introduce('๊ฐํ์ฌ');
print('๋์ $riverfuture ๋์ $riverpresent');
}
/*
๊ฐ๋ฏธ๋์ ์๊ธฐ์๊ฐ ์์ !
์๋
? ๋๋ ๊ฐ๋ฏธ๋ ~
๊ฐ๋ฏธ๋์ ์๊ธฐ์๊ฐ ๋ !
๊ฐํ์ฌ์ ์๊ธฐ์๊ฐ ์์ !
์๋
? ๋๋ ๊ฐํ์ฌ ~
๊ฐํ์ฌ์ ์๊ธฐ์๊ฐ ๋ !
๋์ ์ด๋ฆ์ ๊ฐ๋ฏธ๋ ~ ๋์ ์ด๋ฆ์ ๊ฐํ์ฌ ~
*/
## ๐ป ์ค์ต ๋ฐ ์์
์์์ ํ์ตํ ๋ด์ฉ๋ค์ ๋ชจ๋ **์ค์ ์ฝ๋ ์์ **์ ํจ๊ป ์ ์๋์ด ์์ด ๋ฐ๋ก ์ค์ตํด๋ณผ ์ ์์ต๋๋ค.
## ๐ ๋ง๋ฌด๋ฆฌ
### โ
์ค๋ ๋ฐฐ์ด ๊ฒ
- **ํจ์ํ ํ๋ก๊ทธ๋๋ฐ**: `map()`, `where()`, `reduce()`, `fold()` ๋ฑ ๊ณ ์ฐจ ํจ์๋ค์ ํ์ฉ๋ฒ
- **๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ**: ํด๋์ค, ์์ฑ, ๋ฉ์๋, ์์์ ๊ฐ๋
๊ณผ ๊ตฌํ ๋ฐฉ๋ฒ
- **์์ธ ์ฒ๋ฆฌ**: Exception๊ณผ Error์ ์ฐจ์ด์ ๊ณผ `try-catch` ๊ตฌ๋ฌธ ์ฌ์ฉ๋ฒ
- **๋ผ์ด๋ธ๋ฌ๋ฆฌ**: Dart ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธ๋ถ ํจํค์ง ํ์ฉ๋ฒ
- **๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ**: `Future`์ `Stream`์ ๊ธฐ๋ณธ ๊ฐ๋
๊ณผ ํ์ฉ๋ฒ
### ๐ ๋ค์ ๊ณํ
- **๊ณ ๊ธ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ**: `async`/`await` ํจํด ์ฌํ ํ์ต
- **Flutter ์์ ฏ**: Dart ์ง์์ ๋ฐํ์ผ๋ก ํ Flutter UI ๊ตฌํ
- **์ํ ๊ด๋ฆฌ**: Provider, Riverpod ๋ฑ ์ํ ๊ด๋ฆฌ ํจํด ํ์ต
- **์ค์ ํ๋ก์ ํธ**: ํ์ตํ ๊ฐ๋
๋ค์ ํ์ฉํ ์ค์ ์ฑ ๊ฐ๋ฐ
โ ๏ธ Future์ ํ๊ณ ๐ฅบ
- ํ๋์ ์์ ๋น ๊ฒฐ๊ณผ๊ฐ์ 1๋ฒ๋ง ๋ฐ์ ์ ์์ต๋๋ค (์ผํ์ฉ)
- ํ๋์ ์์ ์ ๊ฒฐ๊ณผ๊ฐ์ด ์ฌ๋ฌ ๋ฒ ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ต๋๋ค!
- ์ด๋ฌํ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด
Stream
์ด ๋ฑ์ฅํฉ๋๋ค! ๐
๐ Stream
์๊ฐ์ ๋ฐ๋ผ ์ฐ์์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ ์ ๊ณตํฉ๋๋ค. ํ ๋ฒ์ ํ๋์ ๊ฐ์ด ์๋ ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ ์ ์์ต๋๋ค.
๐ก Future vs Stream: Future๋ ๋จ์ผ ๊ฒฐ๊ณผ, Stream์ ์ฐ์์ ์ธ ๋ค์ค ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌ!
Stream<int> emitNumbers(int first) async* {
for (var i = first; i >= 0; i--) {
yield i;
await Future.delayed(Duration(seconds: 1));
}
}
void main() {
emitNumbers(10).listen((number) {
print(number);
});
}
/*
10
9
8
7
6
5
4
3
2
1
0
*/
๋๊ธ๋จ๊ธฐ๊ธฐ