티스토리 뷰
-공부하면서 작성한 포스팅이라 틀린부분 있을수있음-
변수에 함수 저장
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
Kotlin 기초 | Android 기본사항 Compose - 앱 UI 빌드 | Android Developers
Kotlin의 기초, 객체 지향 프로그래밍, 람다를 자세히 알아봅니다.
developer.android.com
하.. 코드랩으로 공부하니깐 뭔가 잘 안읽힌다.. 번역때문인듯..
'공부 > ComposeCamp 2022' 카테고리의 다른 글
unit 2: Compose 상태 소개, Tip Time 계산기 만들기 (0) | 2022.11.28 |
---|---|
unit 2 : 레몬에이드 앱 만들기 (0) | 2022.11.27 |
unit2 : 안드로이드 스튜디오 디버거 사용하기 (0) | 2022.11.27 |
unit 2: 상호작용 Dice Roller 앱 만들기 (0) | 2022.11.23 |
unit 2: 연습 Kotlin 기초 (0) | 2022.11.23 |