프로그래밍 노트/Kotlin

[Kotlin] 코틀린 데이터 타입

깡냉쓰 2023. 3. 27. 10:20
728x90
반응형

코틀린은 원시 타입/래퍼 타입을 구분하지 않는다.

  • Int, Boolean 등등
  • 코틀린은 자바와 달리 원시타입과 래퍼타입이 따로 존재하지 않는다.
var list: List<Int> = listOf(1, 2, 3)
  • 코틀린에서 모든 타입이 참조 타입으로 표현되는 것이 아니라, 실행 시점에 가능한 가장 효율적인 방식으로 타입이 표현된다.
    • 대부분의 경우 코틀린의 Int타입은 자바 int 타입으로 컴파일 된다.
    • 컴파일이 불가능한 경우(제네릭 클래스)만 래퍼 타입(Integer)로 컴파일되게 된다.
    • Int를 컬렉션의 타입 파라미터로 넘길 때, Integer객체가 들어가게 된다.

널이 될 수 있는 타입

  • Int?, Boolean?
  • 코틀린에서 널이 될 수 있는 원시 타입을 사용하면, 자바의 래퍼 타입으로 컴파일 된다.
    • 자바의 래퍼 타입은 null이 될 수 있음으로, 코틀린에서의 널이 될 수 있는 타입은 자바의 래퍼타입과 같다.

코틀린은 모든 원시 타입에 대한 변환 함수를 제공한다.(숫자 타입 변환)

  • 코틀린은 자바와 달리 한 타입의 숫자를 다른 타입의 숫자로 자동 형 변환이 되지 않는다.
  • 결과 타입이 허용하는 숫자의 범위가 원래 타입보다 넓어도 자동 변환이 불가능하다.
  • 모든 원시 타입에 대한 변환 함수를 제공
val i = 1
val l: Long = i (x, Error: type mismatch)
val l: Long = i.toLong() (o)

코틀린의 특별한 타입

  • Any, Any?: 최상위 타입
    • 자바의 Object와 마찬가지로 코틀린에서는 Any타입이 널이 될 수 없는 타입의 조상 타입이다.
  • Unit: 코틀린의 void
    • 자바의 void와 같음
    • Unit은 void와 달리 타입 인자로 사용할 수 있다.
interface Processor<T> {
  fun process(): T
}

class NoResultProcessor : Processor<Unit> {
  override fun process() {
    // return을 명시할 필요가 없다. 컴파일러가 묵시적으로 return Unit을 넣어줌
  }
}
  • Nothing
    • 함수가 정상적으로 끝나지 않는다는 뜻으로 Noting이라는 특별한 반환타입이 존재
fun fail(message: String): Nothing {
  throw IllegalStateException(message)
}

널 가능성과 컬렉션

  • List<Int?>
    • 리스트 자체는 항상 널이 아니다.
    • 각 원소는 널이 될 수 있다.
  • List<Int>?
    • 리스트를 가리키는 변수에는 널이 들어갈 수 있음
    • 리스트 안에는 널이 아닌 값만 들어간다.

코틀린에서 읽기 전용/변경 가능한 컬렉션

  • 코틀린에서는 컬렉션 안의 데이터에 접근하는 인터페이스컬렉션 안의 데이터를 변경하는 인터페이스를 분리했다.
    • kotlin.collections.Collection
      • 데이터를 읽는 연산만 존재
      • listOf, setOf, mapOf
    • kotlin.collections.MutableCollection (Collection 인터페이스 확장)
      • 원소 추가, 삭제 등 메서드를 더 제공
      • 원본의 변경을 막기 위해 컬렉션을 복사해서 사용하는 것을 권장
      • mutableListOf, arrayListOf, mutableSetOf, hashSetOf, hashMapOf

        객체의 배열과 원시 타입의 배열

  • Array<Int> -> java.lang.Integer[] (toIntArray를 사용하면 박싱하지 않은 값들 반환)
  • 원시 타입 배열은 IntArray, ByteArray, CharArray를 사용해야 함
val fiveZeros = IntArray(5)
val fiveZerosToo = intArrayOf(0, 0, 0, 0, 0)
val squares = IntArray(5) { i -> (i+1) * (i+1) }
728x90
반응형