코틀린에서 함수는 독립적으로 존재할 수 있으며, 자바보다 훨씬 간결하고 유연하게 선언할 수 있어 '코틀린의 꽃'이라 불린다.
자바와 가장 큰 차이점은 파라미터의 이름이 타입보다 먼저 오며, 반환 타입이 함수 정의 끝에 위치한다는 점이다.
fun sum(a: Int, b: Int): Int {
return a + b
}
함수의 몸체가 단 한 줄의 식으로 이루어져 있다면, 중괄호{}와 return을 생략하고 =를 사용하여 축약할 수 있다.
// 반환 타입까지 추론이 가능하여 생략할 수 있다.
fun sum(a: Int, b: Int) = a + b
코틀린은 클래스 밖에서도 함수를 선언할 수 있다. 이는 자바에서 유틸리티 성격의 메서드를 만들기 위해 무의미한 클래스(UtilClass)를 생성해야 했던 불편함을 해결해준다.
Kotlin: 클래스 없이 함수만 선언해도 어디서든 접근 가능.
Java 비유: 자바의 static 메서드와 유사하게 동작하지만, 훨씬 가독성이 좋고 코드가 깔끔해진다.
// Utils.kt 파일
fun log(message: String) {
println("Log: $message")
}
class Service {
fun run() {
log("서비스 실행") // 클래스 외부 함수를 바로 사용
}
}
자바에서는 파라미터 개수가 다를 때마다 여러 개의 메서드를 오버로딩(Overload)해야 했다.
코틀린은 기본값(Default Value)을 설정하여 이를 함수 하나로 처리한다.
// 함수 하나로 3가지 케이스를 모두 대응 가능
fun sum(a: Int, b: Int, c: Int = 0) = a + b + c
fun main() {
sum(1, 2) // c는 기본값 0 사용 (결과: 3)
sum(1, 2, 3) // c에 3 대입 (결과: 6)
// Named Arguments: 이름을 지정하면 순서와 상관없이 대입 가능
sum(b = 10, a = 5)
}
반환값이 없는 함수의 경우 자바에서는 void를 사용하지만, 코틀린은 Unit이라는 객체를 반환한다. (생략 가능)
fun printSum(a: Int, b: Int): Unit { // : Unit은 생략 가능
println(a + b)
}
간결성: = 하나로 함수를 정의할 수 있는 단일 식 함수 지원.
유연성: 클래스에 얽매이지 않는 최상위 함수 제공.
효율성: 기본 파라미터를 통해 복잡한 오버로딩 없이 함수 하나로 다양한 케이스 대응.