Kotlin 데이터 타입


기본 데이터 타입

기본적인 형태로 아래 있다.

var a: Boolean = true     // 논리 (true, false)
var b: Byte = 123         // 8 트 정수 (-128 ~ 127) 
var c: Short = 123        // 16비트 정수 (-32768 ~ 32767) 
var d: Int = 123          // 32비트 정수 (-2 31 ~ 2 31 -1) 
var e: Long = 123L        // 64비트 정수 (-2 63 ~ 2 63 -1) 
var f: Float = 12.3F      // 32비트 부동 소수점
var g: Double = 12.3      // 64비트 부동 소수점 
var h: Char = 'A'         // 문자 (글자 하나)
var i: String= "ABC"      // 문자열

부울 (Boolean)

부울은 true 또는 false 로 나타낸다.

var b1: Boolean = true 
var b2: Boolean = false

숫자(Byte, Short, Int, Long, Float, Double)

수자는 아래와 같이 지정한다. 8진수(0o)는 지원되지 않는다. 밑줄(_)은 무시된다.

123          10진수 (Int) 
123L         10진수 (Long) 
0x0F         16진수 
0b10111100   2진수 
123.4        실수 (Double) 
1.23e2       실수 (Double) 
123.4f       실수 (Float) 
1.23e2       실수 (Float) 
12_345_678   자리 구분

문자 (Char)

문자는 작은 따옴표로 묶는다.

'A'

아래의 이스케이프 시퀀스를 사용할 수 있다.

\t         // 탭 (TAB) 
\b         // 백 스페이스 (BS) 
\n         // 줄 바꿈 (LF) 
\r         // 복귀 (CR) 
\'         // 작은 따옴표 (') 
\"         // 큰 따옴표 (") 
\\         // 백 슬래시 (\) 
\$         // 달러 기호 ($) 
\uFF00     // Unicode 문자

문자열 (String)

문자열은 큰 따옴표 (")로 묶어야 한다. 위의 이스케이프 시퀀스도 사용할 수 있다.

"ABC"

문자열에서 $${...}를 이용함으로써 변수나 프로그램을 작성할 수 있다.

println("$a + $b = ${add(a, b)}")

"""..."""와 같이 따옴표 3개의 리터럴로 여러 줄의 문자열을 나타낼 수 있다. 줄바꿈 또는 백슬래시가 일반 문자로 취급된다.

println("""\ is a backslash""")
println("""This is Korea.
That is America.""")

Any형(Any)

Any 모든 유형을 나타낸다.

fun foo(arg: Any?) {
    when (arg) {
        is Int -> println("Int: $arg")
        is Char -> println("Char: $arg")
        is String -> println("String: $arg")
    }
}

형변환

아래와 같은 형변환을 할 수 있다.

123.toString()        // Int에서 String으로 변환 
"123".toInt()         // String을 Int로 변환 
"3.14".toInt()        // String을 Int로 변환 (변환 할 수 없는 경우는 null) 
1.23.toInt()          // Double에서 Int로 변환 (잘라 내기) 
1.23.roundToInt()     // Double에서 Int로 변환 (반올림)

레인지 (range)

..는 범위를 나타낸다. in은 왼쪽이 오른쪽에 표시된 범위의 범위 내에 있는지 여부를 판단한다.

for (i in 1..10) println(i)

1..101.rangeTo(10)와 같은 의미를 가진다.

for (i in 1..10) println(i)
for (i in 1.rangeTo(10)) println(i)

if 문이나 while 문에서 사용할 수 있다.

if (n in 1..10) println("OK")

범위내에 없는 것을 확인하려면 !in 을 사용한다.

if (n !in 1..10) println("Out of range.")

downTo은 감소하는 범위를 만든다. step은 입력한 만큼 증가하는 값을 지정할 수 있다.

for (i in 10 downTo 1 step 2) println(i)

Int형 외에 문자(Char), 문자열(String), 실수(Double) 등으로도 사용할 수 있다.

if ('b' in 'a'..'z') println("OK")
if ("gz" in "aa".."zz") println("OK")
if (1.23 in 0.00..9.99) println("OK")

RangeTutorial.kt

fun main(args: Array<String>) {
    println("==== if num1 in 4...8 ====")
    val num1 = 5
    if (num1 in 4..8) {
        println("$num1 in 4~8")
    }

    println("======= if num2 !in 4...8 =======")
    val num2 = 0;
    if (num2 !in 4..8) {
        println("$num2 not in 4~8")
    }

    println("========= for i in 1..7 =========")
    for (i in 1..7) {
        print("$i ")
    }
    println()

    println("====== for i in 1 until 7 ======")
    for (i in 1 until 7) {
        print("$i ")
    }
    println()

    println("====== for i in downTo 1 =======")
    for (i in 7 downTo 1) {
        print("$i ")
    }
    println()

    println("====== for i in 1..7 step 2 ======")
    for (i in 1..7 step 2) {
        print("$i ")
    }
}
==== if num1 in 4...8 ====
5 in 4~8
======= if num2 !in 4...8 =======
0 not in 4~8
========= for i in 1..7 =========
1 2 3 4 5 6 7 
====== for i in 1 until 7 ======
1 2 3 4 5 6 
====== for i in downTo 1 =======
7 6 5 4 3 2 1 
====== for i in 1..7 step 2 ======
1 3 5 7 

range는 숫자 범위이다. 예를 들어, 1..5는 1부터 5까지의 범위를 나타낸다. 조건문에서 in을 통해 range문을 사용하면 해당하는 범위에 어떤 숫자가 있는지 확인해 준다. if(number in 1..7) 이런 구문이 있으면 number의 값이 1에서 7까지의 사이에 있다면 true이다. in 앞에 느낌표(!)를 넣으면 반대 연산이 된다. 즉, if(number !in 1..7)는 number가 1에서 7까지의 사이에 아닐 경우에 true가 된다.

for문에 사용하면 숫자의 범위를 하니씩 가져올 수 있다.그 외에 ``until, downTo, step`등이 있다.

util1 until 7이면 1부터 7 전까지의 1~6 까지를 나타낸다.

downTo는 큰 수에서 작은 수로 갑소하는 연속된 값을 가져올 수 있다. 7..1 이런식으로 하면 오류가 발생한다. step은 입력한 만큼 증가하는 값을 지정할 수 있다.

데이터 타입 확인(is, !is)

is는 좌변이 우변의 데이터 타입이 일치하는 경우에 true이고, !is는 일치하지 않는 경우에 true이다. 서브 클래스의 인스턴스는 부모 클래스에 일치한다.

println("ABC" is String)	// true
println("ABC" !is String)	// false

open class ClassA() {}
class ClassB(): ClassA() {}
var a = ClassA()
var b = ClassB()
println(a is ClassA)		// true
println(a is ClassB)		// false
println(b is ClassA)		// true
println(b is ClassB)		// true

when을 이용하여 확인 할 수 있다.

fun foo(a: Any) {
    when (a) {
        is String -> println("String")
        is Char -> println("Char")
        else -> println("Unknown")
    }
}

데이터 타입의 별칭(typealias)

typealias를 사용하여 형식에 별칭을 붙일 수 있다.

typealias Meter = Int
typealias Killometer = Int

캐스트 (as, as?)

as는 형식을 캐스팅 할 때 사용한다. 다음 예제에서는 String형이 아닌 변수 aString으로 변환 (캐스트)하고 s에 대입하고 있다. 캐스트할 수 없는 경우에는 예외가 발생한다.

var s : String = a as String

as를 사용하여 수퍼 클래스를 서브 클래스로 캐스팅 할 수 있다.

open class ClassA(val name: String) {}
class ClassB(name: String): ClassA(name) {}
var obj1: ClassA = ClassB("Yamada")
var obj2: ClassB = obj1 as ClassB

캐스트 소스가 null 허용 형의 경우는 as 대신 as? 를 사용한다.

var n1: Short? = 123
var n2: Int? = n1 as? Int?

다이나믹 형(dynamic)

Kotlin는 기본적으로 정적 타입 언어이지만, JavaScript로 컴파일 할 때 dynamic을 사용하여 동적 타이핑을 할 수 있다.

var a : dynamic 
a = 123       // 수치를 대입 
a = "ABC"     // 문자열을 대입