객체 인스턴스를 디폴트 인자로 전달하는 경우(다음 예제의 g() 함수에서 da), g()를 호출할 때마다 같은 인스턴스가 반복해서 전달된다. 디폴트 인자로 함수 호출이나 생성자 호출 등을 사용하는 경우(다음 예제의 h() 함수에서 DefaultArg()), 함수를 호출할 때마다 해당 객체의 새 인스턴스가 생기거나 디폴트 인자에서 호출하는 함수가 호출된다.
NamedAndDefaultArgs/Evaluation.kt
package namedanddefault
class DefaultArg
val da = DefaultArg()
fun g(d: DefaultArg = da) = println(d)
fun h(d: DefaultArg = DefaultArg()) =
println(d)
fun main() {
g()
g()
h()
h()
}
샘플 출력
namedanddefault.DefaultArg@7440e464 namedanddefault.DefaultArg@7440e464 namedanddefault.DefaultArg@49476842 namedanddefault.DefaultArg@78308db1
두 g() 호출은 똑같은 객체 주소를 출력한다. 두 h() 호출에서 출력된 두 DefaultArg 객체의 주소는 서로 다르다. 따라서 이 둘이 다른 객체임을 알 수 있다.