본문 바로가기
Kotlin

[깡샘의 코틀린 프로그래밍] 정리 25 - dynamic 타입

by 들풀민들레 2018. 3. 2.

본 글은 [깡샘의 코틀린 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.

좀더 자세한 내용은 책을 통해 확인해 주세요.

 

 

 

25장. 자바스크립트 개발을 위한 코틀린

 

25.3.1. dynamic 타입

 

코틀린으로 자바스크립트 프로그램을 작성한다는 것은 우리가 이제껏 살펴보았던 코틀린의 다양한 프로그램 기법을 대부분 그대로 사용하면서 프로그램을 작성할 수 있다는 것입니다. 그런데 코틀린 프로그램이 자바 클래스로 만들어져 JVM에서 수행되는 것과 JS 파일로 만들어져 브라우저에서 수행되는 것에는 차이가 있을 수밖에 없습니다.

 

따라서 JVM에서는 지원하지 않는 자바스크립트만을 위한 기법들이 존재합니다. 대표적으로 데이터 타입 부분을 이야기할 수 있습니다. 자바는 데이터 타입을 명시해야 합니다. 타입이 없는 데이터는 존재할수 없습니다. 하지만 자바스크립트는 변수에 데이터 타입을 명시하지 않습니다.

 

01 var data1=10

02 data1="kkang"

03

04 var resultDom= document.getElementById("result_3_1_js")

05 resultDom.innerHTML="data1 : "+data1;

 

자바스크립트 소스입니다. 01번 줄에 변수를 선언했는데 데이터 타입을 명시하지 않았습니다. data1이라는 변수에 10이라는 정수를 대입했는데, 다시 02번 줄에서 "kkang"이라는 문자열을 대입했습니다. 자바나 코틀린의 코드였다면 타입 에러가 발생합니다. 하지만 자바스크립트에서는 전혀 문제가 발생하지 않습니다.

 

코틀린으로 자바스크립트 프로그램을 작성한다면 가능한 한 데이터 타입을 명확하게 지정하는 것이 더 좋습니다. 데이터 타입은 변수에 해당 타입의 데이터가 대입되는 것을 보장하기 위한 일입니다. 데이터 타입을 지정할 수 있다는 점은 자바스크립트를 코클린으로 작성했을 때의 이점이 됩니다. 일반적으로는 다음처럼 코틀린 프로그램이 작성되겠지요

 

01 package twenty_five_three_one

02

03 import kotlin.browser.document

04

05 data class User(val no: Int, val name: String)

06

07

08 fun main(args: Array<String>) {

09   val obj = User(10, "kkang")

10

11   val resultDom = document.getElementById("result_3_1_dynamic_1")

12   resultDom?.innerHTML = "no : ${obj.no}, name : ${obj.name}"

13

14 }

 

위의 소스는 코틀린으로 자바스크립트 프로그램을 작성한 것입니다. 자바스크립트에서도 JVM과 마찬가지로 08번 줄의 main( ) 함수가 엔트리 포인트(entry point)입니다. 즉, 별도로 지정하지 않아도 fun main(args: Array<String>) { }라는 함수가 가장 먼저 호출됩니다. 웹 프로그램의 특성상 사용자가 버튼 클릭 같은 이벤트를 발생시켜 프로그램이 시작될 수도 있으므로 꼭 main( ) 함수를 작성할 필요는 없지만, 만약 자바스크립트가 로딩되자마자 가장 먼저 자동으로 실행되는 함수를 명시해야 한다면 main( )함수를 작성합니다.

 

11번 줄의 document 객체는 자바스크립트의 document와 같습니다. HTML 문서 자체를 지칭하는 객체로 document.getElementById( ) 함수를 이용하여 DOM Node(태그 객체)를 획득합니다. 자바스크립트와 객체명, 함수명이 같습니다.

 

이전에 우리가 살펴보았듯이 데이터를 표현하기 위해 05번 줄에 data 클래스를 선언했고, 이 클래스 이용해 09번 줄에서 객체를 생성했습니다. 이 객체에 대입해야 하는 데이터는 클래스 생성자 매개변수에서 Int, String 등으로 타입을 지정했습니다. 결국, no라는 변수에는 정수를, name이라는 변수에는 문자열을 대입하도록 한정할 수 있습니다.

 

변수에 데이터 타입을 명시함으로써 프로그램의 명료성이 좋아집니다. 그런데 자바스크립트처럼 데이터 타입을 명시하지 않고 프로그램을 작성할 수는 없을까요? 자바스크립트를 코틀린으로 작성한다고 하더라도 다른 부분은 코틀린의 다양한 기법의 도움을 받지만(클래스 선언 등의 다양한 부분) 데이터에 대해서는 타입을 명시하지 않고 자바스크립트처럼 다양한 타입의 데이터를 변수에 대입할 수 있게 작성하고 

싶을 수 있습니다.

 

일단 코틀린에서는 변수에 타입을 명시하지 않으면 컴파일 에러가 발생합니다. 하지만 자바스크립트의 특징을 고려해 dynamic이라는 타입을 제공합니다. 코틀린으로 자바스크립트 프로그램을 작성하면서 변수의 타입을 선언하지 않을 수 없지만, dynamic 타입으로 선언하면 자바스크립트 변수와 동일하게 다양한 타입의 데이터를 대입할 수 있습니다.

 

dynamic 타입은 JVM을 대상으로 하는 프로그램에서는 사용할 수 없습니다. 오직 자바스크립트를 목적으로 하는 곳에서만 사용할 수 있습니다. dynamic은 "런타임 시 동적으로 타입이 결정되니까 타입체커 너는 신경쓰지마"라는 의미의 타입입니다. 그러므로 dynamic으로 변수를 선언하면 프로그램 소스에서 하나의 변수에 다양한 타입의 데이터를 대입할 수 있습니다.

 

01 fun dynFun(arg: dynamic): dynamic{

02   return 10

03 }

04

05 var dynData: dynamic = 10

06 dynData = "hello"

07

08 dynFun(10)

09 dynFun(true)

 

01번 줄의 함수는 매개변수와 반환 타입을 dynamic으로 선언했습니다. 이렇게 하면 이 함수에서 어떤 타입의 데이터도 반환할 수 있으며, 08, 09번 줄처럼 함수를 호출할 때 다양한 타입의 데이터를 매개변수에 대입할 수 있습니다. 또한, 05번 줄처럼 변수를 dynamic으로 선언하면 이 변수에는 정수, 문자열등 다양한 타입의 데이터를 입력할 수 있습니다.

 

dynamic 타입으로 선언한 변수는 Null 체크에서도 자유로워집니다. 코틀린의 Null 불허 데이터와 Null 허용 데이터를 구분하지 않습니다.

 

01 val myData2: dynamic = null

02 val myData3: dynamic? = null

03 val myData4: dynamic? = 10

 

코틀린에서는 Null 허용 데이터는 꼭 데이터 타입에 ?를 추가해야 합니다. 그런데 01번 줄의 데이터 타입에는 ?를 추가하지 않았습니다. 이 변수에 null을 대입해도 컴파일 에러가 발생하지 않습니다. 물론, 02번 줄처럼 ?를 추가한다고 문제가 되지는 않습니다. 중요한 건 dynamic 타입은 타입 체크를 하지 않겠다는 의미이므로 ? 추가가 의미가 없다는 이야기입니다.

 

또한, 타입을 체크하지 않으므로 컴파일러가 각 타입의 맴버(변수, 함수)를 체크하지도 않습니다.

 

01 myData2.a1=10

02 myData2.aaa(10, "hello")

 

예에서 myData2는 dynamic 타입으로 선언했다는 가정입니다. myData2의 a1이라는 변수와 aaa라는 함수를 접근한다는 가정인데, 실제 a1이라는 변수와 aaa라는 함수는 없습니다. 그런데 없는 맴버에 접근햇는데 컴파일 에러가 발생하지 않습니다. 타입을 체크하지 않으므로 실제 그 타입의 멤버도 체크하지 않습니다. 따라서 예처럼 아무 변수, 함수에 접근해도 컴파일러는 에러를 발생하지 않습니다. 물론, 런타임 때는 문제가 발생할 수도 있습니다.

 

이제 처음에 작성했던 자바스크립트 코드를 dynamic 타입을 이용해 코틀린으로 작성해 보겠습니다

 

01 var data1: dynamic = 10

02 data1="kkang"

03

04 var resultDom2= document.getElementById("result_3_1_dynamic_2")

05 resultDom2?.innerHTML="data1 : $data1"