Kotlin

확장함수를 사용해 직관적으로 변경하기

주코식딩 2024. 2. 7. 15:17

확장함수의 예제를 위해 조금 극단적인 예시인 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