extension - ๋จ์ด ๋ง๋ ํด๋์ค์ ๋ด ํจ์ ๋ถ์ด๊ธฐ
์ง๋ ๊ธ์์ ์์๊ณผ mixin์ ๋ค๋ค๋ค. ๊ทผ๋ฐ ์์์ด๋ mixin์ด๋ ๋ด๊ฐ ํด๋์ค๋ฅผ ์ง์ ๋ง๋ค ์ ์์ ๋๋ง ์ธ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค. String์ด๋ int์ฒ๋ผ Dart๊ฐ ๋ง๋ค์ด๋ ํด๋์ค์ ๋ด ํจ์๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒ ํ ๊น?
์ด๋ฉ์ผ ํ์์ธ์ง ๊ฒ์ฌํ๋ ๊ธฐ๋ฅ์ String์ ๋ถ์ด๊ณ ์ถ๋ค๊ณ ํด๋ณด์. ์ฒ์์ ์ด๋ ๊ฒ ์ง๊ฒ ๋๋ค.
class MyString extends String { // ์ฌ๊ธฐ์ ์๋ฌ๋จ
bool isEmail() => contains('@');
}Classes can't extend 'String'. ์๋ฌ๊ฐ ๋๋ค. String, int, bool ๊ฐ์ ๊ธฐ๋ณธ ํด๋์ค๋ Dart๊ฐ ์์ ์์ฒด๋ฅผ ๋ง์๋จ๋ค.
๊ทธ๋ผ ๋ณ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ์ฐ๋ฉด ๋๊ธด ํ๋ค.
bool isEmail(String text) => text.contains('@');
void main() {
print(isEmail('test@mail.com')); // true
}๋์์ ํ๋๋ฐ, ์ธ ๋๋ง๋ค isEmail(text)์ฒ๋ผ ๊ฐ์ ํจ์์ ๋ฃ๋ ๋ชจ์์ด ๋๋ค. text.toUpperCase()์ฒ๋ผ text.isEmail()๋ก ์ฐ๊ณ ์ถ์๋ฐ ๊ทธ๊ฒ ์ ๋๋ค.
ํด๊ฒฐ: extension์ผ๋ก ๊ธฐ์กด ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋ถ์ธ๋ค
extension EmailCheck on String {
bool isEmail() => contains('@');
}
void main() {
print('test@mail.com'.isEmail()); // true
print('hello'.isEmail()); // false
}๋ฌธ๋ฒ์ extension ์ด๋ฆ on ๋์ํ์
{ ... }์ด๋ค. on String์ด "String ํ์
์ ๋ถ์ธ๋ค"๋ ๋ป์ด๊ณ , ์ด์ ๋ชจ๋ String์์ .isEmail()์ ์ธ ์ ์๋ค. ์๋ ํด๋์ค ์ฝ๋๋ ํ๋๋ ์ ๊ฑด๋๋ ธ๋๋ฐ ๋ง์น ์๋ ์๋ ๋ฉ์๋์ฒ๋ผ ์ฐ์ธ๋ค.
extension ์์์ this๋ ๋์ ๊ฐ ์์ ์ด๋ค
extension StringUtil on String {
String get firstChar => isEmpty ? '' : this[0];
String addHello() => '์๋
, $this';
}
void main() {
print('ํ๊ธธ๋'.firstChar); // ํ
print('ํ๊ธธ๋'.addHello()); // ์๋
, ํ๊ธธ๋
}this๊ฐ 'ํ๊ธธ๋' ๊ทธ ๊ฐ์ด๋ค. isEmpty์ฒ๋ผ this.๋ฅผ ์๋ตํ๊ณ ์จ๋ ๊ฐ์ ๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. getter(get firstChar)๋ ๋ง๋ค ์ ์๋ค.
์์ฃผ ์ฐ๋ ํจํด: ์ซ์, ๋ฆฌ์คํธ์๋ ๋ถ์ธ๋ค
extension IntUtil on int {
bool get isAdult => this >= 20;
}
extension ListUtil on List<int> {
int get total => fold(0, (sum, item) => sum + item);
}
void main() {
print(25.isAdult); // true
print([1, 2, 3].total); // 6
}ํ๊ณ: ํ๋๋ ๋ชป ์ถ๊ฐํ๋ค
extension Bad on String {
int count = 0; // ์๋ฌ! extension์ ํ๋(์ํ)๋ฅผ ๊ฐ์ง ์ ์์
}extension์ ๊ธฐ์กด ํด๋์ค์ ๋์(๋ฉ์๋, getter)๋ง ์น๋ ๊ฒ์ด์ง, ๊ฐ์ฒด๊ฐ ์ ์ฅํ๋ ๊ฐ(ํ๋)์ ์๋ก ๋ง๋ค ์๋ ์๋ค. ๊ฐ์ ์ ์ฅํด์ผ ํ๋ฉด ๋ณ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
๋ ํ๋, ์๋ ํด๋์ค์ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๊ฐ ์ด๋ฏธ ์์ผ๋ฉด ์๋ ๊ฒ์ด ์ฐ์ ํ๋ค. extension์ ๊ธฐ์กด ๋์์ ๋ฎ์ด์ฐ๋ ๋๊ตฌ๊ฐ ์๋๋ค.
Kotlin, Swift์ ๋น๊ตํ๋ฉด
Kotlin ํ์ฅ ํจ์๋ฅผ ์จ๋ดค๋ค๋ฉด ๊ฑฐ์ ๋๊ฐ๋ค.
// Kotlin
fun String.isEmail(): Boolean = contains("@")
"test@mail.com".isEmail()// Swift
extension String {
func isEmail() -> Bool { contains("@") }
}
"test@mail.com".isEmail()Dart | Kotlin | Swift | |
๋ฌธ๋ฒ |
|
|
|
์ฌ๋ฌ ๊ฐ ๋ฌถ๊ธฐ | extension ๋ธ๋ก ์์ ์ฌ๋ฌ ๊ฐ | ํจ์๋ง๋ค ๋ฐ๋ก ์ ์ธ | extension ๋ธ๋ก ์์ ์ฌ๋ฌ ๊ฐ |
ํ๋ ์ถ๊ฐ | ๋ถ๊ฐ | ๋ถ๊ฐ | ์ ์ฅ ํ๋กํผํฐ ๋ถ๊ฐ |
Dart๋ Swift์ฒ๋ผ ๋ธ๋ก์ผ๋ก ๋ฌถ์ด์ ์ฐ๊ณ , on์ผ๋ก ๋์์ ์ง์ ํ๋ค๋ ์ ์ด ๋ค๋ฅด๋ค. ๋์ Kotlin/Swift ์ต๊ด ๊ทธ๋๋ก "๊ธฐ๋ฅ ์ถ๊ฐ๋ ๋๊ณ ์ ์ฅ ํ๋๋ ์ ๋๋ค"๋ ๊ท์น์ด ๋๊ฐ์ด ์ ์ฉ๋๋ค.
์ ๋ฆฌ
String,int๊ฐ์ ๊ธฐ๋ณธ ํด๋์ค๋ ์์์ด ๋งํ ์์ด์, ๊ธฐ๋ฅ์ ๋ถ์ด๋ ค๋ฉด extension์ ์ด๋ค- ๋ฌธ๋ฒ์
extension ์ด๋ฆ on ๋์ํ์ { ... }์ด๊ณ , ์์์this๋ ๋์ ๊ฐ ์์ ์ด๋ค - ๋ฉ์๋์ getter๋ ์ถ๊ฐํ ์ ์์ง๋ง, ํ๋(์ ์ฅ ๊ฐ)๋ ์ถ๊ฐํ ์ ์๋ค
- ์๋ ํด๋์ค์ ๊ฐ์ ์ด๋ฆ์ด ์์ผ๋ฉด ์๋ ๊ฒ์ด ์ฐ์ ํ๋ค
- Kotlin ํ์ฅ ํจ์, Swift extension๊ณผ ๊ฐ๋ ์ด ๊ฐ๋ค
๋ค์ ๊ธ์์๋ ์ปฌ๋ ์
(List, Map, Set)๊ณผ map / where / fold๋ฅผ ๋ค๋ค๋ณด๊ฒ ๋ค.
