너무 사소해서 그냥 지나칠 수 있지만 생각해보니 재미있는 Kotlin 의 특징

매개변수의 기본 값

아래와 같이 메서드 정의 시 매개변수(parameter)에 기본 값(default value)을 지정해 두면, 메서드 호출 시 별도로 매개변수를 전달하지 않으면 기본 값으로 호출 됨

fun method1(a: Int = 0, b: Int = 0) {
  println("a = $a, b = $b")
}

fun main() {
  method1()
}
// a = 0, b = 0

재미있는 부분

여러개의 매개변수가 있을 때, 일부만 넣으면 순서대로 할당됨

fun method1(a: Int = 0, b: Int = 0) {
  println("a = $a, b = $b")
}

fun main() {
  method1(3) // 3 은 a 에 할당됨
}
// a = 3, b = 0

두 번째 이 후의 매개변수의 기본 값은 이전 매개변수를 사용할 수 있음

fun method1(a: Int = 0, b: Int = a) { // b 의 기본 값은 a
  println("a = $a, b = $b")
}

fun main() {
  method1(3)
}
// a = 3, b = 3

역순은 안됨

fun method1(a: Int = b, b: Int = 0) {
  println("a = $a, b = $b")
}

fun main() {
  method1(b = 3)
}
// Parameter 'b' is uninitialized here.

이유

Java 로 디컴파일한 method1 의 코드를 보면 다음과 같음 (읽기 쉽게 수정)

public static void method1(int a, int b, int v) {
  // 인자 전달 여부에 따라 v 값을 조정
  if ((v & 1) != 0) { // a 값을 전달하지 않을 경우
    a = 0;
  }
  if ((v & 2) != 0) { // b 값을 전달하지 않을 경우
    b = a;
  }
  System.out.println("a = " + a + ", b = " + b);
}

Kotlin 을 Java 로 바꿀(컴파일 타임) 때 v 값 처럼 인자 전달 여부를 정의하는 로직이 존재

여기에서 매개변수 순서를 중요하게 여기는 것으로 추정되며, 실제로 실패하는(a: Int = b) 코드는 바이트코드 생성조차 안됨

// Backend Errors: 
// ================
// Error at Sample.kt(-,-): Parameter 'b' is uninitialized here.
// ================

전체가 아닌 매개변수 일부만 전달했을 때 순서대로 처리하기 때문에, 순서를 중요하게 여기는게 아닐까 싶음

쓰고보니 재미 없네…

참조

  • https://kotlinlang.org/docs/functions.html#parameters-with-default-values