๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/Kotlin

[Kotlin] ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ (Operator overloading)

interfacer_han 2024. 1. 29. 11:47

#1 ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ (Method overloading)

class Calculator {
    // ์ •์ˆ˜ํ˜• ๋‘ ๊ฐœ๋ฅผ ๋”ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
    fun add(x: Int, y: Int): Int {
        return x + y
    }
 
    // ์‹ค์ˆ˜ํ˜• ๋‘ ๊ฐœ๋ฅผ ๋”ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
    fun add(x: Double, y: Double): Double {
        return x + y
    }
}

fun main() {
    val calculator = Calculator()
    
    // ์ •์ˆ˜ํ˜• ๋ง์…ˆ
    val result1 = calculator.add(3, 4)
    println("Result of integer addition: $result1") // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 7
    
    // ์‹ค์ˆ˜ํ˜• ๋ง์…ˆ
    val result2 = calculator.add(2.5, 3.5)
    println("Result of double addition: $result2") // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 6.0
}

๋ฉ”์†Œ๋“œ์˜ ์„ ์–ธ๋ถ€์— ๋ช…์‹œ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฉ”์†Œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜(Method signature)๋ผ๊ณ  ํ•œ๋‹ค. ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์€ ์ด๋ฆ„์ด ๊ฐ™์ง€๋งŒ ๋ฉ”์†Œ๋“œ ์‹œ๊ทธ๋„ˆ์ฒ˜๊ฐ€ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋“ค์„ ๊ฐ๊ฐ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค.
 

#2 ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ (Operator overloading)

#2-1 ๊ฐœ๋…

๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์ด '๋ฉ”์†Œ๋“œ๋ฅผ ์ค‘๋ณตํ•ด์„œ ์ •์˜'์ด๋ผ๋ฉด, ์—ฐ์‚ฐ์ž(Operator) ์˜ค๋ฒ„๋กœ๋”ฉ์€ '์—ฐ์‚ฐ์ž๋ฅผ ์ค‘๋ณตํ•ด์„œ ์ •์˜'๋‹ค. ์—ฐ์‚ฐ์ž๋ž€ ์˜ˆ๋ฅผ ๋“ค๋ฉด -1, 2 + 2, 4* 7 ๋“ฑ์˜ ์ˆ˜์‹์— ์žˆ๋Š” ์—ฐ์‚ฐ์ž ๊ธฐํ˜ธ๋“ค์„ ๋งํ•œ๋‹ค.
 
๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ํ•ต์‹ฌ์€ '๋ฉ”์†Œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜'์˜€๋‹ค. ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์—๋„ ์ด๋ฅธ๋ฐ” '์—ฐ์‚ฐ์ž ์‹œ๊ทธ๋‹ˆ์ฒ˜'์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ์„๊นŒ? ๊ทธ๊ฑด ๋ฐ”๋กœ ํ”ผ์—ฐ์‚ฐ์ž(Operation)๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 71 - 16์—์„œ ์—ฐ์‚ฐ์ž๋Š” ๋งˆ์ด๋„ˆ์Šค ๊ธฐํ˜ธ๊ณ  ํ”ผ์—ฐ์‚ฐ์ž๋Š” Int๋‹ค. "๊ตฌ๊ตฌ" + "์ฝ˜"์—์„œ ์—ฐ์‚ฐ์ž๋Š” ํ”Œ๋Ÿฌ์Šค ๊ธฐํ˜ธ๊ณ , ํ”ผ์—ฐ์‚ฐ์ž๋Š” String์ด๋‹ค.
 

#2-2 ๋ฌธ๋ฒ•

// report card: ์„ฑ์ ํ‘œ
class ReportCard(val name: String, val score: Int) {
    
    operator fun plus(increment: Int): ReportCard {
        return ReportCard(name, score + increment)
    }

    // '์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ'์„ '๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ'ํ•จ
    operator fun plus(reportCard: ReportCard): ReportCard {
        return ReportCard(name + "์™€(๊ณผ) " + reportCard.name, score + reportCard.score)
    }

    operator fun minus(decrement: Int): ReportCard {
        return ReportCard(name, score - decrement)
    }

    // Kotlin ๋‚ด ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ธ Any ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ equals()๋ฅผ override
    override operator fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as ReportCard

        if (name != other.name) return false
        if (score != other.score) return false

        return true
    }

    override fun hashCode(): Int {
        var result = name.hashCode()
        result = 31 * result + score
        return result
    }
}

fun main() {
    var s1 = ReportCard("์ฒ ์ˆ˜", 100)
    s1 = s1 - 50 + ReportCard("์˜ํฌ", 200)

    if (s1 == ReportCard("์ฒ ์ˆ˜์™€(๊ณผ) ์˜ํฌ", 250)) {
        println("${s1.name}์˜ ์ ์ˆ˜๋Š” ${s1.score}์ ") // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: ์ฒ ์ˆ˜์™€(๊ณผ) ์˜ํฌ์˜ ์ ์ˆ˜๋Š” 250์ 
    }
}

์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ํด๋ž˜์Šค์—์„œ, ํ•จ์ˆ˜ ํ‚ค์›Œ๋“œ์ธ fun ์•ž์— operator ํ‚ค์›Œ๋“œ๋ฅผ ๋‹ฌ์•„์ฃผ๋ฉด ๋œ๋‹ค. ๋‹จ, operator๋Š” ๋ช‡๋ช‡ ์ง€์ •๋œ ์ด๋ฆ„์˜ ํ•จ์ˆ˜์—๋งŒ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค ์‚ฌ์ด์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ํ•ฉ์˜๋œ ์—ฐ์‚ฐ์ž์˜ ์ด๋ฆ„๋“ค์„ ์ •ํ•ด๋‘์—ˆ๋‹ค. ๊ทธ ์ •ํ•ด์ง„ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์•ž์— ์•ž์—๋งŒ operator ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋‹ด์œผ๋กœ, Any.equal()์„ overrideํ•  ๋•Œ๋Š” Any.hashCode()๋„ ๊ฐ™์ด overrideํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
 
๋‹ค์Œ์€ operator ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์˜ ์ด๋ฆ„๊ณผ ๊ทธ ์—ญํ• ์ด๋‹ค.
 

#3 operator ํ‚ค์›Œ๋“œ์šฉ ํ•จ์ˆ˜

#3-1 ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜

 

Operator overloading | Kotlin

 

kotlinlang.org

์œ„ ๋งํฌ์—์„œ #2-2์˜ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ด๊ณ  ๊ธฐ๋ณธ์ ์ธ operator์šฉ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
 

#3-2 invoke()

interface Calculator {
    operator fun invoke(x: Int, y: Int): Int
    operator fun invoke(x: Double, y: Double): Double
}

class AddCalculator : Calculator {
    override operator fun invoke(x: Int, y: Int): Int {
        return x + y
    }

    override operator fun invoke(x: Double, y: Double): Double {
        return x + y
    }
}

fun main() {
    val calculator: Calculator = AddCalculator()

    val resultInt = calculator(3, 5)
    println("๋‹ต์€ $resultInt") // ๋‹ต์€ 8

    val resultDouble = calculator(3.5, 5.5)
    println("๋‹ต์€ $resultDouble") // ๋‹ต์€ 9.0
}

์ด์™€ ๊ฐ™์ด () ์—ฐ์‚ฐ์ž์˜ ๋™์ž‘๋„ overrideํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ๋™์ž‘์— ํ•ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์€ ์˜์–ด๋กœ 'ํ˜ธ์ถœํ•˜๋‹ค'๋ผ๋Š” ์˜๋ฏธ๋ฅผ ์ง€๋‹Œ invoke๋‹ค.
 

#3-3 get(), set()

class DataContainer {
    private val data = mutableMapOf<String, Any>()

    operator fun get(key: String): Any? {
        return data[key]
    }

    operator fun set(key: String, value: Any) {
        data[key] = value
    }
}

fun main() {
    val container = DataContainer()

    // set() ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ ์‚ฌ์šฉ
    container["name"] = "์ฒ ์ˆ˜"
    container["age"] = 25

    // get() ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ ์‚ฌ์šฉ
    val name = container["name"]
    val age = container["age"]

    println("์ด๋ฆ„์€ $name(์ด)๊ณ  ๋‚˜์ด๋Š” $age") // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: ์ด๋ฆ„์€ ์ฒ ์ˆ˜(์ด)๊ณ  ๋‚˜์ด๋Š” 25
}

Array์˜ ์–ด๋–ค ์›์†Œ์— ์ ‘๊ทผํ•  ๋•Œ ์“ฐ๋˜ ๋Œ€๊ด„ํ˜ธ ๊ธฐํ˜ธ๋„ ์—ฐ์‚ฐ์ž๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

#3-4 getValue(), setValue()

 

[Kotlin] ์œ„์ž„ ํ”„๋กœํผํ‹ฐ(Delegated properties)

#1 Delegated properties#1-1 ๊ฐœ์š” Delegated properties | Kotlin kotlinlang.org์œ„์ž„ ํ”„๋กœํผํ‹ฐ๋Š”, getter์™€ setter ๋กœ์ง์„ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์œ„์ž„(delegate)ํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋ณธ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” ์œ„์ž„ ํ”„๋กœํผํ‹ฐ

kenel.tistory.com

getValue()์™€ setValue()๋Š” ์œ„์ž„ ํ”„๋กœํผํ‹ฐ(Delegated properties) ์ „์šฉ ์—ฐ์‚ฐ์ž๋‹ค. ์œ„ ๊ฒŒ์‹œ๊ธ€์—์„œ ์ •๋ฆฌํ–ˆ๋‹ค.

 

#4 ์š”์•ฝ

์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค๋ฅผ ์œ ์—ฐํ•˜๊ณ  ์šฐ์•„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค.