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..10
는 1.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`등이 있다.
util
은 1 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
형이 아닌 변수 a
를 String
으로 변환 (캐스트)하고 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" // 문자열을 대입