기본자료형

Numbers

자바랑 비슷하지만 똑같지는 않다. 예를 들면 암시적 형변환은 제공하지 않는다.

var mInt = 0
 var mLong = 0L
//mLong = mInt (확장시키는 암시적 형변환은 불가능)
mLong = mInt.toLong()

자료형 : 비트 사이즈
Double : 64
Float : 32
Long : 64
Int : 32
Short : 16
Byte : 8
코틀린에서는 문자(charater)는 숫자가 아니다.

리터럴 상수

 
정수 : 123
Long 타입 정수 : 123L
16진수 : 0x0F
2진수 : 0b00001011
Note : 8진수는 지원하지 않음
 
부동소수점도 지원한다
Double의 경우 : 123.5, 123.5e10
Float의 경우 : 123.5f , 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

 
표현
자바에서는  숫자는 물리적으로 JVM 원시자료형에 저장됩니다.
우리가 nullable한 숫자를 참조를 필요한다거나 제너릭이 이 포함된 숫자를 필요로 하지 않는 이상말이죠. 후자의 경우는 숫자는 박싱됩니다.

박싱 값형식 -> 참조형식 = 박싱 스택에서 힙으로 데이터가 복사 암시적으로 변환 가능

언박싱 참조형식 -> 값형식 = 언박싱 힙에서 스택으로 데이터가 복사 명시적으로 변환 가능

박싱된숫자는 identity 보존을 하지 않습니다.
객체(포인터)가 다릅니다.

val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!

값은 동일합니다.

val a: Int = 10000
print(a == a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // Prints 'true'

명시적 형변환

코틀린에서는 작은 자료형이 큰 자료형으로 속할 수 없다. 자바에서는 int to long 은 가능하지만 Int to Long이 안되는것과 마찬가지. 다음도 문제들을 보자

// 실제로 컴파일되지 않는 코드
val a: Int? = 1 // 박싱된 Int (java.lang.Integer)
val b: Long? = a // 박싱된 Long으로 암시적 형변환 하기(java.lang.Long)
print(a == b) // false 출력

주소값뿐만 아니라 값비교에서도 문제가 생긴다
그에따른 결과로 작은 자료형은 큰자료형으로 암시적 형변환이 안된다. 이것은 명시적 변환 없이는 Byte값을 Int값으로 변환하는게 불가능하다는 뜻이다.

val b: Byte = 1 // OK, literals are checked statically
val i: Int = b // ERROR

명시적 형변환을 통해 숫자 자료형을 크게 만들 수 있다.

val i: Int = b.toInt()

모든 숫자형은 다음 형변환을 제공한다

  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char

자료형이 문맥에서 유추되고 적절한 연산을 위해 산술 연산이 오버로드 되기 때문에 암시적 형변환의 부재는 거의 눈에 띄지 않습니다.

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

연산자

코틀린은 기본적인 산술 연산자를 제공합니다.
see Operator overloading
비트 연산과 관련하여 특수 문자는 없지만 중위 형태(infix form)로 호출 할 수있는 명명 된 함수입니다 예를들면

val x = (1 shl 2) and 0x000FF000

비트연산자 Int와 Long만 사용가능

  • shl(bits) – signed shift left(자바의 <<)
  • shr(bits) – signed shift right(자바의 >>)
  • ushr(bits) – unsigned shift right(자바의 >>>)
  • and(bits) – and
  • or(bits) – or
  • xor(bits) – xor
  • inv() – 비트 뒤집기

부동소수점 비교

부동소수 비교 연산은 다음과 같다

  • 동등한 값 비교 : a == b , a != b
  • 크기 비교 : a < b, a> b, a <=b, a >= b
  • 범위 비교 : a..b,  x in a..b, x !in a..b

Characters

문자는 Char로 표현되며, 숫자형으로 다루어 지지 않습니다.

fun check(c: Char) {
 if (c == 1) { // ERROR: incompatible types
 // ...
 }
}

문자열 상수는 홀따옴표로 표현됩니다. 특수 문자의 경우 백슬래쉬로 표현합니다.

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

다른 문자를 인코딩 하기 위해서는 유니코드의 이스케이프 시퀀스 문법을 사용합니다.

'\uFF00'

문자는 명시적으로 Int타입으로 변환 가능합니다.

fun decimalDigitValue(c: Char): Int {
 if (c !in '0'..'9')
 throw IllegalArgumentException("Out of range")
 return c.toInt() - '0'.toInt() // Explicit conversions to numbers
}

숫자와 유사하게 문자 역시 nullable 참조가 필요한 경우 박싱됩니다. 박싱후 주소값은 보존되지않습니다.

Booleans

true 와 false 값만 가집니다.
null이 필요한경우 Boolean으로 박싱합니다
다음과 같은 연산자를 가집니다

  • ||
  • &&
  • !

Arrays

코틀린에서의 배열은 Arra로 표현됩니다. get, set, size메소드를 가지고 있고, []를 통해 아이템에 접근할 수 있습니다. 다음은 몇가지 유용한 멤버 함수 입니다.

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로 채워진 배열을 생성할 수도 있습니다.
또다른 방법으로는 배열의 크기와 초기값을 리턴하는 함수를 인자로 받는 Factory함수를 이용하는 것입니다.

// Creates an Array<String> with values ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })

위에 언급한것처럼 [] 연산자를 이용해 get, set을 대신할 수 있습니다.
Note:자바와는 달리 코틀린에서 배열은 불변입니다. 이것은 런타임에 발생할 수 있는 오류를 방지하기 위해서 Array<Any>에 Array<String>을 할당할 수 없다는것을 의미합니다. 하지만 Array<out Any>는 가능합니다.
코틀린은 배열에 특화된 원시타입의 배열클래스도 박싱오버헤드 없이 제공합니다.
ByteARray, ShortArray, IntArray 기타 등등
이런 클레스들은 Array와 상속 관계 없지만 메소드나 프로퍼티는 같습니다. 이들 각각에 상응하는 내장 함수 또한 가지고 있습니다.

val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]

Strings

문자열은 String으로 표현됩니다. 문자열은 불변하며. 문자열의 구성요소들은 인덱스 접근 가능한 문자(character)이다. s[i]
문자열은 for문에 의해 반복적으로 접근 가능하다.

for (c in str) {
 println(c)
}

 

String Literals

코틀린은 string literal의 두가지 타입이 있다.
escaped-string: escaped 문자를 갖는 문자열

val s = "Hello, world!\n"

raw-string: 뉴라인을 포함할수 있는 임의 텍스트

val text = """
 for (c in "foo")
 print(c)
"""

 

String Templates

문자열은 템플릿표현을 포함한다. 템플릿표현은 달러 표시와 함께 시작된다.

val i = 10
val s = "i = $i" // evaluates to "i = 10"

또는 중괄호 안에서 임의적인 표현이 가능하다

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

템플릿은 두가지 타입의 문자열에서 모두 지원하며 만약 달러 표시를 리터럴하게 raw-string에서 표현하고 싶다면 이렇게 쓰면된다.

val price = """
${'$'}9.99
"""
카테고리: Kotlin

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.