Programming/Kotlin

코틀린(Kotlin) - 코틀린의 원시 타입

JunsuKim 2021. 10. 21.
728x90

코틀린에서는 자바와 달리 원시 타입과 래퍼 타입을 구분하지 않는다.

* 원시 타입 : 원시 타입의 변수에는 값이 직접 들어간다.

* 참조 타입(reference type): 참조 타입의 변수에는 메모리 상의 객체 위치가 들어간다.

원시 타입

원시 타입은 참조 타입보다 값을 더 효율적으로 저장하고 이곳저곳으로 전달할 수 있다.

하지만 이 값에 대해 메소드를 호출하거나 컬렉션에 원시 타입 값을 담을 수는 없다.

자바에서는 참조 타입이 필요한 경우 특별한 래퍼 타입으로 원시 타입 값을 감싸 사용한다.

이 때문에 정수의 컬렉션을 정의하려면 Collection<int>가 아닌 Collection<Integer>를 사용해야 한다.

 

코틀린은 원시 타입과 참조 타입을 구분하지 않으므로 항상 같은 타입을 사용한다.

val i: Int = 1
val list: List<Int> = listOf(1, 2, 3)

원시 타입과 참조 타입이 같다면 코틀린이 항상 객체로 표현을 할까?

그렇다면 너무 비효울적일 것이다. 하지만 코틀린에서는 이렇지 않다.

실행 시점에 숫자 타입은 가능한 한 가장 효율적인 방식으로 표현된다.

대부분의 경우 코틀린의 Int 타입은 자바 int 타입으로 컴파일되고, 이런 컴파일이 불가능한 경우는 컬렉션과 제네릭 클래스를 사용하는 경우뿐이다.

 

자바 원시 타입에 해당하는 타입은 다음과 같다.

  • 정수 타입: Byte, Short, Int, Long
  • 부동소수점 수 타입: Float, Double
  • 문자 타입: Char
  • 불리언 타입: Boolean

널 참조가 들어갈 수 없는 코틀린 타입을 사용하면 그에 상응하는 자바 원시 타입으로 컴파일할 수 있으며,

반대로 자바 원시 타입의 값은 널이 될 수 없으므로 코틀린에서 사용할 때도 널이 될 수 없는 타입으로 취급할 수 있다.

코틀린에서 널이 될 수 있는 원시 타입을 사용하면 자바의 래퍼 타입으로 컴파일된다.

숫자 변환

코틀린과 자바의 가장 큰 차이점 중 하나는 숫자를 변환하는 방식에 있다.

코틀린은 한 타입의 숫자를 다른 타입의 숫자로 변환하지 않는데, 결과 타입이 허용하는 숫자의 범위가 원래 타입의 범위보다 넓은 경우에도 자동 변환이 불가능하다.

타입의 변환을 하기 위해서는 직접 변환 메소드를 호출해야 한다.

val i = 1
val l: Long = i

컴파일 에러 발생
val i = 1
val l: Long = i.toLong()

코틀린에서는 Boolean을 제외한 모든 원시 타입에 대한 변환 함수를 제공한다.

동시에 여러 숫자 타입을 사용하려면 각 변수를 명시적으로 변환해야 한다.

숫자 리터럴을 사용할 때는 보통 변환 함수를 호출할 필요가 없는데, 이는 직접 변환을 하지 않아도 숫자 리터럴을

타입이 알려준 변수에 대입하고나 함수에게 인자로 전달할 때 컴파일러가 필요한 변환을 자동으로 해준다.

최상위 타입 Any, Any?

코틀린에서 Any 타입은 모든 널이 될 수 없는 타입의 조상(최상위) 타입이다.

val answer: Any = 42

Any는 널이 될 수 없는 타입이다.

따라서 Any 타입의 변수에도 null이 들어갈 수 없다.

널을 포함한 모든 값을 대입할 변수를 선언하려면 Any? 타입을 사용하면 된다.

Unit 타입

코틀린에서의 Unit 타입은 자바의 void와 같은 기능을 한다.

반환을 하지 않는 함수의 반환 타입으로 Unit을 쓸 수 있다.

fun f(): Unit { . . . }

이는 반환 타입 선언 없이 정의한 블록이 본문인 함수와 같다.

fun f() { . . . }

void와 Unit의 차이점은 무엇일까?

Unit은 모든 기능을 갖는 일반적인 타입이고, void와 달리 Unit을 타입 인자로 쓸 수 있다.

또한 Unit 타입에 속한 값은 단 하나이며, 이름도 Unit이다. Unit 타입의 함수는 Unit 값을 묵시적으로 반환한다.

Nothing 타입

코틀린에는 결코 성공적으로 값을 돌려주는 일이 없어 "반환 값"이라는 개념 자체가 의미 없는 함수가 일부 존재한다.

ex) 테스트 라이브러리들은 fail이라는 함수를 제공하는 경우가 많다.

이러한 경우를 표현하기 위해 코틀린에 Nothing이라는 특별한 반환 타입이 있다.

fun fail(message: String): Nothing {
    throw IllegalStateException(message)
}

Nothing 타입은 아무 값도 포함하지 않는다. 따라서 함수의 반환 타입이나 반환 타입으로 쓰일 타입 파라미터로만 쓸 수 있다. 그 외의 용도로 사용한다면 아무 의미도 없다.

728x90

댓글