동적 타입
동적 타입 (Dynamic type)
dynamic타입은 JVM을 대상으로 하는 코드에서는 지원되지 않아요.
Kotlin은 정적 타입 언어지만, 여전히 JavaScript 생태계 같은 타입이 없거나 느슨하게 타입이 지정된 환경과 상호운용해야 해요. 이런 사용 사례를 돕기 위해 언어에 dynamic 타입이 제공됩니다.
val dyn: dynamic = ...
dynamic 타입은 기본적으로 Kotlin의 타입 검사기를 꺼 버려요.
dynamic타입의 값은 어떤 변수에든 할당하거나 어디든 파라미터로 전달할 수 있어요- 어떤 값이든
dynamic타입의 변수에 할당하거나dynamic을 파라미터로 받는 함수에 전달할 수 있어요 dynamic타입 값에 대한null검사는 비활성화돼요
dynamic의 가장 독특한 특징은 dynamic 변수에서 어떤 파라미터로든 any 프로퍼티나 함수를 호출할 수 있다는 점이에요.
dyn.whatever(1, "foo", dyn) // 'whatever' is not defined anywhere
dyn.whatever(*arrayOf(1, 2, 3))
JavaScript 플랫폼에서 이 코드는 "그대로" 컴파일됩니다. Kotlin의 dyn.whatever(1)은 생성된 JavaScript 코드에서 dyn.whatever(1)이 되죠.
dynamic 타입 값에서 Kotlin으로 작성한 함수를 호출할 때는 Kotlin-to-JavaScript 컴파일러가 수행하는 이름 변형(name mangling)을 기억해야 해요. 호출해야 하는 함수에 잘 정의된 이름을 할당하려면 @JsName 애노테이션을 사용해야 할 수 있습니다.
동적 호출은 항상 결과로 dynamic을 반환하므로, 그런 호출은 자유롭게 연결(chain)할 수 있어요.
dyn.foo().bar.baz()
dynamic 호출에 람다를 전달하면, 그 모든 파라미터는 기본적으로 dynamic 타입이 돼요.
dyn.foo {
x -> x.bar() // x is dynamic
}
dynamic 타입의 값을 사용하는 표현식은 JavaScript로 "그대로" 변환되며 Kotlin 연산자 관례를 사용하지 않아요. 다음 연산자가 지원됩니다.
- 이항:
+,-,*,/,%,>,<>=,<=,==,!=,===,!==,&&,|| - 단항
- 접두:
-,+,! - 접두 및 접미:
++,--
- 접두:
- 할당:
+=,-=,*=,/=,%= - 인덱스 접근:
- 읽기:
d[a], 인자가 둘 이상이면 오류 - 쓰기:
d[a1] = a2,[]안의 인자가 둘 이상이면 오류
- 읽기:
dynamic 타입의 값에 대한 in, !in, .. 연산은 금지돼요.
더 기술적인 설명은 스펙 문서를 참고하세요.
더 알아보기 (Learn more)
- Kotlin 공식 문서의 Dynamic type 페이지
- Use JavaScript code from Kotlin · Use dependencies from npm