경우에 따라 도메인 모델에서 양수만 나타내야 할 수도 있으니,
Kotlin 1.3부터 Kotlin은 이 요구 사항을 수용하기 위해 부호 없는 정수를 지원합니다.
타입
- UByte: 8비트 부호 없는 정수 (0부터 255까지의 값 표현)
- UShort: 16비트 부호 없는 정수 (0부터 65535까지의 값 표현)
- UInt: 32비트 부호 없는 정수 (0부터 4294967295까지의 값 표현)
- ULong: 64비트 부호 없는 정수 (0부터 18446744073709551615까지의 값 표현)
사용
- u/U 접미사를 제공
val explicitULong = 4204uL
- u/U 만 사용 시 정수 타입추론됨
val uByte: UByte = 4204u
val uShort: UShort = 4204u
val uInt: UInt = 4204U
val uLong: ULong = 4204u
변환
val anInt = 33
val converted = anInt.toUInt()
사용 케이스
1. 비트 조작(Bit Manipulation)
: 부호 없는 정수타입은 비트 조작 연산을 수행할 때 유용합니다.
예를 들어, 네트워크 프로토콜의 헤더를 다루거나, 이진 데이터를 다루거나, 비트 단위로 데이터를 조작해야 할 때 사용될 수 있습니다.
fun main() {
val bitmask: UByte = 0b10101010u
val result = bitmask or (1u shl 3)
println(result.toString(2)) // 출력: 10111010
}
2. 절대값과 크기 비교
: 어떤 값의 절대값이나 크기를 비교할 때, 음수를 다룰 필요가 없는 경우에 부호 없는 정수타입을 사용하여 간편하게 처리할 수 있습니다.
fun main() {
val unsignedValue: UInt = 42u
val anotherValue: UInt = 27u
val absDifference = if (unsignedValue > anotherValue) unsignedValue - anotherValue else anotherValue - unsignedValue
println(absDifference) // 출력: 15
}
3. 데이터 저장 및 전송
: 데이터가 항상 양수일 경우, 데이터 크기를 줄이고 저장 공간을 절약하기 위해 부호 없는 정수타입을 사용할 수 있습니다.
또한, 특정 하드웨어나 프로토콜이 부호 없는 정수를 사용하는 경우에도 유용합니다. (크기 줄이자고 이렇게 쓰는 경우 못봤는데 있으면 제보바랍니다!)
fun main() {
val dataPacket: UShort = 65000u
// 데이터를 저장 또는 전송하는 코드
// ...
val receivedData: UShort = 52000u
println("Received data: $receivedData")
}
4. 래핑 연산
: 부호 없는 정수타입은 오버플로우가 발생하는 경우, 범위의 한쪽 끝에서 다른 쪽 끝으로 래핑(순환)되어 계산을 진행합니다.
이를 이용하여 순환 계산이 필요한 상황에서 유용합니다.
fun main() {
val maxValue: UByte = UByte.MAX_VALUE
val incrementedValue = maxValue + 1u
println(incrementedValue) // 출력: 0 (오버플로우 후 순환)
}
5. 비트 필드(Bit Fields)
: 여러 상태나 플래그를 표현할 때, 각 비트를 독립적인 상태로 사용하는 경우에 부호 없는 정수타입을 활용할 수 있습니다.
fun main() {
val flags: UByte = 0b10101100u
val hasFlag2 = (flags and 0b00000100u) != 0u
val hasFlag5 = (flags and 0b00100000u) != 0u
println("Flag 2 is set: $hasFlag2") // 출력: true
println("Flag 5 is set: $hasFlag5") // 출력: false
}
눈에 띄는 사항
- 인라인 클래스로 구현되었다고 함
@SinceKotlin("1.5")
@WasExperimental(ExperimentalUnsignedTypes::class)
@JvmInline
public value class ULong @kotlin.internal.IntrinsicConstEvaluation @PublishedApi internal constructor(@PublishedApi internal val data: Long) : Comparable<ULong> {
...
}
출처
- https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-u-byte/
- https://www.baeldung.com/kotlin/unsigned-integers#unsigned-integers