확장함수
기존 클래스에 새로운 기능을 추가하는 방법이다.
클래스를 수정하지 않고 새로운 메소드를 정의할 수 있게 해준다.
확장 함수의 기본 문법
fun 클래스명.함수명(파라미터들): 반환타입 {
// 함수의 본문
}
사용 예시
fun main(){
println("010-1234-5678".extract { it.isDigit() })
}
fun String.extract(cond: (Char) -> Boolean): String {
val sb = StringBuilder()
this.forEach {
if (cond(it)) sb.append(it)
}
return sb.toString()
}
cond: (Char) -> Boolean은 문자 하나를 받아서 Boolean 값을 반환하는 함수 타입이다. 따라서 이 매개변수에 it.isDigit()이라는 함수를 전달했고 forEach 구문에서 받은 함수인 isDigit()을 이용해서 문자가 맞으면 sb에 추가하고 아니면 그냥 넘어가도록 설계했다.
함수 타입의 형식 인자에 기본 값 설정
fun main(){
println("010-1234-5678".extract())
}
fun String.extract(cond: (Char) -> Boolean = {it.isDigit()}): String {
val sb = StringBuilder()
this.forEach {
if (cond(it)) sb.append(it)
}
return sb.toString()
}
이렇게 인자에 기본 값을 설정해주면 따로 람다식을 설정하지 않는 경우 해당 로직을 통해서 bool 값을 출력해준다.
it.isDigit()에서 it은 인자로 들어오는 char를 말한다.
함수 타입의 형식 인자에 null 설정
fun main(){
println("010-1234-5678".extract(null))
}
fun String.extract(cond: ((Char) -> Boolean)? ): String {
val sb = StringBuilder()
this.forEach {
if(cond != null) {
if (cond(it)) sb.append(it)
}
}
return sb.toString()
}
이렇게 함수가 넘어오지 않는 경우에 대한 처리도 할 수 있다.
함수가 함수 타입을 반환
fun addOrSubtract(flag: Boolean): (Int, Int) -> Int{
if (flag) {
return { a, b -> a+b }
} else {
return { a, b -> a-b }
}
}
fun main(){
println(addOrSubtract(true)(2, 3))
println(addOrSubtract(false)(2, 3))
}
이렇게 bool 값에 따라서 다른 함수를 람다식을 반환해서 하나의 함수안에서 2개의 연산을 할 수 있다.
'2학년 2학기 > 모바일 소프트웨어 - 코틀린' 카테고리의 다른 글
Class(2) - Object (0) | 2024.10.11 |
---|---|
익명 함수 (1) | 2024.10.11 |
람다식(2) - it, _ 사용 (0) | 2024.10.10 |
람다식(1) - 기본적인 선언과 호출, 고차함수와의 사용 (0) | 2024.10.10 |
고차함수(2) - 응용편 (0) | 2024.10.10 |