class Point(val x: Int, val y: Int)
operator fun Point.get(index: Int) : Int {
return when(index) {
0 -> x
1 -> y
else -> throw IndexOutOfBoundsException("Invalid coordinate $index")
}
}
fun main() {
val p = Point(10, 20)
println(p[1])
// 20
}
data class MutablePoint(var x: Int, var y: Int)
operator fun MutablePoint.set(index: Int, value: Int) {
return when(index) {
0 -> x = value
1 -> y = value
else -> throw IndexOutOfBoundsException("Invalid coordinate $index")
}
}
operator fun MutablePoint.get(index: Int) : Int {
return when(index) {
0 -> x
1 -> y
else -> throw IndexOutOfBoundsException("Invalid coordinate $index")
}
}
fun main() {
val p = MutablePoint(10, 20)
p[1] = 30
println(p[1])
// 20
}
data class Point(val x: Int, val y: Int)
data class Rectangle(val upperLeft: Point, val lowerRight: Point)
operator fun Rectangle.contains(p: Point): Boolean {
return p.x in upperLeft.x ..< lowerRight.x && p.y in upperLeft.y ..< lowerRight.y
// ..< : 열린 범위
}
fun main() {
val rect = Rectangle(Point(10, 20), Point(50, 50))
println(Point(20, 20) in rect)
// true
println(Point(5, 5) in rect)
// false
}
start .. end -> start.rangeTo(end)
rangeTo 함수 → 범위를 반환함
어떤 클래스가 Comparable 인터페이스를 구현한다면 rangeTo를 정의할 필요가 없음
코틀린 표준 라이브러리 → 모든 Comparable 객체에 대해 적용 가능한 rangeTo 함수가 들어있음
operator fun <T: Comparable<T>> T.rangeTo(that: T): ClosedRange<T>
import java.time.LocalDate
fun main() {
val now = LocalDate.now()
val vacation = now .. now.plusDays(10)
println(now.plusDays(1) in vacation)
// true
}
fun main() {
(0 ..< 9).forEach{ println(it) }
}
import java.time.LocalDate
operator fun ClosedRange<LocalDate>.iterator(): Iterator<LocalDate> =
object : Iterator<LocalDate> {
var current = start
override fun hasNext(): Boolean = current <= endInclusive
override fun next(): LocalDate {
val thisDate = current
current = current.plusDays(1)
return thisDate
}
}
fun main() {
val newYear = LocalDate.ofYearDay(2042, 1)
val daysOff = newYear.minusDays(1) .. newYear
for(dayOff in daysOff) {println(dayOff)}
// 2041-12-31
// 2042-01-01
}