관리 메뉴

너와 나의 스토리

[Kotlin] 코틀린의 원시 타입 본문

Programming Language/Kotlin

[Kotlin] 코틀린의 원시 타입

노는게제일좋아! 2021. 6. 18. 11:37
반응형

코틀린의 원시 타입

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

 

 

원시 타입: Int, Boolean 등

  • 자바는 원시 타입(primitive type)과 참조 타입(reference type)을 구분한다.
    • 원시 타입
      • 예: Int, Boolean 등
      • 원시 타입의 변수에는 그 값이 직접 들어간다.
    • 참조 타입
      • 예: String 등
      • 참조 타입의 변수에는 메모리상의 객체 위치가 들어간다.
    • 원시 타입의 값에 대해 메서드를 호출하거나 컬렉션에 원시 타입 값을 담을 수 없다. 
    • 자바는 참조 타입이 필요한 경우 특별한 래퍼 타입으로 원시 타입 값을 감싸서 사용한다.
      • 예: Int를 java.lang.Integer로 래핑
[Java]

// ArrayList<int> lists = new ArrayList<int>(); -> error
ArrayList<Integer> lists = new ArrayList<>();
  • 코틀린은 원시 타입과 래퍼 타입을 구분하지 않으므로 항상 같은 타입을 사용한다.
val list: List<Int> = listOf(1, 2, 3)
  • 그렇다면 코틀린은 항상 객체로만 표현하는 건가? 그렇다면 너무 비효율적이지 않을까?
    • 대부분의  경우 코틀린의 Int 타입은 자바의 int 타입으로 컴파일된다.
    • 이런 컴파일이 불가능한 경우는 컬렉션과 같은 제네릭 클래스를 사용하는 경우뿐이다. 
    • 예를 들어 Int 타입을 컬렉션의 타입 파라미터로 넘기면 그 컬렉션에는 Int의 래퍼 타입에 해당하는 java.lang.Integer 객체가 들어간다. 

 

 

숫자 변환

  • 코틀린과 자바의 가장 큰 차이점 중 하나는 숫자를 변환하는 방식이다. 
  • 코틀린은 한 타입의 숫자를 다른 타입의 숫자로 변환하지 않는다. 
val i = 1
// val l: Long = i <- error
  • 대신 직접 변환 메서드를 호출해야 한다.
val i = 1
val l: Long = i.toLong()
  • 코틀린은 모든 원시 타입(boolean 제외)에 대한 변환 함수를 제공한다.
    • 표현 범위가 넓은 타입으로도, 좁은 타입으로도 변환할 모든 함수 제공
val x =1
val list = listOf(1L, 2L, 3L)
//println(x in list) -> error
println(x.toLong() in list) // output: true
  • 숫자 리터럴을 타입이 알려진 변수에 대입하거나 함수에게 인자로 넘기면 컴파일러가 필요한 변환을 자동으로 넣어준다.
fun foo(l: Long) = println(l)

fun main(args: Array<String>) {
    val b: Byte = 1
    val l = b +3L
    println(l) // output: 4
    foo(43) // output: 43
}

 

 

Any: 최상위 타입

  • 자바에서 Obejct가 참조 타입에 대한 클래스 계층의 최상위 타입이듯 코틀린에서는 Any 타입이 모든 널이 될 수 없는 타입의 조상이다.
    • 코틀린에서는 Any가 Int 등의 원시 타입을 포함한 모든 타입의 조상이다.
    • Any는 null이 될 수 없는 타입이다.

 

 

Unit 타입: 코틀린의 void

  • 코틀린의 Unit 타입은 자바 void와 같은 기능을 한다. 
  •  코틀린의 Unit과 자바 void의 차이점
    • Unit은 모든 기능을 갖는 일반적인 타입이며, void와 달리 Unit을 타입 인자로 쓸 수 있다. 
      • Unit 타입의 함수는 Unit 값을 묵시적으로 반환한다. 
      • 이러한 특성은 제네릭 파라미터를 반환하는 함수를 오버라이드하면서 반환 타입으로 Unit을 쓸 때 유용하다.
interface Processor<T> {
    fun process(): T
}

class NoResultProcessor : Processor<Unit> {
    override fun process() {
        // return할 필요 없다.
    }
}

 

 

Nothing 타입

  • 코틀린에는 결코 성공적으로 값을 돌려주는 일이 없으므로 '리턴 값'이라는 개념 자체가 의미 없는 함수가 일부 존재한다.
    • 예: 테스트 라이브러리에서 fail 함수 제공, 무한 루프 도는 함수
  • 이렇게 정상적으로 끝나지 않는 함수의 경우를 표현하기 위해 코틀린에는 Nothing이라는 특별한 반환 타입이 있다.
fun fail(message: String): Nothing {
    throw IllegalArgumentException(message)
}
  • Nothing을 반환하는 함수를 엘비스 연산자(?:)의 우항에 사용해서 전제 조건(precondition)을 검사할 수 있다.
val address = company.address ?: fail("No address")

 

 

 

출처:

- [Kotlin IN ACTION]

 

 

반응형
Comments