티스토리 뷰

-공부하면서 작성한 포스팅이라 틀린부분 있을수있음-

 

변수에 함수 저장

1. 함수는 변수에 저장될수있다(함수 참조 연산자 ::)

실제 함수가 변수에 저장되는지 실험하였다. 위 처럼 하면 에러가 발생한다

2번 라인에 trick 이 아니라 trick() 을 적게되면 함수가 저장되는게 아니라 실행된다

컴파일러가 trick을 함수의 이름으로 인식했지만 함수가 호출되어야 하는것 아닌가? 라고 예상해서 trick() 을 적으라는 에러가 생긴것임

함수를 변수에 저장하기 위해서는 함수 참조 연산자인 :: 을 사용한다

사용법은 :: 뒤에 함수이름을 적는다

trickFunction() 을 하면 trick함수 호출된다

2. 람다 표현식을 사용하여 함수 재정의

람다 표현식은 fun 키워드 없이 함수를 정의하고 함수 참조(위에서 본 ::) 없이 변수에 바로 함수를 저장하는게 가능하다

할당 연산자 = 앞에 val 혹은 var키워드를 추가하고 함수 호출에 쓸 변수 이름 추가한다 그다음 = 을 쓰고 함수 body작성

람다 표현식을 사용해 함수를 정의하면 그 함수를 참조하는 변수를 갖게 됨

이 함수를 다른 변수에 할당하고 새로운 변수 이름으로 함수 호출하는게 가능함

호출은 변수명() 을 한다

val tmp: (Int,Int)->Int={x:Int, y:Int -> x*y}
//       --선언자료형--  --매개변수--    반환값


val m={x:Int, y:Int-> x*y}//선언 자료형 생략
val m2:(Int, Int)->Int={x,y->x*y}//매개변수 자료형 생략

선언 자료형은 람다식 매개변수에 자료형까지 명시하면 생략가능함

매개변수도 선언자료형이 명시되어 있다면 매개변수의 이름만 적고 데이터 유형은 생략 가능

(매개변수를 완전히 생략하는법은 더 아래에 나온다)

람다식 처리내용은 매개변수의 -> 다음이다

처리내용이 여러 줄이면 마지막 표현식이 반환됨


함수를 데이터 유형으로 사용

변수에 함수를 저장할때 매개변수와 반환값의 유형을 적을 수 있다.(람다식)

변수명: (함수 매개변수들의 유형) -> 반환값 유형={매개변수이름:매개변수타입->body} 로 작성하면 된다

1. 함수를 반환 유형으로 사용

함수도 데이터 유형중 하나이므로 반환값으로 함수를 쓸수도 있다

2. 함수를 다른 함수에 매개변수로 전달

매개변수로 들어가는 함수에 매개변수를 넣고싶다면 그 매개변수는 데이터 유형만 작성한다

fun main() {
   val coins: (Int)->String={quantity->
       "$quantity quarters"//마지막 표현식이 반환된다
   }
   val cupcake: (Int)->String={
       "Have a cupcake"
   }
   val treatFunction=trickOrTreat(false, coins)
   val trickFunction=trickOrTreat(true, cupcake)
   treatFunction()
   trickFunction()
}
fun trickOrTreat(
    isTrick:Boolean,
    extraTreat:(Int)->String
    //int형 매개변수를 가지고 String을반환하는 함수 extraTreat
):()->Unit{
    if(isTrick){
        return trick
    }else{
        println(extraTreat(5))
        return treat
    }
}
val trick= {
    println("no treats!")
}
val treat:()->Unit={ //매개변수가 없고 반환이 없는 함수
    println("have a treat!")
}

3. null을 허용하는 함수 유형

매개변수로 함수를 전달하는데 전달한 함수없이 null 이 가능하도록하려면 ? 를 붙인다

fun main() {
   val coins: (Int)->String={quantity->
       "$quantity quarters"//마지막 표현식이 반환된다
   }
   
   val treatFunction=trickOrTreat(false, coins)
   val trickFunction=trickOrTreat(true, null)
   treatFunction()
   trickFunction()
}
fun trickOrTreat(
    isTrick:Boolean,
    extraTreat:((Int)->String)? //?를 붙이면 extraTreat이 null일수있음
    //int형 매개변수를 가지고 String을반환하는 함수 extraTreat
):()->Unit{
    if(isTrick){
        return trick
    }else{
        if(extraTreat!=null){
            println(extraTreat(5))
        }
        return treat
    }
}
val trick= {
    println("no treats!")
}
val treat:()->Unit={ //매개변수가 없고 반환이 없는 함수
    println("have a treat!")
}

 


약식 문법으로 람다 표현식 작성

대부분의 람다 표현식은 약식 문법으로 작성된다

 

1. 매개변수 이름 생략

매개변수의 이름을 완전히 생략하는게 가능하다

함수의 매개변수가 한개이고 이름을 지정하지 않으면(매개변수 생략하면) 코틀린은 암시적으로 그 매개변수이름을 it으로 할당한다

val coins: (Int)-> String ={quantitiy->
	"$quantity quarters"
}

val coins: (Int)-> String ={ //매개변수 생략
	"$it quarters"
}

2. 람다 표현식을 함수에 직접 전달

함수에 매개변수로 함수를 전달할때 전달되는 함수가 단 한번만 쓰여진다면

전달되는 함수를 굳이 따로 정의할 필요 없이 함수 호출할때 바로 전달되는 람다식을 작성해도 된다

fun main() {
   val treatFunction=trickOrTreat(false, {"$it quarters"})//람다 표현식 함수에 직접전달
   val trickFunction=trickOrTreat(true, null)
   treatFunction()
   trickFunction()
}
fun trickOrTreat(
    isTrick:Boolean,
    extraTreat:((Int)->String)? //?를 붙이면 extraTreat이 null일수있음
    //int형 매개변수를 가지고 String을반환하는 함수 extraTreat
):()->Unit{
    if(isTrick){
        return trick
    }else{
        if(extraTreat!=null){
            println(extraTreat(5))
        }
        return treat
    }
}
val trick= {
    println("no treats!")
}
val treat:()->Unit={ //매개변수가 없고 반환이 없는 함수
    println("have a treat!")
}

 

3. 후행 람다 문법 사용

매개변수로 전달하는 람다식이 매개변수 전달 순서상 제일 마지막에 있어야 한다면

읽기 편하도록 람다 표현식과 다른 매개변수들을 구분해서 작성하는게 가능하다

 val treatFunction=trickOrTreat(false, {"$it quarters"})//그냥 작성할때
 
  val treatFunction=trickOrTreat(false) {"$it quarters"} //그냥 매개변수와 람다식 구분해서 작성

repeat() 함수

함수가 함수를 반환하거나 또는 함수를 인수로 취하는 경우 이를 고차함수 라고 함

앞선 코드에서 trickOrTreat()함수가 ((Int)->String)? 유형의 함수를 매개변수로 취하고(int형 매개변수를 가지고 반환형이 String, 이 매개변수는 null가능하다)

()->Unit 유형의 함수를 반환하므로 고차함수이다

 

repeat는 코틀린에서 제공하는 고차함수이다

for문을 간결히 표현할수있도록 한다 유용하게 써먹도록하자

repeat(times: Int, action: (Int) -> Unit)

times는 동작이 발생해야 하는 횟수, action은 함수이고 Int매개변수 하나를 받으며 Unit를 반환한다

action같은 경우 내가 원하는대로 함수를 집어넣으면 된다 람다식을 넣어도된다

action함수의 Int 매개변수는 동작이 지금껏 실행된 횟수다(첫번째 반복에서는 0 이고 그다음부터 1 2 3..)

그러면 times만큼 반복해서 action함수가 실행된다

fun main() {
   val treatFunction=trickOrTreat(false) {"$it quarters"}
   val trickFunction=trickOrTreat(true, null)
   treatFunction()
   trickFunction()
   repeat(4,{//이 람다식이 action함수가 된다
       println("$it")
       treatFunction()
   })
}
fun trickOrTreat(
    isTrick:Boolean,
    extraTreat:((Int)->String)? //?를 붙이면 extraTreat이 null일수있음
    //int형 매개변수를 가지고 String을반환하는 함수 extraTreat
):()->Unit{
    if(isTrick){
        return trick
    }else{
        if(extraTreat!=null){
            println(extraTreat(5))
        }
        return treat
    }
}
val trick= {
    println("no treats!")
}
val treat:()->Unit={ //매개변수가 없고 반환이 없는 함수
    println("have a treat!")
}

앞에서 본 후행람다 문법을 쓸수있음

fun main() {
   val treatFunction=trickOrTreat(false) {"$it quarters"}
   val trickFunction=trickOrTreat(true, null)
   treatFunction()
   trickFunction()
   repeat(4){
       println("$it")
       treatFunction()
   }
}
fun trickOrTreat(
    isTrick:Boolean,
    extraTreat:((Int)->String)? //?를 붙이면 extraTreat이 null일수있음
    //int형 매개변수를 가지고 String을반환하는 함수 extraTreat
):()->Unit{
    if(isTrick){
        return trick
    }else{
        if(extraTreat!=null){
            println(extraTreat(5))
        }
        return treat
    }
}
val trick= {
    println("no treats!")
}
val treat:()->Unit={ //매개변수가 없고 반환이 없는 함수
    println("have a treat!")
}

 

 

참고사이트

https://ddolcat.tistory.com/557

 

[android : kotlin] 코틀린 람다식(Lambda Expression) 사용 방법

람다식(Lambda Expression)이란? 이름이 없어도 함수 역할을 하는 익명 함수의 하나의 형태이다. 람다식은 화살표 표기법을 사용한다. 람다식은 고차 함수에서 인자로 넘기거나 결과값으로 반환 등을

ddolcat.tistory.com

https://developer.android.com/courses/pathways/android-basics-compose-unit-2-pathway-1?authuser=1&hl=ko#codelab-https://developer.android.com/codelabs/basic-android-kotlin-compose-function-types-and-lambda 

 

Kotlin 기초  |  Android 기본사항 Compose - 앱 UI 빌드  |  Android Developers

Kotlin의 기초, 객체 지향 프로그래밍, 람다를 자세히 알아봅니다.

developer.android.com

 

하.. 코드랩으로 공부하니깐 뭔가 잘 안읽힌다.. 번역때문인듯.. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/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
글 보관함