티스토리 뷰
코틀린에서 사용하는 함수를 간단히 정리합니다.
1. 함수 정의
fun 함수이름( 변수명 : 자료형, 변수명 : 자료형 ...) : 반환값 자료형 {
//함수 내용
return 반환값
}
- 반환값의 자료형이 추론가능한 경우 생략 가능
- 함수의 내용이 한 줄인 경우 { return 반환값 } 대신 = 반환 값으로 표현가능
fun sum(a:Int, b:Int) = a+b
- 반환 값이 없을 경우 Unit으로 사용 , 또한 반환값이 없으면 반환값의 자료형도 Unit으로 추론
- 매개변수에 default 인자를 지정하고 싶은 경우, (변수명: 자료형 = default값) 의 형태로 사용 가능
- 만약 매개변수의 갯수가 정해져 있지 않다면, 가변 인자(Variable Argument)를 사용할 수 있다.
fun 함수명 (vararg counts: Int){ for(num in counts){ print("$num") } }
2. 함수형 프로그래밍
함수형 프로그래밍이란 순수 함수를 작성하여 프로그램의 부작용을 줄이는 프로그래밍 기법이다. 함수형 프로그래밍에는 순수 함수, 람다식, 고차 함수를 사용할 수 있어야한다.
순수 함수란
같은 인자에 대해서 항상 같은 값을 반화하고 외부의 어떤 상태도 바꾸지 않는다.
함수형 프로그래밍에서는 함수를 일급 객체(또는 일급 함수)로 생각한다. 일급 객체는 함수의 인자나 반환값으로 사용 가능하며, 변수에 담을 수 있다.
3. 람다식
이름 없는 함수로 { 변수명: 자료형, 변수명: 자료형 -> 함수 동작 } 의 형태로 사용할 수 있다.
또한 람다식또한 일급 객체로써 아래와 같이 변수에 할당할 수 있다.
//val 변수명: 람다식 자료형 = { 람다식 }
val multi: (Int,Int) -> Int = { x:Int, y:Int -> x*y}
// 자료형이 추론가능한 경우 생략 가능
val multi = { x:Int, y:Int -> x*y}
이후엔 변수를 함수처럼 사용 가능하다.
람다식의 표현식이 여러줄이라면 마지막 줄을 반환한다.
매개변수와 반환형이 없을 때의 자료형은 () -> Unit 으로 사용가능하다.
람다식을 인자로 갖는 함수에서 그 람다식과 같은 매개변수와 반환형을 갖는 함수를 ::함수명으로 인자로 사용할 수 있다.
함수의 인자가 람다식 하나뿐일 경우 함수{람다식}의 형태로 소괄호()를 생략가능
람다식의 인자가 없을 경우 -> 를 생략할 수 있고, 람다식의 인자가 하나일 경우 -> 를 생략하고 인자를 it으로 바로 사용할 수 있다.
매개변수가 여러개인 람다식에서 특정 인자를 사용하지 않을 때는 { _ , b -> } 처럼 _로 생략가능
함수의 마지막 인자가 람다식일 경우 함수(인자){람다식} 로 표현 가능
람다식의 시작앞에 라벨@을 붙이거나 , 람다식 이름을 통해서 ruturn@이름 으로 람다식과 함께 return을 사용할 수 도있다.
fun inlineLambda(a:Int, b:Int, out: (Int, Int) -> Unit { // inline키워드 제거
out(a,b)
}
fun retFunc(){
println("Start"
inlineLambda(13,3) lit@{ a, b ->
val result = a+b
if(result>10) return@lit
println("result = $result")
}
println("end")
}
// 또는
fun retFunc(){
println("Start"
inlineLambda(13,3){ a, b ->
val result = a+b
if(result>10) return@inlineLambda
println("result = $result")
}
println("end")
}
4. 익명 함수(Anonymous Function)
이름이 없는 일반 함수
아래 처럼 변수에 할당 가능
val add = fun(x: Int, y: Int) = x+y
람다식과 유사하지만 return break continue 등의 제어문을 써야 할때 사용
-> 람다식에서 return 사용하려면 라벨사용
5. 인라인 함수(Inline Function)
inline fun 으로 선언
인라인 함수 안에 람다식이 복사되는게 싫으면 noinline 키워드 사용
- 인라인 함수의 람다식에서는 return가능 / 익명함수 return 가능 (반환값 x)
비지역반환 -> 금지하려면 inline함수내에 람다식 인자앞에 crossinline 키워드 사용
fun main(){
shortFunc(3){
println("First call: $it")
//return 불가능
}
inline fun shortFunc(a: Int, crossinline out: (Int) -> Unit){
println("Before calling out()")
nestedFunc{ out(a) }
println("After calling out()")
}
fun nestedFunc(body: ()-> Unit){
body()
}
6. 확장 함수
fun 확장대상.함수이름(매개변수):반환형 {
return 값
}
형식으로 기존 클래스에 원하는 메소드 추가 가능
7. 중위 함수
중위 표현법
멤버메서드나 확장함수 여야하고, 하나의 매개변수를 가져야 한다
infix fun~로 선언해서 마치 연산자 처럼 사용할 수 있다. ex) 비트연산자
8. 꼬리 재귀 함수
// 팩토리얼
tailrec fun factorial(n:Int, run: Int = 1): Long{
return if(n==1) run.toLong() else factorial(n-1, run*n)
}
// 피보나치 수열
tailrec fun fibonacci(n:Int, a: BigInteger, b: BigInteger): BigInteger {
return if(n==0) a else fibonacci(n-1,b,a+b)
}
'Android App > Kotlin' 카테고리의 다른 글
Kotlin 참조형 변수가 1byte보다 작으면 캐시에 저장 (0) | 2022.12.28 |
---|---|
Kotlin 코틀린 개발환경 IDE IntelliJ 설치 (0) | 2019.06.26 |