코틀린은 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
이 리터럴을 확장하는 것도 가능한데, 일반적으로 함수를 확장하듯, 리시버 타입에 확장할 함수를 리터럴로 달아주면 된다.
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 |