Kotlin 기본 문법5 - 함수

KWANWOO·2021년 12월 26일
0

Kotlin 언어 배우기

목록 보기
5/8
post-thumbnail

코틀린 기본 문법 정리5 - 함수

안드로이드 네이티브 앱 개발 공부를 위해 Kotlin의 기본적이면서도 중요한 문법들을 정리해보았다. 이 글은 함수에 관련된 내용이다.

1. 함수

하나 이상의 표현식을 함수로 그룹화할 수 있다. 결과가 필요할 때마다 동일한 일련의 표현식을 반복하는 대신 함수에 표현식을 포함한 다음 함수를 호출할 수 있다.

함수를 선언하려면 fun 키워드 뒤에 함수 이름이 오도록 사용한다. 그런 다음 함수에 사용되는 입력 유형(있는 경우)을 정의하고 함수에서 반환하는 출력 유형을 선언한다. 함수의 본문에서는 함수를 호출할 때 호출되는 표현식을 정의한다.

  • 함수의 이름은 generateAnswerString이다. 입력 값은 받지 않으며, String 유형의 결과를 출력한다.
fun generateAnswerString(): String {
    val answerString = if (count == 42) {
        "I have the answer."
    } else {
        "The answer eludes me"
    }

    return answerString
}

함수를 호출하려면 함수의 이름 뒤에 호출 연산자(())를 사용한다.

  • answerString 변수는 generateAnswerString()의 결과에 따라 초기화된다.
val answerString = generateAnswerString()

함수에서는 인수를 입력으로 사용할 수 있고, 함수를 선언할 때 인수의 개수와 유형을 지정할 수 있다. 함수 내에서 이름을 사용하여 인수를 참조할 수 있다.

  • enerateAnswerString()은 Int 유형의 countThreshold 인수 한 개를 사용한다.
fun generateAnswerString(countThreshold: Int): String {
    val answerString = if (count > countThreshold) {
        "I have the answer."
    } else {
        "The answer eludes me."
    }

    return answerString
}

이 함수를 호출할 때 함수 호출 괄호 안에 인수를 포함해야 한다.

val answerString = generateAnswerString(42)

2. 함수 선언 단순화

위의 generateAnswerString()은 매우 간단한 함수이다. 이 함수는 변수를 선언한 다음 즉시 반환한다. 따라서 단순화 할 수 있다.

  • 단일 표현식의 결과가 함수에서 반환되는 경우, 함수에 포함된 if-else 표현식의 결과를 직접 반환하여 로컬 변수 선언을 건너뛸 수 있다.
fun generateAnswerString(countThreshold: Int): String {
    return if (count > countThreshold) {
        "I have the answer."
    } else {
        "The answer eludes me."
    }
}
  • 반환 키워드(return)를 할당 연산자(=)로 바꿀 수도 있다.
fun generateAnswerString(countThreshold: Int): String = if (count > countThreshold) {
        "I have the answer"
    } else {
        "The answer eludes me"
    }

3. 익명 함수(Lamda)

모든 함수에 이름이 필요하지는 않다. 일부 함수는 입력과 출력에 의해 더 직접적으로 식별된다. 이러한 함수를 익명 함수라고 한다. 이 참조를 사용하여 나중에 익명 함수를 호출하면 익명 함수 참조를 유지할 수 있다. 다른 참조 유형과 마찬가지로 애플리케이션에서 참조를 전달할 수도 있다.

  • stringLengthFunc는 String을 입력으로 사용하고 String 입력 길이를 Int 유형의 출력으로 반환하는 익명 함수 참조를 포함한다.
  • 함수의 유형은 (String) -> Int로 표시한다.
val stringLengthFunc: (String) -> Int = { input ->
    input.length
}

이름이 지정된 함수와 마찬가지로 익명 함수는 표현식을 제한 없이 포함할 수 있다. 함수의 반환 값은 최종 표현식의 결과이다.

위의 익명함수 코드는 함수를 호출하지 않는다. 함수의 결과를 가져오려면 이름이 지정된 함수처럼 호출해야 한다.

  • stringLengthFunc를 호출할 때 String을 입력해야 한다.
val stringLengthFunc: (String) -> Int = { input ->
    input.length
}

val stringLength: Int = stringLengthFunc("Android")

익명함수에서 인풋으로 들어가는 값이 여러개가 될 수도 있다.

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

확장함수를 생성하여 기존 클래스에 함수를 추가할 수 있다.

  • 아래 예시에서 this는 "Kim"이 되고, it은 입력 파라미터가 하나이기 때문에 인풋 파라미터를 따로 작성하지 않고 입력받는 Int 값이 된다.
val nameAge: String.(Int) -> String = {
    "I'm ${this} and I'm ${it}"
}
val name = "Kim"
println(name.nameAge(25))

4. 고차 함수

함수는 다른 함수를 인수로 취할 수 있다. 다른 함수를 인수로 사용하는 함수를 고차 함수라고 한다. 이 패턴은 자바에서 콜백 인터페이스를 사용할 때와 동일한 방식으로 구성요소 간에 통신하는 데 유용하다.

  • stringMapper() 함수는 전달된 String에서 Int 값을 파생하는 함수와 함께 String를 가져온다.
fun stringMapper(str: String, mapper: (String) -> Int): Int {
    // Invoke function
    return mapper(str)
}
  • 다른 입력 매개변수를 충족하는 함수, 즉 String을 입력으로 사용하고 Int를 출력하는 함수와 String을 전달하여 stringMapper()를 호출할 수 있다.
stringMapper("Android", { input ->
    input.length
})
  • 익명 함수가 함수에 정의된 마지막 매개변수인 경우 함수를 호출하는 데 사용된 괄호 밖에서 함수를 전달할 수도 있다.
stringMapper("Android") { input ->
    input.length
}

코틀린 함수 정리 다했는데....

코틀린 함수 정리 해봤는데 기존에 사용하던 언어들이랑 좀 다른 부분이 많아서 이해하는데 어려운건 아니지만 익숙해지려면 많이 사용해 봐야될 것 같다. 특히 코틀린은 타입이 변수나 함수 뒤에 온다는 점은 좀 어색하고... 매개변수로 함수를 전달할 수도 있다는건 좋은듯...? 이것도 많이 써봐야 알 것 같다.

📄 Reference

profile
관우로그

0개의 댓글