안드로이드 네이티브 앱 개발 공부를 위해 Kotlin의 기본적이면서도 중요한 문법들을 정리해보았다. 이 글은 함수에 관련된 내용이다.
하나 이상의 표현식을 함수로 그룹화할 수 있다. 결과가 필요할 때마다 동일한 일련의 표현식을 반복하는 대신 함수에 표현식을 포함한 다음 함수를 호출할 수 있다.
함수를 선언하려면 fun 키워드 뒤에 함수 이름이 오도록 사용한다. 그런 다음 함수에 사용되는 입력 유형(있는 경우)을 정의하고 함수에서 반환하는 출력 유형을 선언한다. 함수의 본문에서는 함수를 호출할 때 호출되는 표현식을 정의한다.
fun generateAnswerString(): String {
val answerString = if (count == 42) {
"I have the answer."
} else {
"The answer eludes me"
}
return answerString
}
함수를 호출하려면 함수의 이름 뒤에 호출 연산자(())를 사용한다.
val answerString = generateAnswerString()
함수에서는 인수를 입력으로 사용할 수 있고, 함수를 선언할 때 인수의 개수와 유형을 지정할 수 있다. 함수 내에서 이름을 사용하여 인수를 참조할 수 있다.
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)
위의 generateAnswerString()은 매우 간단한 함수이다. 이 함수는 변수를 선언한 다음 즉시 반환한다. 따라서 단순화 할 수 있다.
fun generateAnswerString(countThreshold: Int): String {
return if (count > countThreshold) {
"I have the answer."
} else {
"The answer eludes me."
}
}
fun generateAnswerString(countThreshold: Int): String = if (count > countThreshold) {
"I have the answer"
} else {
"The answer eludes me"
}
모든 함수에 이름이 필요하지는 않다. 일부 함수는 입력과 출력에 의해 더 직접적으로 식별된다. 이러한 함수를 익명 함수라고 한다. 이 참조를 사용하여 나중에 익명 함수를 호출하면 익명 함수 참조를 유지할 수 있다. 다른 참조 유형과 마찬가지로 애플리케이션에서 참조를 전달할 수도 있다.
val stringLengthFunc: (String) -> Int = { input ->
input.length
}
이름이 지정된 함수와 마찬가지로 익명 함수는 표현식을 제한 없이 포함할 수 있다. 함수의 반환 값은 최종 표현식의 결과이다.
위의 익명함수 코드는 함수를 호출하지 않는다. 함수의 결과를 가져오려면 이름이 지정된 함수처럼 호출해야 한다.
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}"
}
확장함수를 생성하여 기존 클래스에 함수를 추가할 수 있다.
val nameAge: String.(Int) -> String = {
"I'm ${this} and I'm ${it}"
}
val name = "Kim"
println(name.nameAge(25))
함수는 다른 함수를 인수로 취할 수 있다. 다른 함수를 인수로 사용하는 함수를 고차 함수라고 한다. 이 패턴은 자바에서 콜백 인터페이스를 사용할 때와 동일한 방식으로 구성요소 간에 통신하는 데 유용하다.
fun stringMapper(str: String, mapper: (String) -> Int): Int {
// Invoke function
return mapper(str)
}
stringMapper("Android", { input ->
input.length
})
stringMapper("Android") { input ->
input.length
}
코틀린 함수 정리 해봤는데 기존에 사용하던 언어들이랑 좀 다른 부분이 많아서 이해하는데 어려운건 아니지만 익숙해지려면 많이 사용해 봐야될 것 같다. 특히 코틀린은 타입이 변수나 함수 뒤에 온다는 점은 좀 어색하고... 매개변수로 함수를 전달할 수도 있다는건 좋은듯...? 이것도 많이 써봐야 알 것 같다.