본문

170607(수) - Kotlin docs (Basic Types)

Kotlin docs


Basic Types


Numbers

- Java와 완전히 같지는 않다.

- 숫자에 대한 implicit 한 widening conversions가 없음

- literals 도 약간 다름

- characters는 코틀린의 numbers가 아님


TypeBit width
Double64
Float32
Long64
Int32
Short16
Byte8


Literal Constants

- Decimals : 123

- Long : 123L

- Hexadecimals : 0x0F

- Binaries : 0b0001011

- Octal 는 지원하지 않음

- floating-point numbers 지원

- Doubles가 기본 : 123.5e10

- Floats는 f or F : 123.5f



Underscores in numeric literals

- 밑줄을 사용하면 literals를 좀 더 쉽게 읽을 수 있다.


val oneMillion = 1_000_000

val creditCardNumber = 1234_5678_9012_3456L

val socialSecurityNumber = 999_99_9999L



Representation

- 숫자는 nullable number 또는 generics가 아니면 JVM에 primitive type으로 저장된다.


- 숫자의 boxing이 반드시 identity를 보장하지는 않는다.

val a: Int = 10000

print(a === a)     // print true

val boxedA: Int? = a

val anotherBoxedA: Int? = a

print(boxedA === anotherBoxedA)         // print false


- equality는 유지

val a: Int = 10000

print(a == a)        // print true

val boxedA: Int? = a

val anotherBoxedA: Int? = a

print(boxedA == anotherBoxedA)        // print true



Explicit Conversions

- smaller type은 bigger의 subtypes가 아니다

val a: Int? = 1

val b: Long? = a

print(a == b)        // false


- explicit conversion 없이 Byte type을 Int type으로 형변환 할 수 없다.

val b: Byte = 1

val i: Int = b        // Error occur


- explicit conversions

val i: Int = b.toInt()


- conversions

toByte() : Byte

toShort() : Short

toInt() : Int

toLong() : Long

toFloat() : Float

toDouble() : Double

toChar() : Char


- Absence of implicit conversions 는 거의 없다고 보면 된다.

val l = 1L + 3        // Long + Int => Long



Operations

- bitwise operations

val x = (1 shl 2) and 0x000FF000


- shl : signed shift left (<<)

- shr : signed shift right (>>)

- ushr : unsigned shift right (>>>)

- and : bitwise and

- or : bitwise or

- xor : bitwise xor

- inv : bitwise inversion



Characters

fun check(c: Char) {

if (c == 1) {    // Error

...

}

}


- \t, \b, \n, \r, \', \", \\, \$

- '1' single quotes 형식으로 표시

- '\uFF00'


- Explicit conversions to numbers

fun decimalToDigitValue(c: Char) : Int {

if (c !in '0'..'9') {

throw IllegalArgumentException("out of range")

}


return c.toInt() - '0'.toInt()    // Explicit conversions to numbers

}



Booleans

- || : lazy disjunction

- && : lazy confunction

- ! : negation



Array

- Array class

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) : array[1, 2, 3]


- arrayOfNulls()

null로 채워진 array 반환


- Creates an Array<String> with values ["0", "1", "4", "9", "16"]

val asc = Array(5, { i -> (i * i).toString() })


- [] 는 get() 과 set()의 호출을 의미한다.


- Java와는 다르게 invariant 하다.

Array<Any>를 할당하지 못하게 하여 runtime failure를 방지한다.

대신에 Array<out Any>를 사용 가능


- Boxing overhead 없이 primitive type의 array를 제공

- ByteArray

- ShortArray

- IntArray


- Array class의 inheritance 없이 동일한 method 사용 가능

- factory function도 사용 가능

val x: IntArray = intArrayOf(1, 2, 3)

x[0] = x[1] + x[2]



Strings

- String elements는 indexing operation에서 접근 가능하다.

s[i]


- for-loop로 접근 가능

for (c in str) {

println(c)

}


- escaped strings

val s = "Hello, world!\n"


- raw strings

- arbitrary text와 newlines text를 포함할 수 있는 strings

- """(triple quote)로 구분

- escape가 없고 기타 문자를 포함 가능

val text = """

for (c in "foo") {

print(c)

}

"""


- trimMargin() 을 사용해서 leading whitespace 제거 가능

| 이 기본적으로 margin prefix로 사용되지만 다른 문자인 trimMargine(">")로 전달 가능

val text = """

|Tell me and I forget.

|Teach me and I remember.

|Involve me and I learn.

|(Benjamin Franklin)

""".trimMargine()



String Templates

val i = 10

val s = "i = $i"


val s = "abc"

val str = "$s.length is ${s.length}        // "abc.length is 3"


- raw strings와 escaped strings 모두 지원


- (ex) $ 표시

- raw strings에서 backslash escaping은 지원되지 않는다.

val price = """

${'$'}9.99        // {'$'} 여기 안에 있는 문자를 표시하는 듯. 근데 그냥 $9.99 해도 똑같이 expression 되는데?

"""


공유

댓글