์๊ฐ ๐
์๋ ํ์ธ์, Flutter ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! Flutter์์ var์ final์ ์ง์ ํ ์ฐจ์ด์ ์ด ๊ถ๊ธํ์ ๊ฐ์? ์ค๋์ ์ด ๊ธฐ๋ณธ์ ์ด์ง๋ง ๋งค์ฐ ์ค์ํ ๊ฐ๋ ๋ค์ ์ฝ๊ณ ์์ธํ๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค. ์ด๋ณด์๋ถํฐ ๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์๊น์ง ๋ชจ๋๊ฐ ์ดํดํ ์ ์๋๋ก ์ค๋ช ํด๋๋ฆฌ๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ์์ํด๋ณผ๊น์? ๐ฑ
var๋ ๋ฌด์์ผ๊น์?
var๋ ๋ง์น ์ง์ฐ๊ฐ๋ก ์ง์ ๋ค ๋ค์ ์ธ ์ ์๋ ํ์ดํธ๋ณด๋์ ๊ฐ์ต๋๋ค. ๊ฐ์ ์์ ๋กญ๊ฒ ๋ณ๊ฒฝํ ์ ์์ฃ .
void main() {
var ๋์ด = 25;
print(๋์ด); // ์ถ๋ ฅ: 25
๋์ด = 26; // ๋ณ๊ฒฝ ๊ฐ๋ฅ!
print(๋์ด); // ์ถ๋ ฅ: 26
var ์ด๋ฆ = "์ฒ ์";
์ด๋ฆ = "์ํฌ"; // ์ด๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค!
}
final์ ๋ฌด์์ผ๊น์?
final์ ๋ง์น ๋์ ์๊ธฐ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ํ ๋ฒ ์์ฑํ๋ฉด ์์ํ ๊ทธ ๊ฐ์ ์ ์งํฉ๋๋ค.
void main() {
final ๋์ด = 25;
// ๋์ด = 26; // ๐ซ ์๋ฌ! final ๋ณ์๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค
final String ์ด๋ฆ = "์ฒ ์";
// ์ด๋ฆ = "์ํฌ"; // ๐ซ ์๋ฌ! ์ด๊ฒ๋ ์๋ฉ๋๋ค
}
๋ฐ์ : ์ปฌ๋ ์ ์์์ final ๋์ ๐
์ฌ๊ธฐ์ ์ฌ๋ฏธ์๋ ๋ถ๋ถ์ด ๋์ต๋๋ค! final๋ก ์ ์ธ๋ ์ปฌ๋ ์ (List๋ Map)์ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ๋์ํฉ๋๋ค.
List์ final
void main() {
// final๋ก ๋ฆฌ์คํธ ์์ฑ
final List<String> ์น๊ตฌ๋ค = ['๋ฏผ์', '์ํฌ'];
// โ
๋๋๊ฒ๋ ์ด๊ฒ๋ค์ ๋ชจ๋ ๊ฐ๋ฅํฉ๋๋ค!
์น๊ตฌ๋ค.add('์ฒ ์'); // ์ถ๊ฐ ๊ฐ๋ฅ
์น๊ตฌ๋ค[0] = '์คํธ'; // ๋ณ๊ฒฝ ๊ฐ๋ฅ
์น๊ตฌ๋ค.remove('์ํฌ'); // ์ญ์ ๊ฐ๋ฅ
// โ ํ์ง๋ง ์ด๊ฒ์ ์๋ฉ๋๋ค
// ์น๊ตฌ๋ค = ['์๋ก์ด', '๋ฆฌ์คํธ']; // ์๋ฌ! ๋ฆฌ์คํธ ์์ฒด๋ฅผ ์๋ก ํ ๋นํ ์ ์์ต๋๋ค
}
์ด๋ ๊ฒ ์๊ฐํด๋ณด์ธ์ ๐ค
final์ ์ฃผ์ฐจ ๊ณต๊ฐ์ด๋ผ๊ณ ์๊ฐํด๋ด ์๋ค:
- ์ฃผ์ฐจ ๊ณต๊ฐ(๋ณ์)์ ์์น๋ ๋ฐ๊ฟ ์ ์์ต๋๋ค
- ํ์ง๋ง ๊ทธ ์์ ์ฐจ(๋ด์ฉ๋ฌผ)๋ ๋ฐ๊ฟ ์ ์์ต๋๋ค
- ์ฐจ๋ฅผ ์๋ฆฌํ๊ฑฐ๋ ์์ ๋ฐ๊ฟ ์ ์์ง๋ง, ์ฃผ์ฐจ ๊ณต๊ฐ ์์ฒด๋ ์ด๋ํ ์ ์์ต๋๋ค
์ง์ ํ ๋ถ๋ณ์ฑ ๋ง๋ค๊ธฐ ๐
๋ฐฉ๋ฒ 1: const ์ฌ์ฉํ๊ธฐ
void main() {
// ์ด ๋ฆฌ์คํธ๋ ์ง์ง๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค
final List<String> ๋ถ๋ณ์น๊ตฌ๋ค = const ['๋ฏผ์', '์ํฌ'];
// โ ์ด๋ฐ ๊ฒ๋ค์ด ๋ชจ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค:
// ๋ถ๋ณ์น๊ตฌ๋ค.add('์ฒ ์'); // ์๋ฌ!
// ๋ถ๋ณ์น๊ตฌ๋ค[0] = '์คํธ'; // ์๋ฌ!
// ๋ถ๋ณ์น๊ตฌ๋ค.remove('์ํฌ'); // ์๋ฌ!
}
๋ฐฉ๋ฒ 2: UnmodifiableListView ์ฌ์ฉํ๊ธฐ
import 'dart:collection';
void main() {
final ๊ธฐ๋ณธ๋ฆฌ์คํธ = ['์ฌ๊ณผ', '๋ฐ๋๋'];
final ์์ ๋ถ๊ฐ๋ฆฌ์คํธ = UnmodifiableListView(๊ธฐ๋ณธ๋ฆฌ์คํธ);
// โ ์ด๊ฒ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค
// ์์ ๋ถ๊ฐ๋ฆฌ์คํธ.add('์ค๋ ์ง'); // ์๋ฌ!
}
์ค์ ์ฌ์ฉ ์์ ๐
์ฌ์ฉ์ ํ๋กํ ์์
class ์ฌ์ฉ์ํ๋กํ {
// ์์ฑ ํ ๋ณ๊ฒฝ๋์ง ์์์ผ ํ๋ ๊ฒ๋ค
final String ์ฌ์ฉ์ID;
final String ์ด๋ฉ์ผ;
// ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฒ๋ค
var ๋ง์ง๋ง๋ก๊ทธ์ธ๋ ์ง;
var ํ๋กํ์ฌ์ง;
// ์์ ๊ฐ๋ฅํ ๋ฆฌ์คํธ
final List<String> ์ทจ๋ฏธ๋ค = [];
// ์์ ๋ถ๊ฐ๋ฅํ ๋ฆฌ์คํธ
final List<String> ๊ถํ = const ['์ฌ์ฉ์'];
์ฌ์ฉ์ํ๋กํ({
required this.์ฌ์ฉ์ID,
required this.์ด๋ฉ์ผ,
});
}
์ค๋ฌด ํ์ฉ ๊ฐ์ด๋: ์ธ์ ๋ฌด์์ ์ฌ์ฉํ ๊น์? ๐ฏ
var๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
- ๊ฐ์ ๋์ค์ ๋ณ๊ฒฝํด์ผ ํ ๋
- ํจ์ ๋ด ์ง์ญ ๋ณ์๋ก ์ฌ์ฉํ ๋
- ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋
void ์์() {
var ์นด์ดํฐ = 0;
var ์์๋ฐ์ดํฐ = ๋ฐ์ดํฐ๊ฐ์ ธ์ค๊ธฐ();
var ์ฌ์ฉ์์
๋ ฅ = ์ฌ์ฉ์์
๋ ฅ๋ฐ๊ธฐ();
}
final์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
- ์ฌํ ๋น์ ๋ฐฉ์งํ๊ณ ์ถ์ ๋
- ํด๋์ค ์์ฑ์ผ๋ก ์ฌ์ฉํ ๋
- ์ค์ ๊ฐ์ ๋ค๋ฃฐ ๋
class ์ค์ {
final String APIํค;
final String ์๋ฒ์ฃผ์;
final List<String> ํ์ฉ๋์ฌ์ฉ์ = []; // ์์ ๊ฐ๋ฅํ ๋ฆฌ์คํธ
}
const๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
- ์ง์ ํ ๋ถ๋ณ์ฑ์ด ํ์ํ ๋
- ์์๊ฐ์ ๋ค๋ฃฐ ๋
- ๋ณ๊ฒฝํ ์ ์๋ ์ปฌ๋ ์ ์ด ํ์ํ ๋
class ์์ {
static const List<String> ์ง์์ธ์ด = const ['ko', 'en', 'ja'];
static const double ๋ถ๊ฐ์ธ์จ = 0.1;
}
ํ๋ก ํ ๐ก
- ๊ธฐ๋ณธ์ ์ผ๋ก final ์ฌ์ฉํ๊ธฐ
- ๋ชจ๋ ๊ฒ์ final๋ก ์์ํ์ธ์
- ๊ผญ ํ์ํ ๋๋ง var๋ก ๋ฐ๊พธ์ธ์
- ์ปฌ๋ ์ ์์ ์ฑ
- ์ง์ ํ ๋ถ๋ณ์ฑ์ด ํ์ํ๋ฉด const ์ฌ์ฉ
- ๋ฐํ์ ๋ถ๋ณ์ฑ์ด ํ์ํ๋ฉด UnmodifiableListView ์ฌ์ฉ
- ์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
- final์ ๋ฒ๊ทธ ๋ฐฉ์ง์ ๋์
- const๋ ๋ฐํ์ ์ฑ๋ฅ ํฅ์์ ๋์
์์ฃผ ํ๋ ์ค์๋ค โ
class ์ผ๋ฐ์ ์ธ์ค์ {
// โ ๋์จ: ์์์ var ์ฌ์ฉ
var APIํค = "my-api-key";
// โ
์ข์: ์์์ final ์ฌ์ฉ
final String APIํค = "my-api-key";
// โ ๋์จ: final์ด ๋ฆฌ์คํธ๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋ ๋ค๊ณ ์ฐฉ๊ฐ
final List<int> ์ ์๋ค = [1, 2, 3];
// โ
์ข์: ์ง์ ํ ๋ถ๋ณ ๋ฆฌ์คํธ๋ฅผ ์ํด const ์ฌ์ฉ
final List<int> ์ ์๋ค = const [1, 2, 3];
}
๊ฒฐ๋ก ๐
Flutter์์ var์ final์ ์ฐจ์ด(๊ทธ๋ฆฌ๊ณ ์ปฌ๋ ์ ์์์ ๋์)๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ธฐ์ตํ์ธ์:
- ๋ณ๊ฒฝ์ด ํ์ํ ๋๋ var ์ฌ์ฉ
- ๊ธฐ๋ณธ์ ์ผ๋ก๋ final ์ฌ์ฉ
- ์ง์ ํ ๋ถ๋ณ์ฑ์ด ํ์ํ ๋๋ const ์ฌ์ฉ
- ์ปฌ๋ ์ ์ฌ์ฉ ์ ์ฃผ์ํ๊ธฐ!
๋น ๋ฅธ ์ฐธ์กฐ ๊ฐ์ด๋ ๐
// ๋ณ์ ์ ์ธ ์นํธ ์ํธ
var ๋ณ๊ฒฝ๊ฐ๋ฅ = "๋๋ ๋ณํ ์ ์์ด์"; // ๊ฐ๋ณ
final ๋ถ๋ณ = "๋๋ ๋ณํ ์ ์์ด์"; // ๋ถ๋ณ ์ฐธ์กฐ
const ์์ = "๋๋ ์ง์ ํ ์์์์"; // ์ปดํ์ผ ํ์ ์์
// ์ปฌ๋ ์
์์
final List<String> ๊ฐ๋ณ๋ฆฌ์คํธ = []; // ๋ด์ฉ ์์ ๊ฐ๋ฅ
final List<String> ๋ถ๋ณ๋ฆฌ์คํธ = const []; // ๋ด์ฉ ์์ ๋ถ๊ฐ