#15 Kotlin Koans Conventions/Range to 해설

1 소개



Kotlin 공식 레퍼런스의 Kotlin Koans/Rnage to의 해설 기사입니다.

Kotlin Koans를 통해 Kotlin을 배우는 사람들의 도움이 되길 바랍니다.

다만, 레퍼런스를 자력으로 읽는 힘을 기르고 싶은 분은,
곧이 기사를 보지 마십시오!

일단 각자 도전하고 나서 볼 수 있다고 생각합니다

2 rangeTo() 함수와 contains() 함수



Operator overloading
모두 operator 한정자가 붙은 함수입니다.
a .. b 라는 표현으로 a.rangeTo(b) 와 같이 사용합니다.
a in b 라고 하는 표현으로 b.contains(a) 와 같이 사용합니다.

3 Conventions/Range to 해설



Kotlin Koans Conventions/Range to 의 해설입니다.
수시로 본 사이트의 내용을 인용하겠습니다.

오른쪽의 본문을 보자.

Implement the function MyDate.rangeTo(). This allows you to create a range of dates using the following syntax:
MyDate(2015, 5, 11)..MyDate(2015, 5, 12)

Note that now the class DateRange implements the standard ClosedRange interface and inherits contains method implementation.

왼쪽의 코드와 MyDate.kt 파일의 코드를 살펴 보겠습니다.

Range_to
operator fun MyDate.rangeTo(other: MyDate) = TODO()

class DateRange(override val start: MyDate, override val endInclusive: MyDate): ClosedRange<MyDate>

fun checkInRange(date: MyDate, first: MyDate, last: MyDate): Boolean {
    return date in first..last
}


MyDate.kt
data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) : Comparable<MyDate> {
    override fun compareTo(other:MyDate) = when{
        year != other.year -> year - other.year
        month != other.month -> month - other.month
        else -> dayOfMonth - other.dayOfMonth
    }
}

MyDate.kt 파일의 checkInRange()에 MyDate 형의 인스턴스 3개를 인수로서 건네주고,
date가 first와 last 사이의 날짜인지 확인할 수 있도록 구현해 봅시다.

MyDate 형의 인수 3개를 건네주고, checkInRange() 함수를 호출하면(자), 이하의 반환값이 돌려주어집니다.
return date in first..last
first .. lastfirst.rangeTo(last) 를 의미하므로 이 부분에 rangeTo()の戻り値 가 반환됩니다.

그러므로
return date in (rangeTo()の戻り値)

같은 상황이 됩니다.
date in (rangeTo()の戻り値)(rangeTO()の戻り値).contains(date) 를 의미합니다.

contains() 함수는 특히 override 하고 스스로 구현할 필요가 없기 때문에 공식 레퍼런스의 것을 그대로 이용합니다 ( ClosedRange ).

공식 참조에 의하면, 호출자의 인스턴스가, 인수의 범위에 있을지에 따라 진위치를 돌려준다고 합니다.

즉, date가 (rangeTo()의 반환값)의 범위내인가 어떤가를 판정합니다.

그러므로 (rangeTo() 의 반환값)는 MyDate 형의 범위의 것입니다.

MyDate 형의 범위를 표현하기 위해서, 2 개의 프로퍼티가 각각 MyDate 형의 DateRange 인스턴스를 이용합니다.

따라서 TODO 부분의 구현된 해답은

Range_to
operator fun MyDate.rangeTo(other: MyDate) = DateRange(this,other)

class DateRange(override val start: MyDate, override val endInclusive: MyDate): ClosedRange<MyDate>

fun checkInRange(date: MyDate, first: MyDate, last: MyDate): Boolean {
    return date in first..last
}

같아요.

(※)this는 rangeTO() 함수를 호출한 인스턴스(이 문제의 경우 first)를 의미합니다.

4 마지막으로



다음은 Kotlin Koans Conventions/For loop의 해설을합니다.

좋은 웹페이지 즐겨찾기