기본 타입

2018, Jun 09    

이 글은 코틀린 공식 홈페이지를 보고 발번역한 내용입니다.
Kotlin Refrence 링크

코틀린에서는 모든 변수는 객체이다. 따라서 java의 Integer와 같은 wrapper 객체가 존재하지 않는다. 런타임시에 primitive 변수로 처리 되는 몇개의 타입들이 있는데, 다음과 같은 타입들이다. numbers, characters, booleans, arrays, strings


Numbers

JAVA와 아주 비슷하게 numbers를 다루는데 다른점은,

  • 크기가 큰 타입으로의 암시적인 타입변환이 없다.(명시적으로 타입 변환을 해주어야 한다.)
  • 몇몇의 경우에 literals(변수값)할당시 약간 다른점이 있다.

숫자형 타입들
typesOfNumbers

숫자 리터럴안에 underline을 이용하여 좀더 알아보기 쉽게 표현할 수 있다.


  val oneMillion = 1_000_000
  val creditCardNumber = 1234_5678_9012_3456L
  val socialSecurityNumber = 999_99_9999L

  println(oneMillion)
  println(creditCardNumber)
  println(socialSecurityNumber)

//********* 출력결과
  1000000
  1234567890123456
  999999999    
  • 명시적 타입 변환

    코틀린에서는 크기가 작은 타입이 크기가 큰 타입으로 자동(암묵적인)변환되지 않는다.
    (나와 같은 경우 공식문서의 예와는 다르게 print 결과가 나오기 전에 syntax오류 발생하였다.)


    val a: Int? = 1
    val b: Long? = a //intellij에서 해보니 이 부분에서 syntax오류가 발생
    print(b == a)

    val b: Byte = 1
    val i: Int = b //Error

다음과 같이 크기가 큰 타입을 명시적으로 변환할수 있다.


  val i: Int = b.toInt()

모든 number type은 다음과 같은 형변환 처리 함수를 제공한다.


//Primitives.kt안의 코드에서 발췌
    public override fun toByte(): Byte
    public override fun toChar(): Char
    public override fun toShort(): Short
    public override fun toInt(): Int
    public override fun toLong(): Long
    pub      
     override fun toFloat(): Float
    public override fun toDouble(): Double
비교연산
  • sh1(bits) : java에서의 <<
  • shr(bits) : java에서의 >>
  • ushr(bits) : java에서의 >>>
  • and(bits) : bitwise and
  • or(bits) : bitwise or
  • xor(bits) : bitwise xor
  • inv() : bitwise inversion
소수점숫자들의 비교
  • equality Check : a == b, a != b
  • 비교연산자들 : a < b, a > b, a <= b, a >= b
  • 범위설정 표현과 범위 체크 : a..b, x in a..b, x !in a..b

Characters

문자열들은 Char으로 표현된다. Char 타입의 변수들은 숫자로 바로 대치 될 수 없다. (위에서 언급한 ‘명시적인 타입변환’특징의 하나인 것 같다.)


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

Char 변수는 single quotes(‘)로 표현한다: '1'
특수문자들은 백슬러시를 이용하면 single auotes사용없이 표현 가능하다. \t, \b, \n, \r, \' \"t", \\, $

역시 명시적인 형변화를 통해 문자열을 Int형으로 변환 가능하다.


val c:Char = 'A'
val n:Int = c.toInt() - '0'.toInt() //Explicit conversions to numbers

Booleans

true나 false 둘 중 하나의 값을 가지는 타입, java와 별반 다를게 없다.


Arrays

  • Arrays class로 존재한다.  get, set 함수, size 프로퍼티를 가지고 있습니다. (refer링크)
  • 배열을 생성하는 방법은 아래와 같습니다.
    1) 표준 라이브러리 함수를 사용 - arrayOf(), arrayOfNulls(), emptyArray()
    2) Array Contructor 사용 - controctor는 배열size와 초기화할 element를 만드는 람다식을 파라미터로 받는 형식.
val t:Array<Int> = arrayOf(1,2,3) // [1,2,3]
val s: Array<Int?> = arrayOfNulls(3) //size: 3, null로 이루어진 array 생성

//빈 Array선언
val a: Array<String> = emptyArray();

//size : 5, (i*i)값으로 이루어진 Array<String>생성 ["0", "1", "4", "9", "16"]
val asc = Array(5, {i->(i*i).toString()})

//Any타입으로 선언하면 여러 타입의 element을 가질수 있네요.
val c:Array<Any> = arrayOf("1",2,3.3)
  • 코틀린은 자바와 같은 자동 boxing 처리 없이 각 원시타입을 위한 특화된 클래스가 존재합니다.
    ByteArray, ShortArray, IntArray 등등..
    일반 배열과 마찬가지로, 원시타입을 위한 배열을 생성하는 함수 또한 표준 라이브러리에 포함 되어 있습니다.
val intArr : IntArray = IntArray(1,2,3,4,5)
  • 한가지 알아둘 점은 자바와 달리 코틀린에서 배열은 타입의 변환을 허용하지 않는다는 점입니다.(Arrays are invariant) 즉 Array< String > 타입의 변수를 Array< Any >타입으로 배당할수 없습니다.  예를 들어 java에서는 다음과 같은 코드가 허용 되지만,
Number[] numbers = new Number[1];
Object[] objects = numbers;
objects[0] = "hello";

다음과 같이 코틀린에서는 Array< Int > ->Array< Any >로의 할당이 불가능합니다.

fun copy(from: Array<Any>, to: Array<Any>) {
    assert(from.size == to.size)
    for(i in from.indices)
        to[i] = from[i]
}

val ints: Array<Int> = arrayOf(1,2,3)
    val any = Array<Any>(3){ "" }
    copy(ints, any) //오류 발생

Strings

java와 같이 코틀린에서도 String은 불변객체입니다.(immutable) string의 각 요소는 characters로 이루어져 있으며 indexing operation을 통해 접근 가능합니다. : s[i]


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

코틀린에서 triple quote( """ )를 사용하면 개행문자( \n )를 쓰지 않고도 줄바꿈이나 공백등 어떤 문자든 자유롭게 표현 할 수 있습니다.


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

또한 각줄의 시작을 구분하는 문자(default |)로 채운 후 trimMargin()을 이용하여 앞의 공백의 제거 할 수 있습니다.


val text = """
    |Tell me and I forget.
    |Teach me and I remember.
    |Involve me and I learn.
    |(Benjamin Franklin)
    """.trimMargin()

공백 구분값으로 사용되는 문자 |는 default입니다. 다른 문자를 사용할 경우 함수에 해당 구분문자를 파라미터로 넘겨주어 사용 가능합니다. trimmargin(">")

문자열 템플릿 문자열 템플릿을 이용하여 문자내 일부 단어를 다른 값으로 치환할 수 있습니다.


val i = 10
println("i = $i") //prints "i = 10"

val s = "abc"
println("$s.length is ${s.length}") //prints "abc.length is 3"