-
[Kotlin - Basic Types] NumbersSoftware/Kotlin : 코틀린 2019. 12. 9. 23:03반응형
숫자
정수형
코틀린은 숫자들을 표현할 수 있는 자료형들을 기본적으로 제공한다.
그 중 정수 표현을 위한 자료형으로 4가지의 기본 자료형을 제공하고 있는데 이 4가지 자료형들은 각각 다른 크기와 값 범위를 가진다.Type Size(bits) Min value Max value Byte 8 -128 127 Short 16 -32768 32767 Int 32 -2,147,483,648 (-231) 2,147,483,647 (231 - 1) Long 64 -9,223,372,036,854,775,808 (-263) 9,223,372,036,854,775,807 (263 - 1) 모든 정수형들은 정수 값으로 초기화되며 그 값은 Int의 최대값 보다 크지 않는다. 만약 초기값이 이 값보다 크다면 해당 자료형은 Long이 된다. Long 자료형을 특정하기 위해서는 값의 마지막에 "L"을 덧붙여 주면 된다.
val one = 1 // Int val threeBillion = 3000000000 // Long val oneLong = 1L // Long val oneByte: Byte = 1
실수형
실수 표현을 위해서 코틀린에서는 Float와 Double 자료형을 제공한다.
Float는 IEEE 7754의 단정밀도인 32비트를 Double은 배정밀도 64비트를 표현한다.Type Size (bits) Significant bits Exponent bits Decimal digits Float 32 24 8 6-7 Double 64 53 11 15-16 소수값으로 초기화되어 있는 변수의 경우 컴파일러는 Double로 그 자료형을 유추한다. Flot 자료형으로 특정하기 위해서는 "f" 혹은 "F" 를 추가해 주면 된다.
val pi = 3.14 // Double val e = 2.7182818284 // Double val eFloat = 2.7182818284f // Float, actual value is 2.7182817
코틀린은 다른 언어들과는 다르게 숫자에 대한 암묵적 확장이 존재하지 않는다.
예를 들어 인자로 Double 자료형을 받는 함수의 경우 오직 Double 자료형만을 인자로 받아 사용할 수 있다.
(Flot, Int 혹은 다른 숫자값을 인자로 받아 사용할 수 없다)fun main() { fun printDouble(d: Double) { print(d) } val i = 1 val d = 1.1 val f = 1.1f printDouble(d) // printDouble(i) // Error: Type mismatch // printDouble(f) // Error: Type mismatch }
만약 다른 자료형으로 숫자값을 변환하고 싶다면 명시적 변환(Explict conversions)을 통해 가능하다.
문자 상수
- - 십진수(Decimals): 123
- - 16진수(Hexadecimals): 0x0F
- - 2진수(Binaries): 0b00001011
- - 8진수는 지원하지 않는다
코틀린은 부동 소수점 숫자를 위한 기존의 표기법 또한 지원한다.
- - 기본 Double 자료형: 123.5, 123.5e10
- - f or F가 태그되어 있는 Float 자료형: 123.5f, 123.5F
숫자 문자안에서의 밑줄(Underscores)
긴 숫자 상수의 가독성 개선을 위해 숫자 사이의 밑줄을 삽입하여 사용할 수 있다(1.1 버전부터 지원)
val oneMillion = 1_000_000 val creditCardNumber = 1234_5678_9012_3456L val socialSecurityNumber = 999_99_9999L val hexBytes = 0xFF_EC_DE_5E val bytes = 0b11010010_01101001_10010100_10010010
표현 방식
자바에서는 Null값을 가질 수 있는 참조형(e.g. Int?)이 필요한 경우가 아니라면 기본적으로 숫자는 JVM 기본형 (Primitive types)으로 저장되어 진다.
아래 예시의 경우 자바의 참조형 변수와 마찬가지로 boxedA와 anotherBoxedA는 각각 다른 주소값을 가진다.
val a: Int = 10000 println(a === a) // Prints 'true' val boxedA: Int? = a val anotherBoxedA: Int? = a println(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
그러나 아래 코드와 같이 실제 값의 동등성 비교를 해보면 boxedA와 anotherBoxedA가 같은 값을 가지는 것을 확인할 수 있다.
val a: Int = 10000 println(a == a) // Prints 'true' val boxedA: Int? = a val anotherBoxedA: Int? = a println(boxedA == anotherBoxedA) // Prints 'true'
명시적 형식 변환
작은 타입의 자료형은 보다 큰 자료형의 하위 타입이 아니다. 만약 그렇다면 우리는 아래와 같은 문제를 맞이하게 될 것이다.
// Hypothetical code, does not actually compile: val a: Int? = 1 // A boxed Int (java.lang.Integer) val b: Long? = a // implicit conversion yields a boxed Long (java.lang.Long) print(b == a) // Surprise! This prints "false" as Long's equals() checks whether the other is Long as well
더 작은 값을 가지는 자료형은 암무적으로는 더 큰 값을 가지는 자료형으로 변환되지 않는다. 즉, 명시적 형식 변환 없이는 Int변수에 Byte의 자료형의 값을 할당할 수 없다.
val b: Byte = 1 // OK, literals are checked statically val i: Int = b // ERROR
우리는 이 문제를 아래와 같은 방법으로 해결 가능하다.
val i: Int = b.toInt() // OK: explicitly widened print(i)
연산자
코틀린은 숫자에 대한 산술 연산 표준 집합을 지원한다.
비트 연산자의 경우 중위 함수 (Infix)를 사용해서 연산이 가능하다.val x = (1 shl 2) and 0x000FF000
아래는 코틀린에서 지원하는 비트연산자 리스트이며 연산에는 Int와 Long 자료형만 사용 가능하다.
- shl(bits) – signed shift left
- shr(bits) – signed shift right
- ushr(bits) – unsigned shift right
- and(bits) – bitwise and
- or(bits) – bitwise or
- xor(bits) – bitwise xor
- inv() – bitwise inversion부동 소수점 숫자 비교
- 동등 체크: a == b and a != b
- 비교 연산자: a < b, a > b, a <= b, a >= b
- 범위 인스턴스화 및 체크: a..b, x in a..b, x !in a..b
피연산자가 정적 타입의 부동 소수점 숫자가 아닌 경우 (예: Any, Comparable<...>, a type parameter) 연산자들은 표준과 다른 Float 및 Double에 대한 equals 와 compareTo를 사용한다.
- NaN 은 자기 자신과 동등하다고 간주된다
- NaN은 POSITIVE_INFINITY를 포함한 다른 요소보다 큰 값으로 간주된다
- -0.0은 0.0보다 작은 값으로 간주된다.
출처: https://kotlinlang.org/docs/reference/basic-types.html#explicit-conversions
반응형'Software > Kotlin : 코틀린' 카테고리의 다른 글
[Kotlin - Basic Types] Strings (0) 2019.12.20 [Kotlin - Basic Types] Character, Booleans, Arrays (0) 2019.12.17 댓글