Flutter 2.0 ์ถ์ ์ดํ null safety ๊ฐ ์ ์ ๋ฐฐํฌ๊ฐ ๋์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ ๊ทธ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ด๋ฒ ๊ธ์ ์๋์ ์๋ฃ๋ค์ ๋ฐํ์ผ๋ก ์์ฑ๋์ต๋๋ค.
์ด ๊ธ์์ ์์๋ณผ ๋ด์ฉ
- Null safety ๋ ๋ฌด์์ธ๊ฐ?
- Null safety ๊ท์น
Null safety ๋ ๋ฌด์์ธ๊ฐ?
NullException ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ฐ์ฅ ์ซ์ดํ๋ Exception ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ ํ ๊ตฌ๊ฐ์ด Null ์ธ ๊ฒฝ์ฐ ๋ฐ์๋๋๋ฐ์. ํ๋ก๊ทธ๋จ์ ๊ท๋ชจ๊ฐ ํฌ๋ฉด ํด์๋ก, ๊ทธ๋ฆฌ๊ณ ๋ณต์กํ๋ฉด ๋ณต์กํ ์๋ก null ์ ์ฐพ๊ธฐ๋ ์๋นํ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ null์ ํ๋ก๊ทธ๋๋ฐ ์์ด์ ์ ์ฉํ์ง๋ง ๋งค์ฐ ์ํํ ์์์ ๋๋ค. ์ด๋ฐ ๋ฆฌ์คํฌ๋ฅผ ๊ด๋ฆฌํด์ผ๋ ํ์์ฑ์ ๋๋ผ๋ ๊ฒ์ ๋น์ฐํ ์ผ์ ๋๋ค. ๊ทธ๋ ๊ฒ ํด์ ๋์จ ๊ฒ์ด Null safety์ ๋๋ค.
Null safety๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๊ฐ๋ฐํ๋ ๋์ค์ null ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์์ธํ ๊ฒ์ ์๋์ IDE ํ๋ฉด์ ๋ณด๋ ๊ฒ์ด ๋น ๋ฅผ ๋ฏ ํฉ๋๋ค.
์์ IDE ํ๋ฉด์ ๋ณด์๋ฉด ์๋ฌํ์๊ฐ ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๊ธฐ์กด์๋ ๋ฌธ๋ฒ์์ ์ค๋ฅ(Syntax error) ๋ฑ์ ๋ํด์๋ง ์๋ฌ ํ์๊ฐ ๋ฌ์ง๋ง. Null safety ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด Null ๊ณผ ๊ด๋ จ๋ ๊ฒ ๋ํ error ํ์๊ฐ ๋๊ฒ ๋ฉ๋๋ค. ์์ธํ ๊ท์น์ ์๋ "Null safety ์ฌ์ฉ๋ฐฉ๋ฒ" ์์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ณธ๋ก ์ผ๋ก ๋์๊ฐ์ IDE๋ก ๊ฐ๋ฐํ๋ ๊ณผ์ ์์ null ์ ๊ดํ ์๋ฌํ์๋ฅผ ๋ณผ ์ ์์์ผ๋ก, null ์ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํด์ง๋๋ค. ๋น์ฐํ null ๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ๋ฅ ์ ๋ฎ์์ง๊ณ , ํ๋ก๊ทธ๋จ์ ์์ ์ฑ ๋ํ ํฅ์๋ฉ๋๋ค.
Null safety์ ๋งค๋ ฅ์ ๋ํด์ ๋๋ผ์ จ์ ๊ฒ ์ ๋๋ค. ๊ทธ๋ผ ๋ฐ๋ก ์ด๋ป๊ฒ Null safety๋ฅผ ์ฌ์ฉํ๋์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Null safety ๊ท์น
Null safety ์์ ๋ณ์๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก null์ ํ์ฉํ์ง ์์ต๋๋ค.
int a; // X - ์ด๊ธฐ๊ฐ์ ์ค์ ํ์ง ์์
int b = null; // X - null์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ค์ ํจ
int c = 1 // o - ์ค์ ๊ฐ์ผ๋ก ์ด๊ธฐํํจ
ํ์ง๋ง null์ด ํ์ํ ์๊ฐ๋ ๋ถ๋ช ์กด์ฌํฉ๋๋ค. ์ด๋๋ '?' ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
int? a; // ๋ฌผ์ํ๋ฅผ ๋ถ์ด๋ฉด null ๊ฐ์ ์ฌ์ฉํ ์ ์์
int? a = null;
๋ง์ฝ '?'๊ฐ ๋ถ์ ํด๋์ค๋ฅผ ํธ์ถํ๋ค๋ฉด? ํด๋น ๊ฐ์ null์ผ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์๋ฌ ํ์๊ฐ ๋ฉ๋๋ค. ์ด๋๋ '!'๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ๋ค๋ง ์ ๋ง ํด๋น ๋ณ์๊ฐ null ์ด ์๋๋ผ๊ณ ํ์ ํ ๋๋ง ์ฌ์ฉํ๋๋ก ํ์ธ์.
class Test {
void helloPrint() {
print("hello")
}
}
Test? a;
void main () {
a!.helloPrint();
// ํด๋น ์ฝ๋๋ IDE ์์์๋ ์๋ฌ๊ฐ ์์ง๋ง ์ปดํ์ผ ์์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
// ๊ฒฐ๊ตญ์๋ a๊ฐ null์ด๊ธฐ ๋๋ฌธ์ด๋ค. NullError ๊ฐ ๋ฐ์ํ๋ค.
// ๋ฐ๋ผ์ '!' ๋ฅผ ์ฌ์ฉํ ๋๋ ์ฃผ์ํ๊ธฐ ๋ฐ๋๋ค.
}
'!'๊ฐ ์๋ '?'๋ฅผ ์ฌ์ฉํ ์๋ ์๋๋ฐ์. ๋ป์ "๋ง์ฝ null ์ด๋ผ๋ฉด ํด๋น ๋ช ๋ น์ ์คํ์ํค์ง ๋ง๋ผ"์ ๋๋ค.
class Test {
void helloPrint() {
print("hello")
}
}
Test? a;
void main () {
a?.helloPrint(); // ํด๋น ์ฝ๋๊ฐ ์คํ๋์ง ์๋๋ค.
}
๋ค์์ Dart ์ข ์์ ์ธ ์ด์ผ๊ธฐ์ ๋๋ค. Dart์๋ dynamic ๊ณผ var ํ์ ์ด ์กด์ฌํฉ๋๋ค. dynamic ์ ๊ธฐ๋ณธ์ ์ผ๋ก nullable ๋ณ์์ ๋๋ค. ์ฆ '?' ๊ฐ ์๋์ผ๋ก ๋ถ์ด์๋ค๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค. null์ ๋ฃ์ผ์ค ์ ์์ต๋๋ค.
var ์ ๊น๋ค๋กญ์ต๋๋ค. var ์ ์ ์ ํ์ ํ์ด ๋๋ ๋ณ์ ํ์ ์ ๋๋ค. ์ฆ ์ปดํ์ผ ์๊ฐ์ ํด๋น ๋ณ์์ ์ด๋ค ๊ฐ์ด ๋ค์ด๊ฐ ์๋์ง ํ์ ํ๊ณ ํ์ ์ด ๊ฒฐ์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ปดํ์ผ ์๊ฐ์ ํด๋น ๋ณ์์ ์ด๋ค ๊ฐ์ด ์๋์ง๊ฐ ์ค์ํฉ๋๋ค. ๊ฐ์ด ๋ค์ด๊ฐ ์๋ค๋ฉด ํด๋น ํ์ ์ด ๋๊ณ . ๋ง์ฝ ๊ฐ์ด ๋ค์ด์์ง ์๊ฑฐ๋ null์ด ๋ค์ด๊ฐ ์๋ค๋ฉด dynamic ํ์ ์ด ๋ฉ๋๋ค. nullable('?') ํ์ ์ด ๋๋ค๋ ๊ฒ ์ ๋๋ค.
var a = 1; // int a = 1; ๊ณผ ๊ฐ์ (null ์ฌ์ฉ์ด ๋ถ๊ฐํจ)
var b; // dynamic b; ์ ๊ฐ์
var c = null; // dynamic c = null ๊ณผ ๊ฐ์
dynamic d = 1;
dynamic f;
dynamic e = null;
๋ง์ง๋ง์ ๋น๋๊ธฐ๋ฅผ ์ํ ํค์๋ 'late' ์ ๋๋ค. ์๋ฒ ํต์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๊ธฐํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํ ์ ์์ต๋๋ค. ์ด๋๋ฅผ ์ํด ์ฌ์ฉ๋๋ ๊ฒ์ด 'late' ํค์๋ ์ ๋๋ค. ์ด๊ธฐ๊ฐ์ด ์ค์ ๋ ๋๊น์ง null์ ์ ์งํ๊ณ ์๋ค๊ฐ. ๊ฐ์ด ์ด๊ธฐํ ๋๋ฉด nonullable ๋ณ์๋ก ๋ณํํฉ๋๋ค. ์ด๊ธฐํํ๊ณ ๋ ํ์๋ null ๊ฐ์ ๋ฃ์ ์ ์๋ค๋ ๊ฒ ์ ๋๋ค. '?'๋ฅผ ์ฌ์ฉํด์ ๊ณ์ ๋ณ์๋ฅผ nullable ๋ณ์๋ก ๋ง๋๋ ๊ฒ ๋ณด๋ค๋ ํจ์ฌ ์ธ๋ จ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
late String _temperature;
Future<void> getWeather async {
_temperature = await server.getWether();
// server๋ ์๋ฒ ์ฝ๋์
// getWeather๋ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํจ
// _temperature๋ฅผ ์์๋ก ์ด๊ธฐํ ํ ์ ์์ผ๋ late ํค์๋ ์ฌ์ฉ
}
๋ง์น๋ฉด์
์ด๋ณด์๋ถ๋ค์ ๋์์ผ๋ก ๊ธ์ ์์ฑํ์ฌ ๋ง์ ๋ด์ฉ๋ค์ ์ถ์์ํค๊ณ ๋จ์ํ๊ฒ ๋ง๋ค์์ต๋๋ค. ๋ค์ ๊ธ์์๋ ์ข ๋ ์ฌ์ธต์๊ฒ Null safety ๋ฅผ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด์ ๊ธด๊ธ์ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
Ps. ํ๋ฆฐ ๋ด์ฉ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์กฐ์ธ ๋ถํ๋๋ฆฝ๋๋ค. ํํธ ๋๋ฌ์ฃผ์๊ณ ํ๋ก์ฐ๋ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
'Flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Flutter ๊ธฐ์ด - 1ํ : Flutter ์ ๊ณผ๊ฑฐ, ํ์ฌ, ๋ฏธ๋ (0) | 2021.12.17 |
---|---|
Flutter Web 1ํ : ๊ตฌ๊ธ ์ฝ๋๋ฉ ๊ตฌํ (0) | 2021.07.20 |
Flutter์์ Webview(์น๋ทฐ) ์ฌ์ฉํ๊ธฐ (0) | 2021.07.01 |
Flutter / multi_image_picker Asset์ Image๋ก ๋ณด์ด๊ฒ ํ๊ธฐ (0) | 2021.02.19 |
Flutter/ popUntil ์ ํ ๋ ๊ฒ์ํ๋ฉด์ด ๋ฌ๋ค๋ฉด? (0) | 2021.02.19 |