티스토리 뷰

코틀린에서 사용하는 함수를 간단히 정리합니다.


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)
}

 

댓글
반응형
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함