본격μ μΌλ‘ νλ¬ν°μ λ€μ΄κ°κΈ° μ μ! λ΄κ° λ³΄λ €κ³ μ λ¦¬ν΄ λλ λ€νΈ λ¬Έλ² π
λ³μλͺ
: νμ
μΌλ‘ λνλ΄λ νμ
μ€ν¬λ¦½νΈμ λ¬λ¦¬, λ€νΈμμλ νμμ λ³μ μμ νμνλ€.
String name; int age;
μ§ν© μλ£νμ κ²½μ° νμ <μμμ νμ > ννλ‘ λνλ!
List<int> numbers = [0, 1, 2]; Map<String, int> scores = { 'eng': 100, 'math': 90, 'science': 80 }
ν¨μμ λ°ν νμ μμ ν¨μλͺ μμ λΆμ¬ μ€λ€.
void main() { print('Hello!'); } String greeting() { return 'Hello!'; }
var ν€μλλ₯Ό μ¬μ©νλ©΄ νμ μ μ μΈνμ§ μμλ λ³μμ ν λΉλ μ΄κΈ°κ°μ λ°λΌ νμ μ΄ μλμΌλ‘ μΆλ‘ λλ€. μ΄ν ν΄λΉ λ³μλ νμ λ³κ²½ β β
void main() {
var age = 5; //int type
var name = dana; //String type
var human = true; //bool type
age = 20; //λ¬Έμ μμ
age = 'hi'; //Error: A value of type 'String' can't be assigned to a variable of type 'int'.
}
λ³μ μ μΈ μ dynamicμ λΆμ¬μ£Όλ©΄ μ»΄νμΌλ¬κ° ν΄λΉ λ³μμ λͺ¨λ νμμ νμ©νλ€. μ΄ν νμ μ λ³κ²½ν΄λ μλ¬κ° λμ§ μμ!
void main() {
dynamic something = 9;
something = 'apple';
print(something); //apple
}
π final, const, static
- λ³μμ νμμ νμ₯νλ ν€μλ
- final, const λͺ¨λ λΆλ³νλ μμλ₯Ό μλ―Ένμ§λ§ μ½κ°μ μ°¨μ΄κ° μμ
- constλ μ±μ life cycleμμ μ λ λ³νμ§ μμμ μλ―ΈνκΈ° λλ¬Έμ λΆλ³ λ³μμ μμ constλ₯Ό λΆμ¬ μ£Όλ©΄ νλ¬ν°κ° κ·Έ λΆλΆμ rebuildνμ§ μκ³ , λ°λΌμ μ±μ μλκ° λΉ¨λΌμ§λ€ (μ±λ₯ κ°μ )
- constλ compile-time constantλ‘ μ± λΉλμ κ°μ΄ μ ν΄μ§λ λ°λ©΄, finalμ run-time constantλ‘μ μ± λΉλμμλ κ°μ΄ μ ν΄μ§μ§ μμ§λ§ μ± μ€νμ κ°μ΄ μ ν΄μ§λ€ (e.g. DateTime.now, Device size λ±)
- staticμ ν΄λμ€ λ 벨μ λ³μλ₯Ό μλ―Ένλ©°, ν΄λμ€μ κ° μΈμ€ν΄μ€λ νλμ static κ°μ 곡μ νλ€
κΈ°λ³Έμ μΈ μ°μ°μλ JSμ ν¬κ² λ€λ₯΄μ§ μλ€. μμνκ±°λ νΉμ΄ν κ²λ§ μ λ¦¬ν΄ λ΄!
μ μ λλμ κΈ°νΈ
void main() { print(55~/2); //27 }
κ°μ νλ³ν ν€μλλ‘μ λΆλͺ¨ νμ μ κ°μ²΄λ₯Ό μμ νμ μ κ°μ²΄λ‘ νλ³ν(=λ€μ΄μΊμ€ν )ν λ μ¬μ©
κ°μ²΄μ νμ μ νμΈν΄ true/false λ°ν
void main() { var age = 0; print(age is int); //true print(age is num); //true print(age is! num); //false }
κ°μ²΄κ° nullμΌ κ²½μ°λ₯Ό μΈμ§νμ¬ μλ¬ λ°μμ λ§κ³ λ€λ₯Έ κ°μ ν λΉμν€λ μ°μ°μ!
optional chainingμ΄λΌκ³ 곡λΆνλ κ²
Aκ° nullμ΄ μλλ©΄ A κ°μ²΄μ B μμ±μ μ¬μ©νκ³ , nullμ΄λ©΄ κ·Έλ₯ nullμ λ°ν
void main() { String? name; print(name.length); //Error: Property 'length' cannot be accessed on 'String?' because it is potentially null. print(name?.length); //?.λ‘ μ²λ¦¬ν΄ μ£Όλ©΄ μλ¬κ° λμ§ μμ }
JSμ || μ°μ°μμ κ°μ! Aκ° nullμ΄λ©΄ Bλ₯Ό λ°ν
void main() { int age = 16; int myAge = age ?? 20; print(myAge); //ageκ° nullμ΄ μλλ―λ‘ 16 }
μμ λ°λλ‘ Bκ° nullμ΄λ©΄ λ°±μ κ°μ ν λΉνκ³ , μλλ©΄ Bλ₯Ό λ°ν
void main() { int age; int myAge = 24; myAge ??= age; print(myAge); //ageκ° nullμ΄λ―λ‘ 24 }
리ν΄κ° νμ
ν¨μλͺ
(νλΌλ―Έν° νμ
νλΌλ―Έν°
) {}
String sayHi(String name) {
return 'Hi $name!';
}
JSμ λ¬λ¦¬ νμ΄ν ν¨μλ μ΄λ¦μ κ°μ§λ©°, {return 리ν΄κ°}
μ => 리ν΄κ°
μΌλ‘ μΆμ½ν μ μλ€.
String sayHi(String name) => 'Hi $name!';
π main ν¨μ
void main() { //μ½λ }
- dart νλ‘κ·Έλ¨μ μ€ννλ©΄ μ²μ μ€νλλ μ½λ (μ§μ νμΌμ λ°λμ μ μλμ΄ μμ΄μΌ ν¨!)
- void: 리ν΄κ°μ΄ μμμ μλ―Έ
νλΌλ―Έν°λ₯Ό μ€κ΄νΈ({})λ‘ κ°μΈλ©΄ named parameterκ° λμ΄ μ΄λ¦μΌλ‘ νλΌλ―Έν°λ₯Ό μ λ¬ν μ μλ€. μ νμ¬νμ΄κΈ° λλ¬Έμ μ΄λ¦ μμ΄ νΈμΆν μλ μμ!
void main() {
void introduce({required String name, required int age}) {
print('I am $name. $age yaers old!');
}
introduce(name: 'Sam', age: 5); //I am Sam. 5 years old!
}
νλΌλ―Έν°λ₯Ό λκ΄νΈ([])λ‘ κ°μΈλ©΄ μ νν μΈμλ₯Ό μ€μ ν μ μλ€.
void main() {
void introduce(String name, int age, [String? food]) {
print('I am $name. $age yaers old!');
if (food is String) {
print('I like $food!');
}
}
introduce('Tom', 7); //I am Tom. 7 yaers old!
introduce('Sam', 5, 'ice cream'); //I am Sam. 5 yaers old! I like ice cream!
}
= μ°μ°μλ₯Ό μ΄μ©ν΄ νλΌλ―Έν°μ κΈ°λ³Έκ°μ μ μν μ μλ€.
void main() {
void introduce(String name, int age, [String food = 'chocolate']) {
print('I am $name. $age yaers old! I like $food!');
}
introduce('Tom', 7); //I am Tom. 7 yaers old! I like chocolate!
}
νλ¬ν° 2.0, λ€νΈ 2.12μμ μ
λ°μ΄νΈλ λ¬Έλ²!
κΈ°λ³Έκ° μ΄κΈ°ν(initialize) μμ΄ μ μΈνλ λ³μλ, null κ°μ λν μμ μ±μ 보μ₯νκΈ° μν΄ νμ
μ nullableκ³Ό non-nullableλ‘ κ΅¬λΆν΄ μ€μΌ νλ€.
μΌλ° νμ λ€μ λ¬Όμν(?)λ₯Ό λΆμ¬ μ£Όλ©΄ ν΄λΉ λ³μλ ν΄λΉ νμ λλ nullμ΄ λ μ μμμ λνλΈλ€. μ΄κΈ°ν μμ΄ μ¬μ©νλ©΄ null κ°μΌλ‘ ν λΉλλ€.
void main() {
String? name;
int? age;
bool? student;
print(name) //null
}
λ¬Όμν μμ΄ μΌλ° νμ μΌλ‘ μ¬μ©νλ©΄ μλμ μΌλ‘ nullμ΄ λ μ μλ κ°μΌλ‘ μΈμλλ€. μ¬μ© μ μ λ°λμ μ΄κΈ°κ°μ ν λΉν΄ μ€μΌ ν¨! μ κ·Έλ¬λ©΄ μλμ²λΌ μ€λ₯κ° λ¬λ€.
void main() {
String name;
int age;
bool student;
print(name); //The non-nullable local variable 'name' must be assigned before it can be used.
}
πΉ required, late
λ§μ°¬κ°μ§λ‘ null safetyλ₯Ό μν΄ μΆκ°λ ν€μλλ€!
- required
ν¨μμμ λ€μλ νλΌλ―Έν°λ μ΅μ λ νλΌλ―Έν°λ₯Ό μ€μ ν λ non-nullableλ‘ μ§μ νκΈ° μν΄ νμ μμ λΆμ¬μ€λ€.void greeting({required String name}) { print('Hello $name!'); }
- late
ν΄λμ€μ non-nullable νλ‘νΌν°κ° νμνμ§λ§ λν΄νΈκ°μ΄λ μ΄κΈ°νλ₯Ό μν€μ§ μμ κ²½μ° λμ€μ κ°μ ν λΉνλ€λ μλ―Έλ‘ λΆμ¬μ€λ€.class Cat { late String name; late int age; }
κ°μ²΄μ§ν₯ λΆλΆμ λμ€μ λ°λ‘ μ¨μΌν λ―~~~π΅π΅π΅
[Dart] Final vs. Const
Null Aware Operators in Dart Programming
Dart mixin
Dart 2.12μμ Null Safety μ¬μ© λ°©λ²
πμλ³΄κ³ κ°λλ€~~