๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š Kotlin

[Effective Kotlin] ์•„์ดํ…œ 23. ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์„€๋„์ž‰์„ ํ”ผํ•˜๋ผ

by GroovyArea 2023. 1. 25.

์„€๋„์ž‰์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

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) {
    	// ...
    }
}

์ด๋Ÿฐ ์‹์œผ๋กœ ์˜๋„์ ์œผ๋กœ ํ•จ์ˆ˜์— ์ œ๋„ค๋ฆญ์„ ๋ช…์‹œํ•˜์—ฌ ๋‹ค๋ฅธ ํƒ€์ž…๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทผ๋ฐ ์ด๋Ÿด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ด ์žˆ์„์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค.

๋ฐ˜์‘ํ˜•