함수 기초
코드 블록 함수 본문
fun calculateArea(width: Int, height: Int): Int {
return width * height
}
표현식 함수 본문
fun calculateArea(width: Int, height: Int) = width * height
표현식 함수 본문을 사용할 경우 일반적으로 반환값 타입을 명시하지 않아도 됩니다. 하지만 재귀와 같은 복잡한 경우에는 표현식 함수 본문을 사용하더라도 반환값 타입을 명시해야 합니다.
함수 선얝 규칙
- 함수 매개변수는 반드시 타입을 명시해야 합니다
- 표현식이 아닌 함수 본문에서는 반환값 타입이 Unit인 경우를 제외하고는 모두 명시해야 합니다
- 재귀 함수인 경우 매개변수와 반환값 타입을 반드시 명시해야 합니다
- 공개 메서드의 경우 코드 가독성을 위해 함수 매개변수와 반환값 타입을 명시하는 것이 좋습니다
함수 타입
코틀린에서 함수 타입은 다음과 같은 형식을 가집니다:
() -> Unit
코틀린의 함수 타입 선언은 다음 규칙을 따라야 합니다:
- -> 기호를 사용하여 매개변수 타입과 반환값 타입을 구분합니다 (왼쪽: 매개변수, 오른쪽: 반환값)
- 매개변수 타입은 반드시 괄호로 묶어야 합니다
- 반환값 타입이 Unit인 경우에도 명시해야 합니다
클래스의 메서드를 참조하기 위해 `::`를 사용할 수 있습니다:
class DataProcessor {
fun process(data: String)
}
다음과 같이 process() 메서드를 참조할 수 있습니다:
val processor = DataProcessor()
val operation = processor::process
operation.invoke("sample data")
람다 표현식
기본적인 람다 표현식:
val multiply: (Int, Int) -> Int = {x: Int, y: Int -> x * y}
타입 추론을 지원하므로 다음과 같이 간소화할 수 있습니다:
val multiply: (Int, Int) -> Int = {x, y -> x * y}
또는:
val multiply = {x: Int, y: Int -> x * y}
람다 표현식 문법
- 람다 표현식은 {}로 감싸야 합니다
- 람다 매개변수 타입을 명시하고 반환값 타입이 추론 가능한 경우, 람다 변수의 함수 타입 선언을 생략할 수 있습니다
- 람다 변수에 함수 타입이 선언된 경우, 람다 표현식의 매개변수 타입을 생략할 수 있습니다
- 람다 표현식이 Unit 타입을 반환하지 않는 경우, 마지막 줄 표현식의 값이 반환값 타입이 됩니다
함수와 람다 표현식의 관계
함수 선언 방식
- fun 키워드로 등호가 없고 중괄호만 있는 경우 코드 블록 함수 본문이며, 반환값이 Unit가 아닐 경우 return이 필요합니다
fun displayMessage(message: String) {
println(message)
}
fun addNumbers(a: Int, b: Int): Int {
return a + b
}
- fun 키워드로 등호가 있고 중괄호가 없는 경우 단일 표현식 함수 본문이며, return을 생략할 수 있습니다
fun addNumbers(a: Int, b: Int) = a + b
- val이나 fun으로 선언하고 등호와 중괄호를 사용하면 람다 표현식을 선언하는 것입니다
val calculate = { x: Int, y: Int ->
x * y
}
// 호출 방법: calculate.invoke(3, 4) 또는 calculate(3, 4)
val createMultiplier = { factor: Int ->
{ number: Int -> number * factor }
}
// 호출 방법: createMultiplier(2).invoke(5) 또는 createMultiplier(2)(5)
- 람다 표현식의 자체 호출
{ x: Int, y: Int -> x - y }(10, 5)