본문 바로가기
Android/안드로이드 스터디(Kotlin)

Kotlin] 22. 확장

by 김마리님 2020. 12. 10.

코틀린은 String등에 접근할 수가 없다. 대신 이를 접근하기 위해 확장함수의 개념을 사용한다.

 

 

package extension

fun String.isNumber() : Boolean {

    var i =0
    while (i < this.length) {
        if (!('0'<= this[i] && this[i] <= '9'))
            return false
        i+=1
    }

    return true
}

fun main(){
    println("12345678".isNumber())
    println("500원".isNumber())
}

 

받아올 객체타입.함수이름() : 리턴 타입

을 붙이면 우리가 원하는 객체 타입을 어떻게 리턴할 것인지 커스터마이징이 가능하다. 

본 예시는 String 타입을 받아와서, 멤버 함수를 확장해서 Boolean 타입으로 리턴한다. 

 

 

결과 : 

 

true

false


 

확장은 프로퍼티도 가능하다.

받아올 객체타입.이름() : 리턴 타입

 

예시를 보자.

val String.isLarge: Boolean
    get() = this.length < 10

fun main(args : Array<String>) {
    println("12345678".isLarge)
    println("500원".isLarge)
}

 

마찬가지로 String 타입을 boolean 타입으로 확장해서 가져온다. 

 

이 때 주의할 점은,

프로퍼티는 () (소괄호)가 붙지 않는다는 점이다.

그리고 확장 프로퍼티에는 field가 존재하지 않는다.

 

결과 :

 

true
true

 


 

확장함수와 nullable을 합하면 null을 받을 수 있는 확장함수가 만들어진다.

 

package nullableExample

fun String?.isNumber(){
    if(this==null)
        println("문자열이 null이다.")
}

fun main() {
    val empty : String? =null
    empty.isNumber()
}

 

리시브 타입에 ?. 를 붙이면 null을 받을 수 있게 된다.

 

결과 :

 

문자열이 null이다.

 


 

확장함수의 리시버 타입이 상속 관계가 있으면 어떨까?

 

package extensionInheritEx

open class AAA; class BBB : AAA()

fun AAA.hello() = println("AAA")
fun BBB.hello() = println("BBB")

fun main() {
    val test : AAA = BBB()
    test.hello()
}

 

타입은 A지만 실질상의 가리키는 객체는 BBB라 B를 호출할거 같지만, 정답은 AAA를 호출한다.

확장함수는 참조변수의 타입을 그대로 따르기 때문이다.

 

결과 :

 

AAA

 


 

itstudy-mary.tistory.com/317?category=961265

 

Kotlin] 31. 함수 리터럴

Unit은 함수가 들어갈 수 있는 타입이다. package functionLiterialEx fun main() { val instantFunc : (Int)->Unit instantFunc = {number: Int -> println("Hello $number") } instantFunc(33) instantFunc?.inv..

itstudy-mary.tistory.com

 

이 리터럴을 확장하는 것도 가능한데, 일반적으로 함수를 확장하듯, 리시버 타입에 확장할 함수를 리터럴로 달아주면 된다.

 

package receiverLiterialEx

fun main() {
    val makeSure : Int.(left : Int, right : Int) -> Int

    makeSure = {left, right ->  
        if(this < left) 
            left
        else if(this < right)
            right
        else this
    }    
    
    println(15.makeSure(20, 40))
    println(18.makeSure(0, 50))
    println(25.makeSure(0, 19))
}

 

먼저 함수를 리시버와 함수 리터럴 형태로 달아주고, 아래에서 라시버가 적용된 함수 리터럴을 만든다. 이 때, 다른 확장함수와 마찬가지로 리시버를 this로 표현할 수 있다.

반응형

'Android > 안드로이드 스터디(Kotlin)' 카테고리의 다른 글

Kotlin] 24. 동반자 객체(Companion Object)  (0) 2020.12.10
Kotlin] 23. 객체 선언(Singleton)  (0) 2020.12.10
Kotlin] 21. 다운캐스팅  (0) 2020.12.09
Kotlin] 20. is  (0) 2020.12.09
Kotlin] 19. Nullable?  (0) 2020.12.09