코틀린에서 기본 매개변수는 함수 시그니처에서 기본값을 직접 지정할 수 있도록 하여 코드를 더 컴팩트하고 유연하게 만듭니다. 이러한 기능은 가독성을 높이고 유지 관리를 용이하게 하여 서로 다른 수의 인자를 가진 오버로드된 메소드를 만드는 필요성을 줄입니다.
Java에서는 함수 호출의 다양한 변형을 위해 여러 개의 오버로드된 메소드를 작성해야 하는 경우가 많습니다. 코틀린에서는 기본값을 선언하는 간결한 방법을 개발하여 API를 간소화할 수 있게 되었습니다.
서로 다른 호출 변형에 대한 메소드 오버로드는 복잡하고 불편하여 과도한 코드와 유지 관리에서의 잠재적인 오류를 초래합니다.
코틀린에서는 함수 정의에 기본 매개변수를 직접 선언할 수 있습니다. 이는 JVM 바이트코드에서 동반자 합성 메소드를 통해 구현되며 (Java에서 호출할 때) 또는 일반적인 값 생략을 통해 (코틀린에서) 구현됩니다. 명명된 매개변수와 결합하면 함수 호출 인터페이스가 매우 강력해집니다.
fun greet(name: String = "Guest", greeting: String = "Hello") { println("$greeting, $name!") } greet() // Hello, Guest! greet("Alice") // Hello, Alice! greet(greeting = "Hi") // Hi, Guest! greet("Bob", greeting = "Welcome") // Welcome, Bob!
인터페이스 안의 함수에서 기본 매개변수를 사용할 수 있습니까?
예, 가능하지만 기본값은 코틀린에서 호출할 때만 구현되며, Java에서 해당 메소드를 호출할 때는 인자를 명시적으로 지정해야 합니다.
첫 번째 (오른쪽이 아닌) 매개변수에 대해 기본값을 지정할 수 있습니까?
예, 코틀린에서는 가능하지만, 호출 시 명명된 인자를 사용하는 경우에 특히 그렇습니다. 그러나 Java에서 함수를 사용할 때는 복잡할 수 있으며, 기본 매개변수는 오른쪽에 있어야 합니다.
위치 인자 및 명명된 매개변수 혼합 사용 시 인자의 순서는 어떻게 작동합니까?
코틀린에서는 첫 번째 명명된 인자 이후의 모든 인자는 명명되어야 하며, 그렇지 않으면 컴파일 오류가 발생합니다.
greet("Ivan", greeting = "Zdrastvuyte") // OK greet(greeting = "Zdrastvuyte", "Ivan") // 오류: 명명된 인자 후에 위치 인자를 전달할 수 없음
로깅 라이브러리에서 서로 다른 조합을 위한 10개의 오버로드된 메소드를 구현했습니다 (예: Exception과 함께, Tag와 함께, 없을 때 등), 유지 관리하기 불편합니다.
장점:
단점:
기본 인수를 사용하는 함수:
fun log(msg: String, tag: String = "", throwable: Throwable? = null) { ... }
장점:
단점: