기본 타입
Kotlin에서는 모든 것이 멤버 함수와 프로퍼티를 호출가능 한 객체이다.
숫자
Java와 비슷한 타입으로 숫자를 다루지만 완전히 같지는 않다
타입 | 비트 수 |
---|---|
Double | 64 |
Float | 32 |
Lon | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
리터럴 상수
- 10 진수 : 123, 123L
- 16 진수 : 0x0F
- 이진수 : 0b00001011
8 진수는 미지원
실수 표기
- 기본은 Double : 123.5, 123.5e10
- Float : 123.5f
숫자 리터럴의 밑줄 (1.1 이후)
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
표현
Java 플랫폼에서 숫자는 null 혹은 제네릭이 필요하지 않으면 primitive 타입으로 저장
숫자가 Boxing 되면 identity 는 유지되지 않는다
val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
equality 는 유지된다
val a: Int = 10000
print(a == a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // Prints 'true'
명시적 변환
표현이 다르므로 보다 작은 타입은 보다 큰 타입의 서브 타입이 아니다.
// 실제로 컴파일 되지 않음
val a: Int? = 1 // java.lang.Integer
val b: Long? = a // java.lang.Long 으로 자동 타입 변
print(a == b) // Long의 equals는 Long을 체크하므로 false
모든 숫자 타입은 다음의 변환을 지원
- toByte(): Byte
- toShort(): Short
- toInt(): Int
- toLong(): Long
- toFloat(): Float
- toDouble(): Double
- toChar(): Char
연산자
연산자 오버로딩 참조
문자
Char 타입으로 문자를 표현. 숫자로 직접 다루는 것은 불가능
fun check(c: Char) {
if (c == 1) { // ERROR: 호환되지 않는 타입
// ...
}
}
- 문자 리터럴은 단일 따옴표로 표시 '1'
- 특수 문자는 역슬래쉬를 이용
- 지원 이스케이프 : \t , \b , \n , \r , \' , \" , \ , $
- 다른 문자를 인코딩 하려면 유니코드 이스케이프 구문을 사용 '\uFF00'
명시적으로 문자를 숫자로 변환
fun decimalDigitValue(c: Char): Int {
if (c !in '0'..'9')
throw IllegalArgumentException("Out of range")
return c.toInt() - '0'.toInt() // Explicit conversions to numbers
}
Boolean
빌트인 연산자
- ||
- &&
- !
배열
Kotlin의 배열은 Array 클래스, get/set 함수 및 size 프로퍼티 및 다른 유용한 멤버 함수를 가짐 (get/set 함수는 연산자 오버로딩 규칙에 따라 [] 로 변경)
class Array<T> private constructor() {
val size: Int
operator fun get(index: Int): T
operator fun set(index: Int, value: T): Unit
operator fun iterator(): Iterator<T>
// ...
}
- arrayOf() 를 이용하여 배열을 작성
- arrayOf(1, 2, 3) => 배열 [1, 2, 3]
- arrayOfNulls() 리터럴 함수는 지정한 크기를 null 값으로 채워진 배열을 작성
배열 사이즈와 각 인덱스에 대해 초기값을 반환하는 팩토리 함수를 사용
// Creates an Array<String> with values ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })
주의 : Java와 다르게 Kotlin의 배열은 불변이다.
Boxing 오버헤드 없이 primitive 타입의 배열을 나타ㅐ는 특수 클래스도 존재
ByteArray, ShortArray, IntArray 등
Array 클래스와 상속관계를 가지지않지만 메소드와 프로퍼티는 동일
각 클래스를 위한 팩토리 함수 존재
문자열
문자열 타입은 String이며 불변이다. 문자열 요소는 문자이며 인덱스 연산을 이용해서 접근 가능하다.
문자열 리터럴
2 종류의 문자열 리터럴이 존재
- 이스케이프 문자열 : 이스케이프 문자를 포함 가능
- 기존 방법처럼 백슬래시를 이용.
- raw 문자열 : 개행과 임의 문자를 포함 가능
- 3개 따옴표로 구분 ("""). 이스케이프외 문자를 포함 가능
val text = """
for (c in "foo")
print(c)
"""
trimMargin() 함수로 선두의 공백을 제거도 가능
val text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()
디폴트는 | 문자를 사용하며, 다른 문자를 선택하는 것도 가능 trimMargin(">")
문자열 템플릿
문자열은 템플릿 표현식을 포함 가능. 평가된 결과가 문자열로 결합되어 코드를 포함할 수 있다. 템플릿식은 달러 기호($)로 시작하고 단순한 이름으로 구성된다.
val i = 10
val s = "i = $i" // 결과는 "i = 10"
val s = "abc"
val str = "$s.length is ${s.length}" // 결과는 "abc.length is 3"
raw 문자열에 $ 문자를 표시할 경우 다음 구문을 사용
val price = """
${'$'}9.99
"""