출처 : https://kotlinlang.org/docs/numbers.html, https://kotlinlang.org/docs/unsigned-integer-types.html
정수 타입 (Integer types)
Type | Size (bits) | 최소 값 | 최대 값 |
Byte | 8 | -128 | 127 |
Short | 16 | -32768 | 32767 |
Int | 32 | -2,147,483,648 (-2^31) | 2,147,483,647 (2^31 - 1) |
Long | 64 | -9,223,372,036,854,775,808 (-2^63) | 9,223,372,036,854,775,807 (2^63 - 1) |
타입을 명시적으로 선언 하지 않으면 컴파일러가 해당 숫자를 수용 할 수 있는 최소타입 (Int 사이즈 이상) 으로 추정한다.
따라서, 타입을 명시 하지 않으면 Int 아니면 Long으로 선언된다. Long으로 선언하기 위해서는 변수를 Long 타입으로 선언 하던지, 타입을 명시 하지 않고 할당 하는 값에 "L" 을 붙일 수도 있다.
val one = 1 // Int
val threeBillion = 3000000000 // Long
val oneLong = 1L // Long
val oneByte: Byte = 1
부호가 없는 정수 타입 (Unsigned integer types)
Type | Size (bits) | 최소 값 | 최대 값 |
UByte | 8 | 0 | 255 |
UShort | 16 | 0 | 65535 |
UInt | 32 | 0 | 2^32 - 1 |
ULong | 64 | 0 | 2^64 - 1 |
부호가 없는 정수 타입은 일반 정수 타입의 대부분의 기능들을 동일하게 지원한다.
값에 "u"나 "U"를 붙임으로서 해당 값이 unsigned 타입임을 표시 할 수 있다. "uL" 이나 "UL"을 붙임으로서 unsigned Long 타입임을 표시 할 수 있다.
val b: UByte = 1u // UByte, expected type provided
val s: UShort = 1u // UShort, expected type provided
val l: ULong = 1u // ULong, expected type provided
val a1 = 42u // UInt: no expected type provided, constant fits in UInt
val a2 = 0xFFFF_FFFF_FFFFu // ULong: no expected type provided, constant doesn't fit in UInt
val intA: Int = 1u // 에러 1u 는 unsigned 타입이어야 함
val unsignedIntA: UInt = 1 // 에러 1 은 signed 타입 이어야 함
val unsignedLongA = 1UL // ULong, even though no expected type provided and constant fits into UInt
적용 사례 (Use cases)
16 진수로 AARRGGBB 형태의 컬러데이터(32비트)를 표현하는 경우와 같이 비트의 최대 범위 정수값을 활용해 양수값을 표현하는 경우가 대표적인 활용 예 이다.
data class Color(val representation: UInt)
val yellow = Color(0xFFCC00CCu)
부동 소수점 타입 (Floating-point types)
Kotlin은 실수를 표현하기 위해 IEEE 754 표준을 준수 하는 Float 타입(32비트 single precision) 과 Double 타입(64비트 double precision) 을 제공한다.
Type | Size (bits) | 최소 값 | 최대 값 |
Float | 32 | 1.4E−45 | 3.4E+38 |
Double | 64 | 4.94E−324 | 1.8E+308 |
컴파일러는 기본적으로 소수점(.)이하 단위가 있는 숫자를 Double 타입으로 간주한다.
Float임을 명하기 위해서는 값 에 "f" 또는 "F"를 붙여야 한다.
val pi = 3.14 // Double
// val one: Double = 1 // Error: type mismatch
val oneDouble = 1.0 // Double
val eFloat = 2.7182818284f // Float, actual value is 2.7182817
다른 언어와 다르게 Kotlin은 숫자의 암시적 형 변환을 지원하지 않는다. 따라서 어떤 함수의 파라미터가 Double 타입으로 정의 되어 있다면, Float타입 이나 Int타입을 파라미터로 사용 할 수 없다.
fun main() {
fun printDouble(d: Double) { print(d) }
val i = 1
val d = 1.0
val f = 1.0f
printDouble(d)
// printDouble(i) // Error: Type mismatch
// printDouble(f) // Error: Type mismatch
}
숫자 리터럴 (Literal constants for numbers)
- 정수 : 123
- Long 타입 : 123L
- 16진수 : 0x0F
- 바이너리 : 0b00001011
- Double : 123.5, 123.4e10
- Float : 123.5f, 123.5F
- 가독성을 위한 underscore (밑줄)
val oneMillion = 1_000_000
// val oneMillion = 1000000
숫자의 명시적 형 변환 (Explicit number conversions)
Kotlin의 모든 것은 객체 이기때문에, 크기가 더 작은 타입이 더 큰타입의 서브 타입이 아니다. 그렇기 때문에 암시적 형 변환이 불가능 하다.
따라서 모든 숫자 타입들은 들은 아래와 같은 명시적 형 변환 함수들을 제공 하고 있다.
- toByte()
- toShort()
- toInt()
- toLong()
- toFloat()
- toDouble()
하지만 많은 경우에 아래와 같이 문맥에서 적당한 타입을 유추 하기 때문에 명시적 형 변환이 필요 없는 경우가 많다.
val l = 1L + 3 // Long + Int => Long
숫자의 연산자 (Operations on numbers)
Kotlin은 표준 산술연산자들 (+, -, *, /, %)를 지원한다. 이러한 연산자 들을 재 정의(override) 해서 사용 할 수도 있다.
정수의 나눗셈
정수들 간의 나누기는 항상 정수를 반환한다. (소수점 이하 부분은 삭제 된다.)
실수 형태로 반환 하기 위해서는 숫자중 하나를 실수 형태로 변환 하면 된다.
val x = 5 / 2 // x == 2
val y = 5L / 2 // y == 2L
val z = 5 / 2.toDouble() // z == 2.5
비트 연산자
정수 타입 연산자들은 비트 연산자를 제공한다.
- shl(bits) : signed shift left
- shr(bits) : signed shift right
- ushr(bits) : unsigned shift right
- and(bits) : AND 연산
- or(bits) : OR 연산
- xor(bits) : XOR 연산
- inv() : 반전
부동 소수점 비교
- 동등 검사 : a == b, a != b
- 비교 연산자 : a < b, a > b, a <= b, a >= b
- 범위 검사 : x in a..b, x !in a..b
Booleans
Boolean 타입은 참(true), 거짓(false) 값을 가지는 boolean 객체 타입이다.다른 타입들과 마찬가지로 nullable 타입(Boolean?)을통해 null 값을 할당 할 수 있다.
- || : OR
- && : AND
- ! : NOT
'Kotlin' 카테고리의 다른 글
Kotlin - 반복문(for, while) (0) | 2024.01.10 |
---|---|
Kotlin - 조건문 (2) | 2024.01.07 |
Kotlin - 타입체크와 형 변환 (0) | 2024.01.06 |
Kotlin - 데이터 타입 (배열) (0) | 2024.01.01 |
Kotlin - 데이터 타입 (Character, String) (0) | 2023.12.31 |