์์๊ณผ mixin - Dart๋ ๋ค์ค ์์์ ์ mixin์ผ๋ก ์ฐํํ๋
์ง๋ ๊ธ์์ ์์ฑ์๋ฅผ ๋ค๋ค์ผ๋, ์ด๋ฒ์ ํด๋์ค ํ์ฅ ์๊ธฐ๋ค. Kotlin์์ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ ๊ตฌํํ๋ ์ต๊ด๋๋ก, Dart์์๋ ํด๋์ค ์ฌ๋ฌ ๊ฐ๋ฅผ ํ ๋ฒ์ ์์ํ๋ ค๊ณ ํ๋ฉด ๋ฐ๋ก ๋งํ๋ค.
class Flyer {
void fly() => print('๋๋ค');
}
class Swimmer {
void swim() => print('ํค์์น๋ค');
}
class Duck extends Flyer, Swimmer { // ์ฌ๊ธฐ์ ์๋ฌ๋จ
}Only one extends clause allowed. extends๋ ์ ํํ ํ๋์ ๋ถ๋ชจ๋ง ํ์ฉํ๋ค. ๋ ๊ฐ ์ด์์ ํด๋์ค๋ก๋ถํฐ ๋ญ๊ฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ์ผ๋ฉด extends๊ฐ ์๋๋ผ ๋ค๋ฅธ ๋ฌธ๋ฒ์ ์จ์ผ ํ๋ค.
์ ์ค ๋ญ ์ผ๋ง๋ ๊ฐ์ ธ์ค๋์ง ๋จผ์ ์ ๋ฆฌํ์
Dart์๋ ํด๋์ค๋ผ๋ฆฌ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ์ ์๊ณ , ๊ฐ๊ฐ "๊ฐ์ ธ์ค๋ ์"์ด ๋ค๋ฅด๋ค.
๊ฐ์ ธ์ค๋ ์ | ๋ช ๊ฐ๊น์ง | ์ ๊ฑด๋๋ฆฌ๋ฉด | |
| 0% (์ด๋ฆยทํ์ ๋ง ๊ฐ์ ) | ์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ | ์ปดํ์ผ ์๋ฌ (์ ๋ถ ์ง์ ์ฑ์์ผ ํจ) |
| 100% (์ ์ฒด) | ๋ฑ 1๊ฐ๋ง | ๊ทธ๋๋ก ๋ฌผ๋ ค๋ฐ์ ๊ฒ ์ฌ์ฉ |
| 100% (์ ์ฒด) | ์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ | ๊ทธ๋๋ก ๋ฌผ๋ ค๋ฐ์ ๊ฒ ์ฌ์ฉ |
์ด ํ๋ฅผ ๊ธฐ์ตํด๋๊ณ ํ๋์ฉ ๋ณด์.
implements โ ์ด๋ฆ๊ณผ ํ์
๋ง ๊ฐ์ , ๋ด์ฉ์ 0% ์ฌ์ฌ์ฉ
class Flyer {
void fly() => print('๋๋ค');
int speed = 10;
}
class Duck implements Flyer {
@override
void fly() => print('์ค๋ฆฌ๊ฐ ๋๋ค'); // ๋ด์ฉ์ ์์ ํ ์๋ก ์์ฑ
@override
int speed = 5;
}implements๊ฐ ๊ฐ์ ํ๋ ๊ฑด ์๊ทธ๋์ฒ(์ด๋ฆ + ํ์
+ ํ๋ผ๋ฏธํฐ ๊ตฌ์ฑ)๋ฟ์ด๋ค. "fly๋ผ๋ ์ด๋ฆ์, ํ๋ผ๋ฏธํฐ ์๊ณ ๋ฐํ๊ฐ ์๋ ๋ฉ์๋๊ฐ ์์ด์ผ ํ๋ค", "speed๋ผ๋ ์ด๋ฆ์ int ํ๋๊ฐ ์์ด์ผ ํ๋ค"๊น์ง๋ง ๊ฒ์ฌํ๊ณ , ๊ทธ ์์ ์ค์ ๋ด์ฉ({ } ๋ชธํต, = ๊ฐ)์ ์ ์ ์ผ๋ก ์๋ก ์ฑ์์ผ ํ๋ ์์ ์์ญ์ด๋ค. ํ๋๋ผ๋ ๋น ๋จ๋ฆฌ๋ฉด Missing concrete implementation ์๋ฌ๊ฐ ๋๋ค โ ์ ๋ถ ๋ค ์ดํํด์ผ ํ๋ ๊ณ์ฝ์ด๋ผ, "์ด๊ฑด ํ์ ์์ผ๋ ๋นผ์"๊ฐ ์ ๋๋ค.
Swift ํด๋ดค์ผ๋ฉด ์ด๊ฒ ์ ํํ protocol์ด๋ค.
protocol Flyer {
func fly()
var speed: Int { get }
}
class Duck: Flyer {
func fly() { print("์ค๋ฆฌ๊ฐ ๋๋ค") } // ์ง์ ๊ตฌํ
var speed: Int = 5
}extends โ ์ ๋ถ ๊ทธ๋๋ก, ์ํ๋ ๊ฒ๋ง ๋ฎ์ด์ฐ๊ธฐ
class Flyer {
void fly() => print('๋๋ค');
int speed = 10;
}
class Duck extends Flyer {
@override
void fly() => print('์ค๋ฆฌ๊ฐ ๋๋ค'); // fly()๋ง ๋ฐ๊ฟ
// speed๋ ์ ๊ฑด๋๋ฆผ - ์๋ณธ(10) ๊ทธ๋๋ก ์ฌ์ฉ๋จ
}
void main() {
final duck = Duck();
duck.fly(); // ์ค๋ฆฌ๊ฐ ๋๋ค
print(duck.speed); // 10
}extends๋ ๋ถ๋ชจ๊ฐ ๊ฐ์ง ๊ฑธ ์ ๋ถ ์๋์ผ๋ก ๋ฌผ๋ ค๋ฐ๋๋ค. ๊ทธ์ค ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒ๋ง @override๋ก ์ฌ์ ์ํ๋ฉด ๋๊ณ , ์ ๊ฑด๋๋ฆฐ ๊ฑด ์๋ณธ ๊ทธ๋๋ก ์ฐ์ธ๋ค. ๋ค๋ง "์ด๊ฑด ๋ฐ์ง ๋ง๊ณ ์ ๊ฑด ๋ฐ์" ์์ผ๋ก ๊ณจ๋ผ์ ๋ฐ๋ ๊ฑด ์ ๋๋ค โ ๋ฐ๋ ๊ฑด ํญ์ ์ ๋ถ๊ณ , ๊ณ ๋ฅผ ์ ์๋ ๊ฑด "๋ฐ์ ๊ฒ ์ค ๋ญ overrideํ ์ง"๋ฟ์ด๋ค. ์ด๊ฑด Swift/Kotlin์ ํ๋ฒํ ํด๋์ค ์์๊ณผ ๋๊ฐ๋ค.
mixin + with โ extends์ฒ๋ผ ์ ๋ถ ๋ค, ๊ทผ๋ฐ ์ฌ๋ฌ ๊ฐ ๋์์
mixin Flyer {
void fly() => print('๋๋ค');
}
mixin Swimmer {
void swim() => print('ํค์์น๋ค');
}
class Duck with Flyer, Swimmer {
// fly(), swim() ๋ ๋ค ๋ค์ ์ ์จ๋ ๊ทธ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅ
}
void main() {
final duck = Duck();
duck.fly(); // ๋๋ค
duck.swim(); // ํค์์น๋ค
}class๋ฅผ mixin์ผ๋ก ์ ์ธํ๊ณ , Duck์์ with ๋ค์ ์ผํ๋ก ์ฌ๋ฌ ๊ฐ ๋์ดํ๋ฉด ๋๋ค. extends์ ๋๊ฐ์ด ์ ์ฒด๊ฐ ๊ทธ๋๋ก ๋ธ๋ ค์ค๋๋ฐ, ์ ์ผํ ์ฐจ์ด๋ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋์์ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ.
mixin์ ์์ฑ์๋ฅผ ๊ฐ์ง ์ ์๋ค
mixin Flyer {
Flyer(); // ์๋ฌ! mixin์ ์์ฑ์๋ฅผ ๊ฐ์ง ์ ์์
void fly() => print('๋๋ค');
}mixin์ "๋
๋ฆฝ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ๋จ์"๊ฐ ์๋๋ผ, ๋ค๋ฅธ ํด๋์ค์ ์ฝ๋๋ฅผ ์น์ด์ฃผ๋ ์ฉ๋๋ก๋ง ์กด์ฌํ๋ค. ๊ทธ๋์ Flyer()์ฒ๋ผ ๋จ๋
์ผ๋ก ์ธ์คํด์คํํ๋ ๊ฒ๋ ์ ๋๋ค.
mixin์ ์ ๋ฐ๋ก ์๊ฒผ๋ โ ๋ค์ค ์์์ ์ํ์ ํผํ๋ ค๊ณ
์๋ ์ธ์ด๋ค์ ํด๋์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ๊ทธ๋ฅ ์์ํ๊ฒ ํด์คฌ๋ค๊ฐ, ๋ ๋ถ๋ชจ๊ฐ ๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋/ํ๋๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ "๋๊ตฌ ๊ฑธ ๋ฌผ๋ ค๋ฐ์์ผ ํ๋์ง" ์ ๋งคํด์ง๋ ๋ค์ด์๋ชฌ๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค. Dart๋ ์ด๊ฑธ ํผํ๋ ค๊ณ ์ญํ ์ ๋๋ด๋ค โ extends๋ ์กฑ๋ณด๊ฐ ๊ผฌ์ผ ์ผ ์๊ฒ ํ๋๋ง, implements๋ ์ฝ๋๊ฐ ์์ ์์ผ๋ ์ถฉ๋ํ ๊ฒ๋ ์๊ฒ, mixin์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ์์ฑ์๋ฅผ ๋ชป ๊ฐ๊ฒ ์ ํํด์ ์ํ์ ์ค์๋ค.
Kotlin, Swift์ ๋น๊ตํ๋ฉด
Kotlin๊ณผ Swift๋ implements/mixin์ ๋๋์ง ์๊ณ , ์ธํฐํ์ด์ค(ํ๋กํ ์ฝ) ํ๋๋ก ๋ ๋ค ์ฒ๋ฆฌํ๋ค.
// Kotlin - ์ธํฐํ์ด์ค์ ๊ธฐ๋ณธ ๊ตฌํ์ ์ง์ ๋ฃ์ ์ ์์
interface Flyer {
fun fly() = println("๋๋ค")
}
interface Swimmer {
fun swim() = println("ํค์์น๋ค")
}
class Duck : Flyer, Swimmer // fly(), swim() ๋ค์ ์ ์จ๋ ๊ทธ๋๋ก ์ฌ์ฉ// Swift - protocol๋ง์ผ๋ก๋ ํํ๋ง ๊ฐ์ ๋์ง๋ง, extension์ผ๋ก ๊ธฐ๋ณธ ๊ตฌํ์ ์น์ผ๋ฉด ์ฌ์ฌ์ฉ๋จ
protocol Flyer { func fly() }
extension Flyer {
func fly() { print("๋๋ค") } // ๊ธฐ๋ณธ ๊ตฌํ
}
protocol Swimmer { func swim() }
extension Swimmer {
func swim() { print("ํค์์น๋ค") }
}
class Duck: Flyer, Swimmer {} // ๊ธฐ๋ณธ ๊ตฌํ์ด ๊ทธ๋๋ก ๋ธ๋ ค์ด์ธ ์ธ์ด๋ฅผ ๋๋ํ ์ ๋ฆฌํ๋ฉด:
ํ๊ณ ์ถ์ ๊ฒ | Dart | Kotlin | Swift |
ํํ๋ง ๊ฐ์ , ๋ด์ฉ์ ๊ฐ์ ์์ฑ |
|
|
|
์ฝ๋๊น์ง ์ฌ์ฌ์ฉ, ์ฌ๋ฌ ๊ฐ ๋์์ |
|
|
|
ํ๋์ ๋ถ๋ชจ๋ก๋ถํฐ ์ ๋ถ ์์ |
| ํด๋์ค ์์ (ํ๋๋ง) | ํด๋์ค ์์ (ํ๋๋ง) |
Kotlin/Swift๋ ์ธํฐํ์ด์ค(ํ๋กํ ์ฝ) ํ๋๊ฐ "ํํ ๊ฐ์ "์ "์ฝ๋ ์ฌ์ฌ์ฉ"์ ์ํฉ์ ๋ฐ๋ผ ๋ค ๊ฒธํ๋ ๋ฐ๋ฉด, Dart๋ ์ด ๋์ implements์ mixin์ผ๋ก ์์ ๋ฌธ๋ฒ ์์ฒด๋ฅผ ๋๋ ๋จ๋ค๋ ๊ฒ ํต์ฌ ์ฐจ์ด๋ค.
์ ๋ฆฌ
implements๋ ์๊ทธ๋์ฒ(์ด๋ฆยทํ์ )๋ง ๊ฐ์ ํ๊ณ , ๋ด์ฉ์ 100% ์ง์ ์ฑ์์ผ ํ๋ค โ Swift์ ์์protocol๊ณผ ๊ฐ๋คextends๋ ๋ถ๋ชจ์ ์ ์ฒด๋ฅผ ๊ทธ๋๋ก ๋ฌผ๋ ค๋ฐ๊ณ , ์ํ๋ ๊ฒ๋ง@override๋ก ์ฌ์ ์ํ ์ ์๋ค โ ๋จ, ํ๋๋ง ๊ฐ๋ฅํ๋คmixin+with๋extends์ฒ๋ผ ์ ์ฒด๊ฐ ๊ทธ๋๋ก ๋ธ๋ ค์ค๋๋ฐ, ์ฌ๋ฌ ๊ฐ๋ฅผ ๋์์ ์์ ์ ์๋ค โ ๋์ mixin์ ์์ฑ์๋ฅผ ๊ฐ์ง ์ ์๋ค- Kotlin/Swift๋ ์ธํฐํ์ด์ค(ํ๋กํ ์ฝ) ํ๋๋ก ํํ ๊ฐ์ ์ ์ฝ๋ ์ฌ์ฌ์ฉ์ ๋ค ์ฒ๋ฆฌํ๊ณ , Dart๋ ์ด๊ฑธ
implements/mixin์ผ๋ก ๋ฌธ๋ฒ ์์ฒด๋ฅผ ๋๋ ๋๋ค
๋ค์ ๊ธ์์๋ extension์ ๋ค๋ค๋ณด๊ฒ ๋ค.
