확장 함수
Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 30번째.
확장 함수는 타입의 소스 코드를 변경하지 않고 기존 타입에 함수를 추가합니다. 이름은 수신자 타입 뒤에 작성하며, 함수 내부에서 this는 수신자를 가리킵니다. 수신자는 생략할 수도 있습니다:
fun String.shout() = uppercase() + "!"
fun Int.isEven() = this % 2 == 0main 내부에서:
println("hello".shout())
println(7.isEven())
println(listOf(1, 2, 3, 4).count { it.isEven() })출력:
HELLO!
false
2확장 기능은 직접 만든 클래스에서도 사용할 수 있으며, 확장 프로퍼티는 계산된 프로퍼티를 추가합니다. 확장 기능으로 저장된 상태를 추가할 수는 없고, 확장 대상의 public 멤버에만 접근할 수 있습니다:
class Temperature(val celsius: Double)
val Temperature.fahrenheit: Double
get() = celsius * 9 / 5 + 32
fun Temperature.describe() = "$celsius C is $fahrenheit F"main 내부에서:
println(Temperature(100.0).describe())출력:
100.0 C is 212.0 F확장 함수는 정적으로 결정됩니다. 프로그램이 컴파일될 때 객체의 클래스가 아니라 표현식의 선언된 타입이 확장 함수를 선택합니다. 이것이 재정의된 멤버와의 주요 차이점입니다.
open class Shape {
open fun member() = "shape member"
}
class Circle : Shape() {
override fun member() = "circle member"
}
fun Shape.ext() = "shape extension"
fun Circle.ext() = "circle extension"main 내부에서:
val s: Shape = Circle()
println(s.member())
println(s.ext())출력:
circle member
shape extension클래스에 동일한 시그니처를 가진 멤버가 이미 있으면 항상 멤버가 우선합니다. 타입에 속하며 재정의될 수 있는 동작에는 멤버를 사용하고, 직접 소유하지 않은 클래스의 형식 지정과 같이 외부에서 추가하는 헬퍼에는 확장 함수를 사용하세요:
class Robot {
fun greet() = "member greet"
}
fun Robot.greet() = "extension greet"
fun Robot.wave() = "extension wave"main 내부에서:
val r = Robot()
println(r.greet())
println(r.wave())출력:
member greet
extension wave챌린지
쉬움Money(cents)는 Money.kt에 제공되어 있습니다. 이를 위한 확장 기능을 MoneyExtensions.kt에 작성하세요. 숫자를 Money로 변환하는 확장 프로퍼티 Int.dollars와 Int.cents(12.dollars는 1200센트입니다), $12.50을 반환하는 Money.format()(음수 금액의 경우 -$3.05), 합계를 Money로 반환하는 List<Money>.total(), 그리고 금액을 최대 1센트 차이가 나는 parts개의 금액으로 나누되 더 큰 금액이 앞에 오도록 하는 Money.split(parts)를 작성하세요.
제공된 코드는 12 dollars 또는 50 cents 형식의 줄과 부품 수가 적힌 마지막 줄을 읽습니다. 그런 다음 각 금액, total: $12.50, 그리고 split 3: $4.17 $4.17 $4.16을 출력합니다.
코드는 MoneyExtensions.kt와 Money.kt에 작성합니다. Main.kt에는 제공된 입력/출력 코드가 들어 있으며 편집할 수 없습니다.
직접 해보기
fun main() {
// 제공된 입력/출력 코드: 그대로 유지하세요
val input = generateSequence(::readLine).toList()
val amounts = input.dropLast(1).map { line ->
val (n, unit) = line.split(" ")
if (unit == "dollars") n.toInt().dollars else n.toInt().cents
}
for (m in amounts) println(m.format())
val total = amounts.total()
println("total: ${total.format()}")
val parts = input.last().toInt()
println("split $parts: " + total.split(parts).joinToString(" ") { it.format() })
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Kotlin 플레이그라운드