์๋์์ด๋ ๋ฌด์์ธ๊ฐ?
class Person(val name : String) {
fun addPerson(name : String) {
// ...
}
}
addPerson() ํจ์์ ํ๋ผ๋ฏธํฐ๊ฐ Person class์ ํ๋กํฐํฐ ์ด๋ฆ๊ณผ ๊ฐ์์ง๋ค.
์ธ๋ถ ์ค์ฝํ์ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ฆฌ๊ฒ ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๋์์ด๋ผ ํ๋ค.
์ด๋ฅผ ๊ฐ๋ฐ์๊ฐ ์์์ฐจ๋ฆฌ๊ธฐ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค.
ํ์ ํ๋ผ๋ฏธํฐ์์๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
interface Payment
class KakaoPay: Payment
class NaverPay: Payment
class PaymentHistory<T: Payment> {
fun <T: Payment> addPayment(payment: T) {
// ...
}
}
์ด๋ฌํ ๊ฒฝ์ฐ๋ PaymentHistory์ ์ ๋ค๋ฆญ ํ์ ๊ณผ addPayment()์ ํ์ ํ๋ผ๋ฏธํฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ฉ๋๋ค.
val paymentHistory = PaymentHistory<KakaoPay>()
paymentHistory.addPayment(KakaoPay())
paymentHistory.addPayment(NaverPay()) // ๋ง์ด ์ ๋๋ฉด์๋ ๋ง์ด ๋๋ ๊ฒฝ์ฐ..
์ ์์ ์ผ๋ก ๋์ํ๋ค.
๋ฌธ์ ๊ฐ ๋์ง ์๊ธฐ์, ๊ฐ๋ฐ์๋ ๋ฌธ์ ์ ์ ์ฝ์ฌ๋ฆฌ ์์์ฐจ๋ฆฌ๊ธฐ ์ฝ์ง ์๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด์
interface Payment
class KakaoPay: Payment
class NaverPay: Payment
class PaymentHistory<T: Payment> {
fun addPayment(payment: T) {
// ...
}
}
PaymentHistory Class์ ์ ๋ค๋ฆญ ํ์ ์ ๊ทธ๋๋ก addPayment() ํจ์ ํ๋ผ๋ฏธํฐ์๋ ์ ์ฉ์์ผฐ๋ค.
val paymentHistory = PaymentHistory<KakaoPay>()
paymentHistory.addPayment(KakaoPay())
paymentHistory.addPayment(NaverPay()) // ์ปดํ์ผ ์๋ฌ ๋ฐ์! Type mismatch
KakaoPay ํ์ ๋ง ๋ฐ์ ์ ์๊ฒ ํด๋์ค ์ ๋ค๋ฆญ์ ๊ทธ๋๋ก ํจ์ ํ๋ผ๋ฏธํฐ๋ก ์ ์ฉ์์ผฐ๊ธฐ์, ์ค์ง KakaoPay ํ์ ๋ง์ ์ ์ฉํ ์ ์๋ค.
๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์๋๋ผ๋ NaverPay ํ์ ์ ์ถ๊ฐํ ์๊ฐ ์๋ค.
ํด๋์ค์ ์ ์ํ ์ ๋ค๋ฆญ ํ์ ๊ณผ ๋ณ๊ฐ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด
interface Payment
class KakaoPay: Payment
class NaverPay: Payment
class PaymentHistory<T: Payment> {
fun <C: T> addPayment(payment: C) {
// ...
}
}
์ด๋ฐ ์์ผ๋ก ์๋์ ์ผ๋ก ํจ์์ ์ ๋ค๋ฆญ์ ๋ช ์ํ์ฌ ๋ค๋ฅธ ํ์ ๋ ์ ์ฉํ ์ ์๋ค.
๊ทผ๋ฐ ์ด๋ด ๊ฒฝ์ฐ๊ฐ ๋ง์ด ์์์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.