Android/Kotlin

Kotlin 부호 없는 정수타입 (Unsigned Integers)

네모메모 2023. 8. 12. 20:12
반응형

 

 

경우에 따라 도메인 모델에서 양수만 나타내야 할 수도 있으니,

Kotlin 1.3부터 ​​Kotlin은 이 요구 사항을 수용하기 위해 부호 없는 정수를 지원합니다.

 

타입

  1. UByte: 8비트 부호 없는 정수 (0부터 255까지의 값 표현)
  2. UShort: 16비트 부호 없는 정수 (0부터 65535까지의 값 표현)
  3. UInt: 32비트 부호 없는 정수 (0부터 4294967295까지의 값 표현)
  4. 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

반응형