개발일지

코틀린(Kotlin) 함수의 디폴트 파라미터

앱또웹 2024. 12. 6. 15:10
728x90
반응형

코틀린은 함수의 파라미터에 기본값을 지정할 수 있습니다

메소드 오버로딩으로 생기는 불필요한 코드 대폭 줄일 수 있죠!

앞서 만든 toast() 함수를 코틀린으로 구현해 보겠습니다

ToastUtilKotlin.kt
@file:JvmName("ToastUtil")
package com.example.kotlinsample

import android.widget.Toast

fun toastShort(message:String) {
    Toast.makeText(MainApplication.getAppContext(), message, Toast.LENGTH_SHORT).show()
}

fun toastLong(message: String) {
    Toast.makeText(MainApplication.getAppContext(), message, Toast.LENGTH_LONG).show()
}

// 코틀린에서는 함수의 기본값을 지정 가능하다
fun toast(message: String, length: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(MainApplication.getAppContext(), message, length).show()
}

위 코드에는 자바와 달리 'length' 파라미터의 기본값을 함수 선언부에서 지정했습니다

toast("${number} 는 2의 배수입니다.")
toast("${number} 는 2의 배수입니다.", Toast.LENGTH_LONG)

파라미터를 한 개만 써도 되고 필요한 경우 토스트 메세지 길이를 지정해도 됩니다

코드는 훨씬 간결하지만 결과는 자바의 '오버로딩'과 동일하죠

코틀린은 이런 함수 파라미터의 기본값을 지원하기에

파라미터가 여러 개인 함수가 있더라도 큰 문제가 없습니다

fun function(param1: Int, param2: Int = 2, param3: Int = 3, param4: Int = 4, param5: Int = 5) {

}

예를 들어 자바에 곤란한 '파라미터가 5개인' 함수는 자바 코드에 비해 훨씬 간결하고 직관적이죠

그런데 여기서 한 가지 의문점이 듭니다

코틀린 코드에 함수 기본값을 사용하는 경우 당연히 문제가 없는데

자바 코드에 호출할 때 아무런 문제가 없을까요?

아직 자바 컴파일러는 코틀린의 '파라미터 기본값'을 처리 못 합니다

때문에 자바코드는 모든 파라미터의 값을 넘겨줘야 합니다

다만 코틀린에 '어노테이션' 기능을 사용해 마치 자바에서 메소드 오버로딩으로 처리한것과 같은 효과를 줄 수 있습니다

@JvmOverloads
fun function(param1: Int, param2: Int = 2, param3: Int = 3, param4: Int = 4, param5: Int = 5) {

}

'@JvmOverloads' 구문은 자바에 파라미터 기본값을 위해 메소드 오버로딩을 처리한 것과 같은 효과를 줍니다

@JvmOverloads 명령을 추가 후 자바코드 함수를 호출해 확인해 보세요!

728x90
반응형