[코틀린 스터디 08] 0715

ssook·2021년 7월 15일
0
post-thumbnail

✅ 함수의 반환 값으로 함수 사용하기

  • 아래 예시처럼 함수의 반환 값으로 함수를 사용할 수 있다.
fun funcFunc(a:Int, b:Int)=sum(a,b)
//sum은 두 수를 합하는 함수이다.
val result3=funFunc(2,3)
  • 이때 출력 결과는 5.

📍 함수 호출 방식

✅ 값에 의한 호출

  • 함수가 인자로 전달될 경우
    : 람다식 함수는 값으로 처리되어 그 즉시 함수가 수행된 후 값을 전달
    : 아래는 값에 의한 전달 예시
fun main(){
val result=callByValue(lambda())
//람다식 함수를 호출
println(result)
}
fun callByValue(b: Boolean):Boolean{
//일반 변수의 자료형으로 선언된 매개변수
println("callByValue function")
return 0
}
//람다 표현식이 아래처럼 두 줄
val lambda: () -> Boolean = {
println("lambda function")
true //마지막 표현식의 문장 결과가 반환
}
  • 실행 순서
    람다식 함수를 실행하여 true를 반환하고,
    b에 true값을 복사한다. 그 후, b에 true 값을 반환한다. 마지막으로 main함수에서 반환된 true의 값을 할당한다.

✅ 이름에 의한 호출

fun main(){
val result=callByName(otherLambda)
//람다식 함수를 이름으로 호출
println(result)
}
fun callByName (b:( ) -> Boolean) : Boolean{
//람다식 함수 자료형으로 선언된 매개변수
println("callByName function")
return b()
}
//람다 표현식이 아래처럼 두 줄,
//결과가 반환되는 것이 아니라 함수 자체가 매개변수 내부로 들어감
val lambda: () -> Boolean = {
println("otherlambda function")
true 
}
  • 실행순서
    람다식 자체가 매개변수에 복사되고, 람다식 함수가 호출되어 실행된다. 그 후 true를 반환하고, b() 결과인 true를 main()으로 반환하며 종료한다.

  • 값에 의한 호출과 이름에 의한 호출은 수행 순서가 다르니 주의해야 한다.

✅ 다른 함수의 참조에 의한 호출

  • 아래와 같이 코드를 작성하면 오류가 난다.
fun sum(x: Int, y: Int) = x+y
funcParam(3,2,sum) //에러 발생
fun funcParam(a:Int, b:Int, c:(Int, Int) -> Int): Int {
	return c(a,b)
}
  • sum은 람다식이 아니기 때문에 매개변수로 바로 쓰면 에러가 난다. 따라서 아래처럼 람다식 형태로 참조할 수 있게끔 해줘야 함.
funcParam(3,2,::sum)
  • 위의 예시처럼 콜론 2개를 연달아 붙이면(::) 참조방식으로 해당 함수를 참조하여 사용할 수 있게 된다.

✅ 매개변수에 따라 람다식을 구성하는 방법

  • 매개변수가 없는 경우
fun main() {
    // 매개변수 없는 람다식 함수
    noParam({ "Hello World!" })
    noParam { "Hello World!" } // 위와 동일 결과, 마지막 매개변수가 람다식으로 구성된 경우 소괄호 생략 가능
    noParam(){"Hello World!"} // 위 식과 동일
}

// 매개변수가 없는 람다식 함수가 noParam 함수의 매개변수 out으로 지정됨
fun noParam(out: () -> String) = println(out())
  • 매개 변수가 한 개인 경우
fun main() {
    // 매개변수 없는 람다식 함수
...
    // 매개변수가 하나 있는 람다식 함수
    // a는 람다식의 인자로 사용될 변수
    oneParam({ a -> "Hello World! $a" })
    oneParam { a -> "Hello World! $a" } // 위와 동일 결과, 소괄호 생략 가능
    oneParam { "Hello World! $it" }  // 위와 동일 결과, it으로 대체 가능
}
...
// 매개변수가 하나 있는 람다식 함수가 oneParam함수의 매개변수 out으로 지정됨
fun oneParam(out: (String) -> String) {
    println(out("OneParam"))
}
  • it은 하나의 키워드로, 앞쪽에서 가져온 변수 하나를 지칭하는 데 사용. 변수가 2개인 경우 it 사용 불가.

  • 매개변수가 두 개인 경우

fun main() {
...
    // 매개변수가 두 개 있는 람다식 함수
    moreParam { a, b -> "Hello World! $a $b"} // it으로 매개변수명 생략 불가
...
}
// 매개변수가 두 개 있는 람다식 함수가 moreParam 함수의 매개변수로 지정됨. 
fun moreParam(out: (String, String) -> String) {
    println(out("OneParam", "TwoParam"))
}
  • 매개변수를 생략하는 경우
    : 처리식에서 매개변수 2개를 가져왔으나, 실제로 1개의 매개변수만 사용할 때 _를 이용해 생략할 수 있다.
moreParam(_,b->"Hello World! $b")
  • 첫 번째 문자열은 사용하지 않고 생략함. 위의 코드는 첫번째 인자는 생략하고 두번째 인자만 내부에서 사용하겠다는 의미임.

✅ 일반 매개변수와 람다식 매개변수를 같이 사용

fun main(){
	//인자와 함께 사용하는 경우
	withArgs("Arg1","Arg2",{a,b -> "Hello World! $a $b"})
    //withArgs()의 마지막 인자가 람다식인 경우 소괄호 바깥으로 분리 가능, 일반 매개변수는 생략 불가능
    withArgs("Arg1","Arg2"){a,b->"Hello World! $a $b"}
}
//withArgs함수는 일반 매개변수 2개를 포함, 람다식 함수를 마지막 매개변수로 가짐
fun withArgs(a:String, b:String, out: (Stirng, String) -> String)
//a와 b는 기본 타입으로 만들어진 변수, 맨 마지막에 들어간 변수는 람다식 형태를 취하고 있음.
  • 두 개의 람다식을 한 번에 사용할 경우
fun main(){
	twoLambda({a,b -> "First $a $b"},("Second $it"))
    twoLambda({a,b -> "First $a $b"}) {"Second $it"} //위와 동일
}

fun twoLambda (first: (String, String) -> String, second : (String) -> String ) {
	println(first("OneParam","TwoParam"))
    println(second("OneParam"))
}

: 마지막 람다식만 뒤로 빼낼 수 있음.

  • ({첫 번째), {두 번째}) = ({첫 번째}) 두 번째
  • ({첫 번째},{두 번째}) {세 번째}
profile
개발자에서, IT Business 담당자로. BrSE 업무를 수행하고 있습니다.

0개의 댓글