#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
가 실행됩니다. -point
는 point.unaryMinus()
를 의미합니다.
operator 한정자가 붙은 unaryMinus() 가 불려 가 x = -10
, y = -20
의 프로퍼티을 가지는 Point 인스턴스가 호출하에 돌아옵니다.
반환 값의 인스턴스를 println()
로 표시하면 Point(x = -10,y = -20)
가 됩니다.
(인스턴스의 정보(프로퍼티의 내용)가 인간이 봐 알 수 있도록(듯이) 표시되고 있는 것은, Point 클래스에 data
수식자가 붙어 있기 때문입니다.자세한 것은 #6 Kotlin Koans Introduction/Data classes 해설 의 참고를 봐 주세요.)
요점은 -point
는 point.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 < b
는 a.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의 해설을 하겠습니다
Reference
이 문제에 관하여(#13 Kotlin Koans Conventions/Comparison 해설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/G-o/items/434998c11b2f7b1e3b80
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
먼저 공식 참조 예제에서 살펴 보겠습니다.
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
가 실행됩니다. -point
는 point.unaryMinus()
를 의미합니다.operator 한정자가 붙은 unaryMinus() 가 불려 가
x = -10
, y = -20
의 프로퍼티을 가지는 Point 인스턴스가 호출하에 돌아옵니다.반환 값의 인스턴스를
println()
로 표시하면 Point(x = -10,y = -20)
가 됩니다.(인스턴스의 정보(프로퍼티의 내용)가 인간이 봐 알 수 있도록(듯이) 표시되고 있는 것은, Point 클래스에
data
수식자가 붙어 있기 때문입니다.자세한 것은 #6 Kotlin Koans Introduction/Data classes 해설 의 참고를 봐 주세요.)요점은
-point
는 point.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 < b
는 a.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의 해설을 하겠습니다
Reference
이 문제에 관하여(#13 Kotlin Koans Conventions/Comparison 해설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/G-o/items/434998c11b2f7b1e3b80
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int) : Comparable<MyDate> {
/* TODO */
}
fun compare(date1: MyDate, date2: MyDate) = date1 < date2
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
}
다음 번에는 Kotlin Koans Conventions/In range의 해설을 하겠습니다
Reference
이 문제에 관하여(#13 Kotlin Koans Conventions/Comparison 해설), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/G-o/items/434998c11b2f7b1e3b80텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)