ํจ์, ์ต๋ช ํจ์, ํ์ดํ ํจ์ - Dart์ ์ ํธ๋ ์ผ๋ง ๋๋ค๊ฐ ์๋
์ง๋ ๊ธ์์ null safety๋ฅผ ๋ค๋ค์ผ๋, ์ด๋ฒ์ ํจ์ ์ฐจ๋ก๋ค. Compose ์ฝ๋ ์ง๋ค ์จ ์ฌ๋์ด Dart ์ฒ์ ๋ง์ง๋ฉด ์ ์ผ ๋จผ์ ์ด์ํ๊ฒ ๋๋ผ๋ ๊ฒ ์ด๊ฑฐ๋ค โ Dart๋ก ๋ฐฐ์ด ๋ค๋ฃจ๋ค ๋ณด๋ฉด ์๊พธ it์ ์ฐ๊ณ ์ถ์ด์ง๋ค.
์ด๋ฐ ์ฝ๋๋ฅผ ์ง ๋ค๊ณ ํด๋ณด์. Kotlin์์ ํ๋ ์ต๊ด ๊ทธ๋๋ก๋ค.
void main() {
final numbers = [1, 2, 3];
final doubled = numbers.map { it * 2 }; // Kotlin ์ต๊ด ๊ทธ๋๋ก
print(doubled);
}์ด๊ฑฐ ๊ทธ๋๋ก ๋ฌธ๋ฒ ์๋ฌ๋ค. map ๋ค์ ๊ดํธ๋ ์์ด ๋ฐ๋ก ์ค๊ดํธ๊ฐ ์ค๋ ๊ฒ๋ถํฐ๊ฐ Dart ๋ฌธ๋ฒ์์ ์ฑ๋ฆฝํ์ง ์๋๋ค.
์์ธ: Dart๋ ํจ์ ๋ฆฌํฐ๋ด์ ๊ดํธ ๋ฐ์ผ๋ก ๊บผ๋ด์ฃผ์ง ์๋๋ค
Kotlin/Compose ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ด๋ฐ ์์ด๋ค.
Button(onClick = { println("ํด๋ฆญ") }) {
Text("ํ์ธ")
}์ฌ๊ธฐ์ Text("ํ์ธ")์ด ๋ค์ด์๋ ๋ง์ง๋ง ์ค๊ดํธ ๋ธ๋ก์, ์ฌ์ค Button์ ๋ง์ง๋ง ๋งค๊ฐ๋ณ์(๋ณดํต content: @Composable () -> Unit)๋ก ๋ค์ด๊ฐ๋ ๋๋ค์ธ๋ฐ, ๊ดํธ๋ฅผ ๋ซ๊ณ ๊ทธ ๋ฐ๊นฅ์ผ๋ก ๋นผ์ ์ธ ์ ์๊ฒ Kotlin์ด ํ๋ฝํด์ฃผ๋ ๊ฑฐ๋ค(ํธ๋ ์ผ๋ง ๋๋ค).
Dart๋ ์ด ๊ท์น์ด ์๋ค. ํจ์๋ฅผ ๊ฐ์ผ๋ก ๋๊ธธ ๋, ๊ทธ ํจ์ ์ฝ๋๋ ํญ์ ํธ์ถ ๊ดํธ ์์ ๊ทธ๋๋ก ๋ค์ด์์ด์ผ ํ๋ค.
Column(
children: [
Text('์๋
'),
],
);Flutter ์์ ฏ ์ฝ๋ ๋์ );๊ฐ ๊ณ์ ๋ฐ๋ผ๋ถ๋ ์ด์ ๊ฐ ์ด๊ฑฐ๋ค. Compose๋ ๋ง์ง๋ง ๋๋ค๋ฅผ ๋ฐ์ผ๋ก ๋นผ์ฃผ๋๊น ๊ดํธ๊ฐ ์ผ์ฐ ๋ซํ๋ ๋ฐ๋ฉด, Dart๋ ์ฒ์ ์ฐ ๊ดํธ๊ฐ ๋๊น์ง ์ ๋ซํ๊ณ ์ญ ์ด์ด์ง๋ค โ ์ด๊ฒ ๋ ์ฝ๋์ ์๊น์๊ฐ ๋ค๋ฅธ ์ง์ง ์ด์ ๋ค.
๊ทธ๋ผ it์? โ Dart๋ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ํญ์ ์ง์ ์จ์ผ ํ๋ค
void main() {
final numbers = [1, 2, 3];
final doubled = numbers.map((item) => item * 2);
print(doubled); // (2, 4, 6)
}Kotlin์ it์ฒ๋ผ "๋งค๊ฐ๋ณ์ ํ๋๋ฉด ์๋์ผ๋ก ์ด๋ฆ ๋ถ์ฌ์ฃผ๋" ๊ธฐ๋ฅ์ด Dart์ ์๋ค. (item)์ฒ๋ผ ์ด๋ฆ์ ์ง์ ์ ํด์ค์ผ ํ๋ค. ์ฌ๊ธฐ์ item์ ๋ฐํ๊ฐ์ ์ด๋ฆ์ด ์๋๋ผ, map์ด ๋ฆฌ์คํธ์์ ํ๋์ฉ ๊บผ๋ด์ ๋๊ฒจ์ฃผ๋ "์
๋ ฅ๊ฐ"์ ์ด๋ฆ์ด๋ผ๋ ๊ฑธ ์ง๊ณ ๋์ด๊ฐ์. it์ด ๋์ ํ๋ ๊ฒ๋ ์ ํํ ์ด ์
๋ ฅ๊ฐ ์ด๋ฆ์ด๋ค.
Dart์์ ํจ์๋ฅผ ๋ง๋๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ
์ฌ๊ธฐ์๋ถํฐ๊ฐ ์ค๋ ๊ธ์ ๋ณธ๋ก ์ด๋ค.
- ์ด๋ฆ ์๋ ํจ์
int double(int x) {
return x * 2;
}- ์ต๋ช ํจ์ (์ด๋ฆ ์์ด, ๊ฐ์ฒ๋ผ ๋ค๋ฅธ ๊ณณ์ ๋๊ธฐ๋ ํจ์)
final doubled = numbers.map((item) {
return item * 2;
});- ํ์ดํ ํจ์ (
=>, ๋ชธํต์ด ๋ฑ ํ ์ค์ง๋ฆฌ ํํ์์ผ ๋ ์ค์ฌ ์ฐ๋ ๊ฒ)
final doubled = numbers.map((item) => item * 2);์ด ์
์ ์๋ก ๋ค๋ฅธ ๋ฌธ๋ฒ์ด ์๋๋ผ, ๊ฐ์ ๊ฑธ ์ํฉ์ ๋ฐ๋ผ ์ค์ฌ ์ด ๊ฒ์ด๋ค. 2๋ฒ๊ณผ 3๋ฒ์ ์์ ํ ๊ฐ์ ์ฝ๋๋ค. { return ํํ์; }์ => ํํ์์ผ๋ก ์ค์ธ ๊ฒ๋ฟ์ด๋ค.
=> ๋ค์๋ ํํ์ ํ๋๋ง ์ฌ ์ ์๋ค. ๋ก์ง์ด ์ฌ๋ฌ ์ค์ด๋ฉด => ๋์ ์ค๊ดํธ({ })๋ก ํ์ด์จ์ผ ํ๋ค.
// Dart - ์ฌ๋ฌ ์ค์ด๋ผ => ๋์ { } ์ฌ์ฉ
final doubled = numbers.map((item) {
print('์ฒ๋ฆฌ ์ค: $item');
return item * 2;
});// Kotlin - ๋๊ฐ์ด ์ฌ๋ฌ ์ค
val doubled = numbers.map { item ->
println("์ฒ๋ฆฌ ์ค: $item")
item * 2
}๋ ๋ค "๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ๋จผ์ ๋ฐํ๊ณ , ๊ทธ ๋ค์ ์ฌ๋ฌ ์ค ๋ก์ง์ด ์จ๋ค"๋ ํ์ ๊ฐ๋ค. ๋ค๋ง Dart๋ ๊ดํธ+์ค๊ดํธ๋ก ๋๋ ์ฐ๊ณ ๋ง์ง๋ง์ return์ ์ง์ ์จ์ผ ํ๋ ๋ฐ๋ฉด, Kotlin์ ์ค๊ดํธ ํ๋ ์์์ ->๋ก ๊ตฌ๋ถํ๊ณ ๋ง์ง๋ง ์ค์ด ์๋์ผ๋ก ๋ฐํ๊ฐ์ด ๋๋ค(return ์ ์จ๋ ๋จ)๋ ์ฐจ์ด๊ฐ ์๋ค.
์ด๋ฆ ์๋ ํจ์๋ ํ์ดํ๋ก ์ค์ผ ์ ์๋ค
// ์๋
int double(int x) {
return x * 2;
}
// ํ์ดํ๋ก ์ค์
int double(int x) => x * 2;์ฌ๊ธฐ์ ํท๊ฐ๋ฆฌ๊ธฐ ์ฌ์ด ๋ถ๋ถ ํ๋. int double(int x) => x * 2;์์ ๋งจ ์ int(๋ฐํ ํ์
)๋ =>๋ฅผ ์ผ๊ธฐ ๋๋ฌธ์ ํ์ํด์ง ๊ฒ ์๋๋ค. Dart๋ ์ด๋ฆ ์๋ ํจ์๋ฅผ ์ ์ํ ๋ ์๋๋ถํฐ ๋ฐํ ํ์
์ ๋ช
์ํ๋ ๊ฒ ๊ธฐ๋ณธ ์คํ์ผ์ด๊ณ , { return ... }์ผ๋ก ํ์ด์ฐ๋ =>๋ก ์ค์ด๋ ์ด ํ๊ธฐ๋ ๊ทธ๋๋ก ์ ์ง๋๋ค.
// ๋ ๋ค ๋ฐํ ํ์
์ ๋๊ฐ์ด ์จ์ค๋ค - => ์ฌ๋ถ์ ๋ฌด๊ด
int double(int x) {
return x * 2;
}
int double(int x) => x * 2;Kotlin์ fun double(x: Int) = x * 2๋ ์ฌ์ค ๋ฐํ ํ์
(Int)์ ์๋ตํ ๊ฑฐ์ง, fun double(x: Int): Int = x * 2๋ผ๊ณ ์ธ ์๋ ์๋ค. Kotlin์ด ํ์
์ถ๋ก ์ ๋ ์ ๊ทน์ ์ผ๋ก ์๋ตํด์ฃผ๋ ์คํ์ผ์ด๊ณ , Dart๋ ๋ช
์ํ๋ ์คํ์ผ์ ์ ํธํ๋ ์ ๋์ ์ฐจ์ด์ผ ๋ฟ์ด๋ค.
Kotlin์ด๋ ๋น๊ตํ๋ฉด
Dart | Kotlin | ์ฐจ์ด์ |
|
| Dart๋ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์ง์ ์จ์ผ ํ๊ณ , ๊ดํธ ๋ฐ์ผ๋ก ๋ชป ๋บ๋ค |
|
| ์ฌ๋ฌ ์ค ๋ก์ง์ผ ๋ ํํ. Dart๋ return ํ์, Kotlin์ ๋ง์ง๋ง ์ค์ด ์๋ ๋ฐํ |
|
| ํ ์ค ํจ์๋ฅผ |
๋๋ค์ ๋ ๊ฐ์ง ์ฐ์ โ "์๋๋ก ๋น๋ ค์ฃผ๊ธฐ" vs "์๋ก ์๋ ค์ฃผ๊ธฐ"
์ง๊ธ๊น์ง ๋ณธ map ์์๋ ๋๋ค๋ฅผ ์๋๋ก ๋น๋ ค์ฃผ๋ ๊ฒฝ์ฐ์๋ค. ๋ด๊ฐ "๊ฐ ํญ๋ชฉ๋ง๋ค ์ด๋ ๊ฒ ํด์ค"๋ผ๋ ๋์์ ๋๊ธฐ๋ฉด, map์ด ๊ทธ๊ฑธ ์คํํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์ ์ฆ์ ๋๋ ค์ค๋ค.
๊ทผ๋ฐ Flutter์์ ํจ์ฌ ๋ ์์ฃผ ๋ง๋๋ ๊ฑด ์ด ๋ฐ๋ ๋ฐฉํฅ, ์ฝ๋ฐฑ์ด๋ค. ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์๋๋ค๊ฐ, ๋์ค์ ์ด๋ค ์ผ์ด ์๊ฒผ์ ๋ ๊ทธ ํจ์๋ฅผ ์คํํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ(์)์ผ๋ก ์๋ ค์ฃผ๋ ๋ฐฉ์์ด๋ค.
class SortButton extends StatelessWidget {
final VoidCallback onSortToggle; // Kotlin์ () -> Unit๊ณผ ๊ฐ์ ํ์
const SortButton({required this.onSortToggle});
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: onSortToggle,
child: Text('์ ๋ ฌ'),
);
}
}VoidCallback์ด Kotlin์ () -> Unit์ ํด๋นํ๋ ํ์
์ด๋ค. SortButton์ ๋ง๋ ์ชฝ(ํ์)์ด "๋ฒํผ์ด ๋๋ ธ๋ค"๋ ์ฌ์ค์ ์ด ์ฝ๋ฐฑ์ ํตํด ์์๋ก ์๋ ค์ค๋ค.
์์์์ ์ธ ๋๋ ์ด๋ ๊ฒ ๋๋ค.
// Dart - ํญ์ ๊ดํธ ์, ์ด๋ฆ ๋ถ์ฌ์
SortButton(
onSortToggle: () {
print('์ ๋ ฌ ํ ๊ธ๋จ');
},
);// Kotlin - ํ๋ผ๋ฏธํฐ๊ฐ ํ๋๋ฟ์ด๋ฉด ํธ๋ ์ผ๋ง ๋๋ค๋ก ๊ดํธ ๋ฐ์ผ๋ก ๋บ ์ ์์
SortButton {
println("์ ๋ ฌ ํ ๊ธ๋จ")
}๊ฒ๋ณด๊ธฐ ์ฐจ์ด๋ ํฌ์ง๋ง, "๋๋ค๋ฅผ ๋ง๋ค์ด์ ์ด๋ฆ ๋ถ์ ํ๋ผ๋ฏธํฐ์ ๋๊ธด๋ค"๋ ๋์ ์์ฒด๋ ๋์ผํ๋ค. ๋ค๋ง Dart๋ SortButton(...)์ ํจ์ ํธ์ถ์ด ์๋๋ผ ์์ ฏ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์์ฑ์ ํธ์ถ๋ก ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์, ์ฝ๋ฐฑ๋ ๋ค๋ฅธ ํ๋๋ค๊ณผ ๋๊ฐ์ด ๊ดํธ ์์์ ์ด๋ฆ๊ณผ ํจ๊ป ๋๊ฒจ์ผ ํ๋ค.
๊ธฐ์กด์ ๋ง๋ค์ด๋ ํจ์๋ฅผ ๊ทธ๋๋ก ๋๊ธธ ์๋ ์๋ค.
void _handleSortToggle() {
print('์ ๋ ฌ ํ ๊ธ๋จ');
}
SortButton(
onSortToggle: _handleSortToggle, // ๊ดํธ ์์ด ํจ์ ์์ฒด๋ฅผ ๋๊น
);_handleSortToggle()์ด ์๋๋ผ _handleSortToggle(๊ดํธ ์์ด)์ด๋ผ๋ ๊ฒ ์ค์ํ๋ค. ๊ดํธ๋ฅผ ๋ถ์ด๋ฉด "์ง๊ธ ๋น์ฅ ์คํํด์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋๊ฒจ๋ผ"๊ฐ ๋๊ณ , ๊ดํธ๋ฅผ ๋นผ๋ฉด "์ด ํจ์ ์์ฒด(๋์ค์ ์คํํ ๊ฒ)๋ฅผ ๋๊ฒจ๋ผ"๊ฐ ๋๋ค. ์ฝ๋ฐฑ์ ๋๊ธธ ๋ ํญ์ ๊ดํธ ์์ด ํจ์ ์ด๋ฆ๋ง ๋๊ธด๋ค.
์ ๋ฆฌ
- Dart๋ ํจ์(์ฝ๋ฐฑ)๋ฅผ ๋๊ธธ ๋, ๊ทธ ํจ์ ์ฝ๋๊ฐ ํญ์ ํธ์ถ ๊ดํธ ์์ ์์ด์ผ ํ๋ค โ Kotlin์ฒ๋ผ ๋ง์ง๋ง ๋๋ค๋ฅผ ๊ดํธ ๋ฐ์ผ๋ก ๋นผ๋ ํธ๋ ์ผ๋ง ๋๋ค ๋ฌธ๋ฒ์ด ์๋ค
- ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์๋์ผ๋ก
it์ผ๋ก ์๋ตํด์ฃผ๋ ๊ธฐ๋ฅ๋ ์๋ค โ ํญ์ ์ด๋ฆ์ ์ง์ ์ ํด์ค์ผ ํ๋ค (์ด๊ฑด ๋ฐํ๊ฐ์ด ์๋๋ผ ์ ๋ ฅ๊ฐ์ ์ด๋ฆ์ด๋ค) - ์ด๋ฆ ์๋ ํจ์, ์ต๋ช
ํจ์, ํ์ดํ ํจ์(
=>)๋ ๋ค๋ฅธ ๊ฒ ์๋๋ผ ๊ฐ์ ๊ฑธ ์ํฉ๋ณ๋ก ์ค์ฌ ์ฐ๋ ๊ฒ์ด๊ณ ,=>๋ ํํ์ ํ ์ค์ผ ๋๋ง ์ธ ์ ์๋ค - ๋ฐํ ํ์
๋ช
์๋
=>์ฌ๋ถ์ ๋ฌด๊ดํ๊ฒ, Dart ํจ์ ์ ์์ ๊ธฐ๋ณธ ์คํ์ผ์ด๋ค - ๋๋ค๋ "์๋๋ก ๋์์ ๋น๋ ค์ฃผ๋ ๊ฒ"(
map)๊ณผ "์๋ก ๊ฒฐ๊ณผ๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ"(์ฝ๋ฐฑ)์ผ๋ก ์ฐ์์ด ๋ค๋ฅด๊ณ , Flutter ์์ ฏ์onXxxํ๋ผ๋ฏธํฐ๋ ๋๋ถ๋ถ ํ์๋ค
๋ค์ ๊ธ์์๋ ํด๋์ค์ ์์ฑ์(named, factory), ์์, mixin, extension์ ๋ค๋ค๋ณด๊ฒ ๋ค.
