3. 기본 타입 - Basic Types
목차.
1. 기본타입
코틀린에서 모든 것은 객체임.
모든 것에 멤버 함수나 프로터피를 호출 가능하다는 의미에서...
(자바에서는 프리미티브타입과 레퍼런스타입이 분리됨)
2. 숫자
- Java의 숫자형과 거의 비슷하게 처리.
코틀린 = Number클래스
Java = primitive Type에 직접 접근 할 수 없음.
3. 리터럴 (Literal)
10진수 : 123 (int, Short)
Long : 123L
Double : 123.5, 123.5e10
Float : 123.5f
2진수 : 0b00001111
8진수 : 지원 안됨.
16진수 : 0X0F
4. Underscores in Numeric literals (since 1.1)
글자를 보기 쉽게하기 위한 표현.
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9999_0000L
이렇게 언더스코어 ‘_’ 를 붙여도 숫자로 인식한다.
소스상에서 단위를 알아보기 쉽다는 장점이 있다.
5. Representation
- 코틀린을 Java플랫폼에서 숫자형은 JVM에서 primitive type으로 저장된다.
- Nullable이나, 제네릭의 경우 박싱된다. 박싱된 경우 idendtity를 유지 하지 않음.
//코틀린을 Java플랫폼에서 숫자형은 JVM에서 primitive type으로 저장된다.
var a: Int = 10000
var b: Int = 10000
println("${a === b}")
println("${a == b}")
//결과는 모두 true
위의 소스를 Java로 디컴파일하게 되면, Int 형이 int형인 프리미티브 타입으로 변해있는 것을 알 수 있다.
// Nullable이나, 제네릭의 경우 박싱된다. 박싱된 경우 idendtity를 유지 하지 않음.
// b를 Nullable ? 를 추가함.
var a: Int = 10000
var b: Int? = 10000
println("${a === b}") // false
println("${a == b}") // true
위으 소스의 b는 Object 타입인, Intager 로 변경된 것을 볼 수 있다.
때문에 비교할때 false가 나올 수 있다.
6. Explicit Conversions
작은 타입은 큰타입에 대입 할 수 없음
val a: Int = 1
val b: Long = a // 오류
val b: Long = a.toLong() // 명시적으로 변환 하여 주어야 함.
//비교도 오류가 남
println( a == b ) //오류.
수치형 타입들은 모두 변환 함수를 써서 변환해주면 된다.
7. 배열
7-1. 배열 특징
- 배열은 Array 클래스로 표현됨
- get, set ([] 연산자 오버로딩됨)
- size 등 유용한 멤버 함수 포함
var array: Array<String> = arrayOf("one", "two")
println(array.get(0))
println(array[0])
println(array.size)
7-2. 배열 생성
- Array의 팩토리 함수를 이용
- arrayOf() 등의 라이브러리 함수 이용
val a = Array(5, { i -> i.toString() }) // Array 팩토리함수 사용
val b = arrayOf("one","two","three") //arrayOf 라이브러리함수 사용
7-3. 특별한 Array 클래스 (Primitive 오버헤드 없애는 배열)
- Primitive 타입의 박싱 오버헤드를 없애기 위한 배열
- IntArray, ShortArray ... 등
- Array를 상속한 클래스는 아니지만, Array와 같은 메소드와 프로퍼티를 가진다.
- size 등 유용한 멤버 함수 포함
val a: IntArray = intArrayOf(1,2,3)
a[0] = 999
println(a.get(0))
println(a[0])
println(a.size)
Null이 필요없는 숫자같은 경우에는 Primitive 타입의 배열을 사용한다.
8. 문자열
- 문자열은 String 클래스로 표현
- String은 characters로 구성됨
- s[i]와 같은 방식으로 접근 가능 (immutable이므로 변경 불가)
var s: String = "one"
println(s.get(0))
println(s[0])
println(s.length)
for (c in s) {
println(c)
}
자바랑 아주 비슷
9. 문자열 리터럴
- escaped string
자바와 비슷하다.
백슬러쉬(\n)등으로 escaping처리한다
val s = "Hello, \n world"
- raw string
escaping 처리 하지 않고 따움표를 붙인다. ( 앞뒤로 쌍따움표 3개씩 )
val s = """ 헬로우, 월~~~ 드 ^^. ! """