본문 바로가기

Android | Kotlin 개발 관련 뉴스 & 기술

코틀린 뉴스 : Don’t argue with default arguments

728x90

1. 기본 사용법

함수를 오버로드하는 경우, 같은 함수를 여러 개 구현하는 대신 default arguments를 사용할 수 있습니다.

// instead of:
fun play(toy: Toy){ ... }

fun play(){
    play(SqueakyToy)
}

 // use default arguments:
 fun play(toy: Toy = SqueakyToy)

fun startPlaying() {
    play(toy = Stick)
    play() // toy = SqueakyToy
}

 

default argument는 생성자에도 적용됩니다.

class Doggo(
    val name: String,
    val rating: Int = 11
)

val goodDoggo = Doggo(name = "Tofu")
val veryGoodDoggo = Doggo(name = "Tofu", rating = 12)

 

 

2. 자바와 상호 운용성

자바에선 기본적으로 기본값에 대한 오버로드를 인식하지 못합니다. 컴파일러에게 오버로드 메서드를 생성하도록 하려면 Kotlin 함수에 @JvmOverloads 어노테이션을 사용하면 됩니다.

// kotlin
fun play(toy: Toy = SqueakyToy) {... }

// java
DoggoKt.play(DoggoKt.getSqueakyToy());
DoggoKt.play(); // 에러 발생

============================================

@JvmOverloads
fun play(toy: Toy = SqueakyToy) {… }

 

 

3. 상속과 Default argument

함수를 재정의하는 경우, 매개변수에 대한 default argument를 설정하면 에러가 발생합니다.  

open class Doggo(
    val name: String,
    val rating: Int = 11
) {
    open fun play(toy: Toy = SqueakyToy) {...}
}

class PlayfulDoggo(val playfulness: Int, name: String, rating: Int) : Doggo(name, rating) {
    // error: An overriding function is not allowed to specify default values for its parameters
    override fun play(toy: Toy = Stick) { }
}

 

여기까지 오버로드 메서드 구현 시 Default argument의 사용으로, boilerplate 코드를 줄이고, 매개변수에 대한 기본값을 설정하는 예제들에 대해서 알아봤습니다. 

 

이 글에선 확인할 수 없지만, 아래 포스팅에서 default argument가 있는 함수 및 객체 생성자에 대해서 디컴파일을 통해 어떻게 동작하는지 확인할 수 있으니, 자세한 내용을 알고싶으시면, 읽어보시기 바랍니다.

 

https://medium.com/androiddevelopers/dont-argue-with-default-arguments-2245b2c752c

 

Don’t argue with default arguments

Kotlin Vocabulary

medium.com