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

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

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

from http://goni95.tistory.com/161 by ccl(A) rewrite - 2021-11-05 01:01:28