#13 Kotlin Koans Conventions/Comparison 해설

1 소개



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

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

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

한 번 각자로 도전하고 나서, 눈에 띄게 된다고 생각합니다

2 Operator overloading



먼저 공식 참조 예제에서 살펴 보겠습니다.
data class Point(val x: Int, val y: Int)

operator fun Point.unaryMinus() = Point(-x, -y)

val point = Point(10, 20)

fun main() {
   println(-point)
}


실행 결과는 Print(x = -10,y = -20)입니다.

순서를 따라 설명하겠습니다.

우선, 3행의 변수 point에 x = 10 , y = 20 의 프로퍼티를 가지는 Point 인스턴스가 대입됩니다.

그런 다음 main() 함수에서 -point가 실행됩니다. -pointpoint.unaryMinus()를 의미합니다.

operator 한정자가 붙은 unaryMinus() 가 불려 가 x = -10 , y = -20 의 프로퍼티을 가지는 Point 인스턴스가 호출하에 돌아옵니다.

반환 값의 인스턴스를 println()로 표시하면 Point(x = -10,y = -20)가 됩니다.
(인스턴스의 정보(프로퍼티의 내용)가 인간이 봐 알 수 있도록(듯이) 표시되고 있는 것은, Point 클래스에 data 수식자가 붙어 있기 때문입니다.자세한 것은 #6 Kotlin Koans Introduction/Data classes 해설 의 참고를 봐 주세요.)

요점은 -pointpoint.unaryMinus()를 의미합니다. 의 부분입니다.
-a (a는 임의의 인스턴스)라는 표현은 a.unaryMinus()를 의미합니다.

단지 이것을 성립시키려면 operator 한정자를 함수명 앞에 넣어야 합니다.

이것에는 어떤 이점이 있습니까? ?

그것은 위의 예와 같이 함수 unaryMinus()의 내용을 자유롭게 구현할 수 있다는 점에 있습니다.

이번에는
operator fun Point.unaryMinus() = Point(-x, -y)

와 같이 구현했지만, 만약 Point 인스턴스가 x, y에 더해 z(Int형)라는 프로퍼티를 가지고 있으면,
operator fun Point.unaryMinus() = Point(-x, -y, -z)

와 같이 구현하는 것도 가능합니다.

Operator overloading에는 다양한 변형이 존재하므로, 꼭 Operator overloading 을 참고로 조사해 보세요.

3 Conventions/Comparison 해설



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

오른쪽의 본문을 보자.

Read about operator overloading to learn how different conventions for operations like ==, <, + work in Kotlin. Add the function compareTo to the class MyDate to make it comparable. After that the code below date1 < date2 will start to compile.

In Kotlin when you override a member, the modifier override is mandatory.

왼쪽의 kotlin 코드를 살펴 보겠습니다.
data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) : Comparable<MyDate> {
    /* TODO */
}

fun compare(date1: MyDate, date2: MyDate) = date1 < date2

MyDate 클래스는 Comparable 클래스를 상속하므로 compareTo()関数 을 override 할 수 있습니다.

compareTo() 함수는
abstract operator fun compareTo(other: T): Int
이와 같이 operator修飾子 가 붙어 정의되고 있습니다.

또한 Operator overloading에서 볼 수 있듯이,a < ba.compareTo(b) < 0를 의미합니다.
a < b 이 문제는 date1 < date2에 해당합니다.

즉 compare() 함수를 호출할 때, 인수에 MyDate형의 인스턴스를 2개 건네줍니다.
MyDate 클래스의 compareTo() 함수내에서 2개의 MyDate 형의 인스턴스의 크기를 비교한 결과가 compare() 함수에 돌아옵니다.
그 결과가 0 이하이면 false, 0보다 크면 true를 compare() 함수의 호출하에 돌려줍니다.

마지막으로 compareTo()의 반환값의 구현을 생각해 봅시다.

2개의 MyDate형 인스턴스의 propertyyear/month/dayOfMonth를 순서에 비교해, 다른 경우는 그 시점에서 차이를 compare() 함수에 돌려주도록 합시다.

compareTo() 반환 값의 구현은 다음과 같습니다.
override fun compareTo(other:MyDate) = when{
        //yearの比較。yearの値が異なれば、その差をcompare()に返す。
        year != other.year -> year - other.year
     //monthの比較。monthの値が異なれば、その差をcompare()に返す。
        month != other.month -> month - other.month
        //dayOfMonthの差をcompare()に返す。
        else -> dayOfMonth - other.dayOfMonth
}

4 마지막으로



다음 번에는 Kotlin Koans Conventions/In range의 해설을 하겠습니다

좋은 웹페이지 즐겨찾기