코틀린 Kotlin 기본2

이정수·2022년 2월 26일
0
post-thumbnail
post-custom-banner

1.Lambda

람다식은 마치 value처럼 다룰수 있는 익명함수이다.
1) 메소드에 파라미터로 함수를 넘겨줄 수 있다.
2) return 값으로 사용할 수 있다.
3) argument타입을 선언해야 하며, 추론할 수 있을때는 생략할 수 있다.
4) 함수의 반환값은 함수내용의 마지막 표현식이다.

정의

val LamdaName: Type = {argumentList -> codeBody}

ex)

val square: (Int)->(Int) = {number : Int -> number*number}
val nameAge= {name:String, age:Int ->
    "my name is ${name} and i'm ${age}"
}

fun main(){
    println(square(12))
    println(nameAge("lee", 33))
}

컴파일러가 추론할수 있다는 말의 의미

val upperCase1:(String)->String = {str:String -> str.uppercase()}
val upperCase2 = {str:String -> str.uppercase()}
val upperCase3 :(String)->String = { str ->str.uppercase() }
val upperCase4 :(String)->String ={it.uppercase()}

it은 input파라미터가 하나일경우 명시적인 파라미터를 쓰지않고 암시적인 파라미터it을 사용하여 body부분만 작성.

확장함수

kotlin에서 확장함수 개념을 사용하면, 외부라이브러리의 자체클래스는 변경할수 없지만, 이를 활용하여 개발자가 원하는 새로운 함수들을 만들수 있다.
receiver type : 확장함수를 추가할 클래스, 확장대상이 될 클래스
receiver object : 확장함수 내부에서 this키워드로 receiver type이 가지고 있는 인스턴스에 접근가능 -> 이런 객체를 receiver object라 한다.

fun extendString(name:String, age:Int):String {
   val intro:String.(Int)->String={
       "i'm ${this} and i'm ${it} years old"
   }
    return name.intro(age)
}

fun main(){
	println(extendString(name:"lia", age:25)

Return

반드시 return값이 있어야하기 때문에 반드시 else를 써줘야 한다.

val calculater: (Int)-> String ={
    when(it){
        in 0..40 ->"fail"
        in 40..70 -> "pass"
        else -> "okay"
    }
}

lambda를 표현하는 방법

아래의 함수 invokeLambda는 double을 받아서 boolean으로 리턴하는 람다식 자체를 파라미터로 받아서, boolean타입으로 리턴하는 함수이다.

fun invokeLambda(lambda:(Double)->Boolean):Boolean{
	return lambda(5.32)
}

그리고 main함수내에 lambda를 선언해준다.
lambda는 주어진수가 3.14면 true,아니면 false를 반환한다.

fun main(){

	val lambda:(Double)->Boolean = {num-> num==3.14}

}

그리고 main함수내에서 invokeLambda를 호출하여 결과값을 프린트하는 방법에는 두가지가 있다.

//1
println( invokeLambda(lambda) )

//2 곧장 람다식을 파라미터로 넘겨준다.
println( invokeLambda({it>3.23})

두번째 방식에서 람다식이 함수의 첫번째이자 마지막 파라미터이므로
invokeLambda({it>3.22})
=> invokeLambda(){it>3.22}
=> invokeLambda{it>3.22}
로 쓸수도 있다.

profile
keep on pushing
post-custom-banner

0개의 댓글