확장함수의 예제를 위해 조금 극단적인 예시인 isLongerThan이라는 함수를 만들었다. (물론 compareTo 라는 함수명이 더 적절 할 것이다.)
두개의 문자열을 비교하는 isLongerThan 함수는 입력변수로 두개의 문자열을 받는다.
이 경우 함수를 사용할때 입력변수가 함수의 뒤쪽에 위치하므로 직관적이지 않다.
class MyString {
var text : String? = null
}
fun main() {
fun isLongerThan (a:MyString, b:MyString): Boolean {
return a.text?.length ?: 0 > b.text?.length ?: 0
}
var a = MyString()
var b = MyString()
val longerThan = isLongerThan(a, b)
}
다음은 확장함수를 이용해 직관적으로 변경한 모습이다.
isLongerThan(a,b) 보다 a.isLongerThan(b)가 훨씬 직관적으로 무슨 동작을 하는지 파악하기 쉽다.
class MyString {
var text : String? = null
}
fun main() {
fun MyString.isLongerThan (b:MyString): Boolean {
return (this.text?.length ?: 0) > (b.text?.length ?: 0)
}
var a = MyString()
var b = MyString()
val longerThan = a.isLongerThan(b)
}
하지만 여전히 "return (this.text?.length ?: 0) > (b.text?.length ?: 0)" 이 부분은 꽤나 지저분하다.
다음과 같이 수정시 훨씬 가독성 좋은 함수로 수정 가능하다.
fun String?.safeLength(): Int = this?.length ?: 0
fun MyString.isLongerThan(b: MyString): Boolean {
return this.text.safeLength() > b.text.safeLength()
}
'Kotlin' 카테고리의 다른 글
영역 함수(scope functions) (0) | 2024.02.29 |
---|---|
수신 객체 지정 람다 (0) | 2024.02.29 |
코틀린의 정적 타입 (0) | 2024.02.19 |
자바에서 코틀린 컬렉션으로 (1) | 2024.02.13 |
T?에 대해 (0) | 2024.02.07 |