Kotlin - 기본 인자(Default arguments)에 대해서 알아보기

기본 인자는 인자의 값이 default로 설정되는 것을 말합니다. JAVA의 경우 동일한 메소드 이름에 인자를 하나 추가하려면, 오버로딩(이름은 같지만 인자나 리턴타입이 다른 메소드)하여 새로운 메소드를 만들어야 합니다.

예를들어, 자바에서 인자 1개를 갖고 있는 foo 메소드가 있는데 인자를 2개인 foo를 만드려면 기존 메소드를 오버로딩하여 새로운 메소드를 정의해야 합니다.

void foo(int bar) { }
void foo(int bar, int baz) { }

위 처럼 정의하면 아래처럼 호출될 수 있습니다.

foo(1);
foo(1, 2);

하지만 코틀린은 기본 인자(Default arguments, parameters)를 지원하기 때문에, 1개의 메소드만 정의하여 위의 두가지 함수 호출을 가능하게 할 수 있습니다. 기본 인자를 설정하는 방법은, 인자 이름 다음에 인자 = 0처럼 기본 값을 정의하면 됩니다.

fun foo(bar, baz: Int = 0)

위의 메소드는 아래처럼 인자의 개수가 다르게 호출될 수 있습니다.

foo(1)      // baz = 0 은 기본인자로 전달
foo(1, 2)

기본 인자 규칙1

인자와 기본 인자(Default arguments)를 섞어쓰는 경우가 있습니다. 인자를 생략하는 방법에 따라서 메소드를 호출할 때 어떤인자를 생략할 수 있는지 정해집니다. 이런 규칙들에 대해서 알아보겠습니다.

인자로 함수 1개를 받고 기본 인자로 Int 2개 받는 foo 함수가 있습니다.

fun foo(qux: () -> Unit, bar: Int = 0, baz: Int = 1) {
    println("bar: $bar")
    println("baz: $baz")
    qux()
}

함수를 호출할 때 매번 인자 앞에 이름을 명시적으로 써주면 문제가 되지 않습니다.

foo(bar = 2, baz = 1, qux = { println("hello") } )

실행 결과

bar: 2
baz: 1
hello

하지만 인자의 이름을 명시적으로 지정하지 않고 일부 인자를 생략한다면, 코틀린 규칙에 의해서 기본 인자가 적용됩니다.

위의 함수는 아래와 같은 인자들로 호출될 수 있습니다. 인자를 생략한 메소드는 기본인자가 적용되었습니다. 기본 인자로 적용된 변수는 오른쪽에 주석으로 적어놨습니다.

foo({ println("hello") })           // bar = 0 (default), baz = 1 (default)
foo({ println("hello") }, 1)        // baz = 1 (default)
foo({ println("hello") }, 1, 2)

기본 인자 규칙2

기본인자가 왼쪽에 오고, 인자가 오른쪽에 오도록 함수를 만들면 어떻게 될까요? 아래 코드는 그렇게 작성한 함수입니다.

fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) {
    println("bar: $bar")
    println("baz: $baz")
    qux()
}

위 함수는 아래 처럼 호출할 수 있습니다. 두번째 인자 baz는 생략되었기 때문에 기본 인자로 전달되었습니다. qux = 로 함수에 이름을 명시한 것은 컴파일러가 이 인자를 두번째 인자인 baz로 인식하기 때문입니다. 함수 인자가 세번째 인자라는 것을 알려주기 위해 이름을 명시적으로 써주었습니다.

foo(1, qux = { println("hello") })   // baz = 1 (default)

코틀린에서 지원하는 문법으로, 위 코드는 아래처럼 쓸 수도 있습니다. 마지막 함수 인자를 () 밖으로 뺄 수 있습니다.

foo(1) { println("hello") }  // baz = 1 (default)

bar을 기본인자로 사용하려면 어떻게 해야 할까요? baz = 2qux = {...}로 이름을 명시적으로 지정해주면 됩니다. 첫번째 인자인 bar에 대한 인자가 없기 때문에 기본 인자가 사용됩니다.

foo(baz = 2, qux = { println("hello") })  // bar = 0 (default)

barbaz 모두 기본인자로 사용하려면 아래처럼 함수만 이름을 명시적으로 써주면 됩니다.

foo(qux = { println("hello") })  // bar = 0 (default), baz = 1 (default)

위 코드는 이렇게 쓸수도 있습니다.

foo { println("hello") }         // bar = 0 (default), baz = 1 (default)

정리해보면, 기본인자들이 오른쪽에 배치하는 것이 간결하게 메소드를 호출할 수 있게 도와줍니다.

정리

기본 인자에 대해서 알아보았습니다. 사실 대충 인자를 넘겨도 IDE가 어떤 값이 할당되는지 표시해주기 때문에 위의 내용을 몰라도 큰 문제는 없습니다만, 위의 내용은 코틀린 언어를 이해하기 위해 알아두면 좋을 것 같습니다.

참고

Loading script...
codechachaCopyright ©2019 codechacha