Kotlin은 기본 값 (default arguments)과 명명된 매개변수 (named parameters)를 지원하여 Java에 비해 큰 유연성을 제공합니다.
fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
greet(greeting = "안녕하세요") // -> 안녕하세요, User!
@JvmOverloads 주석이 필요할 수 있습니다.Kotlin에서 함수 호출 시 위치 인수와 명명된 인수를 자유롭게 혼합할 수 있습니까?
정답: 아닙니다, 최소한 하나의 명명된 인수를 지정한 후에는 모든 후속 인수도 명명되어야 합니다. 이것을 위반하면 컴파일 오류가 발생합니다.
// 잘못된 예 greet(greeting = "안녕하세요", "Ivan") // 오류! // 올바른 예 greet("Ivan", greeting = "안녕하세요") greet(name = "Ivan", greeting = "안녕하세요")
이야기
팀은 Kotlin 모듈을 레거시 Java 프로젝트에 통합했으며, 기본 매개변수가 있는 함수에
@JvmOverloads주석을 추가하는 것을 잊었습니다. 그 결과 Java 코드에서 필요한 오버로드 메소드를 볼 수 없어, 호출 시 런타임 오류가 발생했습니다.
이야기
명명된 매개변수를 사용한 리팩토링 중 개발자가 실수로 인수의 순서를 바꾸었고, 매개변수의 이름 변경 시 이 문제가 눈에 띄지 않았습니다 (타입은 변경되지 않았지만 호출의 의미가 변경되었습니다!). 이로 인해 UI 논리에서 이상한 버그가 발생했고, 즉시 발견되지 않았습니다.
이야기
한 개발자는 가독성을 높이기 위해 호출의 중간에서 위치 인수와 명명된 인수를 혼합했습니다. 코드는 컴파일되지 않았지만, 팀은 문제가 무엇인지 이해하는 데 어려움을 겪었습니다 — 다른 언어에서 자주 접했던 방식이기 때문에 Kotlin에서도 유사한 동작을 기대했습니다.