[코틀린 스터디 09]0715

ssook·2021년 7월 15일
0

✅ 익명함수

: 함수가 이름이 없는 것

fun (x:Int, y:Int): Int=x+y //함수 이름이 생략된 익명 함수

: 이름이 없기에, 변수 내에서 선언하는 등 임시적인 용도로 사용함

val add:(Int, Int)-> Int=fun(x,y)=x+y //익명함수를 사용한 add 선언
val result=add(10,2) //add의 사용

일반 익명 함수에서는 return, break, continue가 사용 가능하지만 람다식에서는 사용하기 어려움.
(라벨 표기법과 같이 사용해야 함)

✅ 인라인 함수

  • 함수가 호출되는 곳에 내용을 모두 복사
  • 함수의 분기 없이 처리 → 성능 증가
  • fun 키워드 대신 inline 키워드 작성
  • inline을 쓰면 호출이 아니라 그냥 코드 자체를 복사해 넣기 때문에 오버헤드가 줄어든다. 하지만, 코드가 길수록 코드 양이 많아지므로 주의!

    noinline 키워드
    일부 람다식 함수를 인라인 되지 않게 하기 위해 사용

✅ 비지역반환과 비지역반환의 금지

fun main() {
    shortFunc(3) {
        println("First call: $it")
        return // ①
    }
}

inline fun shortFunc(a: Int, out: (Int) -> Unit) {
    println("Before calling out()")
    out(a)
    println("After calling out()") // ②
}
  • 코틀린에서는 익명 함수를 종료하기 위해 return을 사용할 수 있으며 이때 특정 반환값 없이 return만 사용해야 함.
  • 람다식을 인자로 넘겨줄 때 람다식 내에서 return으로 반환하면, 람다식만 종료되는 것이 아니라 람다식을 사용한 함수까지 종료되는데, 이를 비지역반환이라고 한다.
  • 이러한 비지역반환을 막기 위해 아래와 같은 두가지 방법을 사용한다.

1. crossinline 키워드 사용
아래는 해당 키워드를 사용한 예시이다.

inline fun shortFunc(a: Int, crossinline out: (Int) -> Unit) {
    println("Before calling out()")
    nestedFunc { out(a) }
    println("After calling out()")
}

2. 라벨을 사용해 람다식만 종료
이 경우, 람다식이 인라인 함수가 아니어야 한다. 매개변수로 사용하는 람다식 시작부분에 @라벨을 붙이고 끝부분에 라벨@을 불여야 한다.

fun shortFunc(a: Int, crossinline out: (Int) -> Unit) {
    println("Before calling out()")
    nestedFunc { out(a) }
    println("After calling out()")
}
fun main() {
    shortFunc(3) lambda@{
        println("First call: $it")
        return@lambda
    }
}

✅ 확장 함수

  • 클래스의 멤버 함수를 외부에서 더 추가할 수 있음
  • 원본 라이브러리를 수정하지 않고, 외부에서 더 추가할 때 사용.
  • 아래는 확장함수 사용법.
fun 확장대상.함수명(매개변수,...): 반환값{
	return}
  • 너무 많이 사용하면 기존 라이브러리에 멤버 함수가 더 추가된 것 같은 효과이므로 호환성은 떨어질 수 있음.
  • 아래는 String에 확장함수 추가하는 예제.
fun main() {
    val source = "Hello World!"
    val target = "Kotlin"
    println(source.getLongString(target))
}

// String을 확장해 getLongString 추가
fun String.getLongString(target: String): String =
        if (this.length > target.length) this  else target
  • this는 확장 대상에 있던 자리의 문자열인 source 객체를 나타냄
  • 기존의 표준 라이브러리를 수정하지 않고도 확장 가능
profile
개발자에서, IT Business 담당자로. BrSE 업무를 수행하고 있습니다.

0개의 댓글