#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 ์์ฝ
์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ผ๋ก ์ฌ์ฉ์ ์ ์ ํด๋์ค๋ฅผ ์ ์ฐํ๊ณ ์ฐ์ํ๊ฒ ์ฌ์ฉํ๋ค.
'๊นจ์ ๊ฐ๋ ๐ > Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin] ๋๋ค(Lambda) ํํ์ (0) | 2024.02.01 |
---|---|
[Kotlin] ํจ์ ํ์ (Fuction types) ํํ์ (0) | 2024.01.31 |
[Kotlin] ํจ์ํ ์ธํฐํ์ด์ค (Single Abstract Method Interface) (0) | 2024.01.30 |
[Kotlin] ํ๋กํผํฐ(Property) (0) | 2024.01.17 |
[Kotlin] ํ์ฅ ํจ์(Extension functions) (0) | 2023.12.16 |