책정리/Kotlin in Action

[Kotlin in Action] 코틀린의 원시 타입, Any, Unit, Nothing 타입

뽀글보리 2021. 10. 21. 20:00
반응형

6.2 코틀린의 원시 타입

  • 코틀린에서는 널이 될 수 있는지 여부를 타입 시스템에 추가함으로써 컴파일러가 컴파일 시 미리 감지하여 발생할 수 있는 예외의 가능성을 줄일 수 있다.

6.2.1 원시 타입: Int, Boolean 등

  • Java에서 원시 타입과 참조 타입의 차이 : 변수가 직접 들어가는 지 / 메모리상의 객체 위치가 들어가는 지
  • Integer는 래퍼 타입으로 메소드 등을 호출할 수 있다.
  • Kotlin에서는 구분이 없고, 원시 타입에 대해 메소드를 호출할 수 있다.
  • 대부분의 경우 자바 int 타입으로 컴파일 된다.
  • 불가능할 경우 (컬렉션 사용 등) Integer 래퍼 타입으로 객체가 들어간다.

6.2.2 널이 될 수 있는 원시 타입: Int?, Boolean? 등

  • 자바의 래퍼 타입으로 컴파일된다.
  • 제네릭 클래스의 경우 래퍼타입을 사용한다.
val listOfInts = listOf(1, 2, 3)
  • 이는 JVM에서 제네릭을 구현하는 방법 때문 : 원시 타입을 허용하지 않는다.

6.2.3 숫자 변환

  • 숫자 자동 변환 불가
val i = 1 val l: Long = i.toLong()
  • 타입이 다르면 equals 메서드는 false다.
val x = 1 println(x in listOf(1L, 2L, 3L)) // false
  • 메서드 인자로 넘겨줄 때는 자동으로 타입변환 해준다.
fun foo(l: Long) = println(l)
foo(42) // 42를 Long으로 해석
val b: Byte = 1 
val l = b + 1L // l 은 Long type

6.2.4 Any, Any?: 최상위 타입

  • Any는 모든 널이 될 수 없는 타입의 조상 타입 (원시 타입 포함) → 자바 바이트 코드의 Object로 컴파일된다.

6.2.5 Unit 타입: 코틀린의 void

  • 반환하지 않는 함수
fun f(): Unit {...}
fun f() { // return Unit by Kotlin compiler }
  • 이는 제네릭을 사용할 때 유리하다.
interface Processor<T> { fun process(): T } 
class NoResultProcessor : Processor<Unit> { 
	override fun process() { } 
}

6.2.6 Nothing 타입: 이 함수는 결코 정상적으로 끝나지 않는다

  • 반한 값이라는 개념 자체라 의미 없는 함수에서 사용된다.
fun fail(message: String): Nothing { 
	throw IllegalStateException(message) 
} 

val address = company.address ?: fail("No Address")
  • 결코 정상 종료되지 않는다.
반응형