오늘 배운 것

24-04-11 Kotlin Math 패키지 사용하기

무무11 2024. 4. 11. 17:41

공부를 하다보니 기본으로 제공되는 산술연산같은 것 말고 다른 연산이 필요한 경우가 생겼다. 따라서 코틀린에서 제공하는 Math 패키지를 사용하는 법을 공부해보고 정리해보았다.

 

아래의 코틀린 문서를 많이 참고하여 정리하였다.

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.math/

 

kotlin.math - Kotlin Programming Language

 

kotlinlang.org

 

1. Kotlin의 Math 패키지

 

1-1. 사용법

먼저 Kotlin의 Math 패키지를 사용하려면 파일 앞부분에 패키지를 불러와야 한다.

import kotlin.math.*

이 부분을 맨 위에 작성해주면 된다.

 

1-2. Math 패키지의 속성들

속성들 중에서 유용해 보이는 것들을 정리해보았다.

  • absoluteValue: 값의 절대값을 반환한다. Double, Float, Int, Long 타입의 값에 사용할 수 있다.
  • sign: 해당 값의 부호를 반환준다. 0이면 0, 음수이면 -1, 양수이면 1이 반환된다. Double, Float, Int, Long 타입의 값에 사용할 수 있다.
  • E: 자연상수 e의 값을 표편하는 Double 타입의 상수이다.
  • PI: 원주율을 표현하는 Double 타입의 상수이다.

 

아래처럼 코드로 작성하여 확인해보았다.

import kotlin.math.*

fun main() {
    val int = 0
    val long = -10000L
    val double = 1000.0
    val float = -100.0f

    println(int.absoluteValue) // 0
    println(long.absoluteValue) // 10000
    println(double.absoluteValue) // 1000.0
    println(float.absoluteValue) // 100.0

    println(int.sign) // 0
    println(long.sign) // -1
    println(double.sign) // 1.0
    println(float.sign) // -1.0

    // 자연상수 e
    println(E) // 2.718281828459045
    // 원주율 π
    println(PI) // 3.141592653589793
}

 

1-3. Math 패키지의 함수들

- 반올림 또는 내림

  • round: 실수값을 반올림 해준 값을 반환한다. 실수값과 가장 가까운 정수에 해당 하는 실수가 반환된다. 정확히 중간인 경우(ex 0.5)에는 가장 가까운 두 정수중 짝수인 쪽을 반환한다.

예시로 코드를 작성해보았다.

import kotlin.math.*

fun main() {
    println(round(10.5000)) // 10.0
    println(round(10.3)) // 10.0
    println(round(10.8)) // 11.0
}

 

  • roundToInt, roundToLong: 실수값을 반올림 해준 값을 정수로 반환한다. Int로 반환하고 싶은 경우는 roundToInt를 사용하면 되고 Long으로 반환하고 싶은 경우에는 roundToLong을 사용하면 된다. 정확히 중간인 경우에는 가장 가까운 두 정수 중 더 큰 수 쪽을 반환한다.(음수의 경우 절대값이 큰 수가 아니라 양의 방향으로 큰 수를 반환한다.) 확장함수 이기 때문에 '식.함수이름(식)'의 형태로 사용해야한다.
import kotlin.math.*

fun main() {
    val double = 10.8
    val float = 10.3f

    println(double.roundToInt()) // 11
    println(double.roundToLong()) // 11
    println(float.roundToInt()) // 10
    println(float.roundToLong()) // 10

    val double1 = 10.5
    val double2 = -10.5

    println(double1.roundToInt()) // 11
    println(double1.roundToLong()) // 11
    println(double2.roundToInt()) // -10
    println(double2.roundToLong()) // -10
    // -10.5는 -11과 -10의 중간이다. 더 큰 수인 -10이 반환된다
}

 

  • truncate: 어떤 실수값의 소수부분을 제거한 실수값을 반환한다.
import kotlin.math.*

fun main() {
    val double1 = 10.8
    val double2 = -10.5
    val float = 10.3f

    println(truncate(double1)) // 10.0
    println(truncate(double2)) // -10.0
    println(truncate(float)) // 10.0
}

- 제곱근과 거듭 제곱

  • sqrt: 어떤 실수 값의 양의 제곱근을 반환한다.
  • cbrt: 어떤 실수 값의 세제곱근을 반환한다.

아래 작성한 코드로 위 두 함수를 사용해보았다. 두 함수 모두 실수값만을 이용할 수 있기 때문에 정수형의 경우는 실수형으로 변경해줘야한다.

import kotlin.math.*

fun main() {
    val int = 64

    println(sqrt(int.toDouble())) // 8.0
    println(cbrt(int.toFloat())) // 4.0
    // Int형의 경우 실수형으로 변경하여야한다

    val float = 8.0f
    val double = 8.0

    println(sqrt(float)) // 2.828427
    println(cbrt(float)) // 2.0

    println(sqrt(double)) // 2.8284271247461903
    println(cbrt(double)) // 2.0

    val double2 = -729.0

    println(sqrt(double2)) // NaN
    println(cbrt(double2)) // -9.0
    // 음수의 제곱근은 허수이기 때문에 NaN이 출력된다.
    // 음수의 세제곱근은 음수로 정상적으로 출력된다.
}

 

  • pow: 어떤 실수값의 제곱계산을 하는 함수이다. 인수로 Int 또는 Double을 받아 그 값만큼 거듭제곱을 해서 나온 값을 반환한다. 확장함수 이기 때문에 '식.함수이름(식)'의 형태로 사용해야한다.

아래 작성한 코드에서 pow 함수를 사용해보았다. 실수 값에만 사용가능하기 때문에 정수형의 경우 실수형으로 변환해서 사용해야한다. 실수형의 경우도 Double의 경우는 인수로 Int와 Double만 받을 수 있고, Float의 경우는 인수로 Int와 Float만 받을 수 있음에 주의해야한다.

import kotlin.math.*

fun main() {
    val int = 2

    println(int.toDouble().pow(2)) // 4.0
    println(int.toFloat().pow(4.0f)) // 16.0
    // Int형의 경우 실수형으로 변경하여야한다
    // Float의 경우 인수로 Int와 Float만 받을 수 있다
    
    /* pow로도 제곱근, 세제곱근을 sqrt,sbrt처럼 똑같이 구할 수 있다.
    a의 n제곱근은 a의 1/n제곱과 같기 때문이다 */

    val float = 8.0f
    val double = 8.0

    println(sqrt(float)) // 2.828427
    println(float.pow(1.0f/2.0f)) // 2.828427
    println(cbrt(float)) // 2.0
    println(float.pow(1.0f/3.0f)) // 2.0

    println(sqrt(double)) // 2.8284271247461903
    println(double.pow(1.0/2.0)) // 2.8284271247461903
    println(cbrt(double)) // 2.0
    println(double.pow(1.0/3.0)) // 2.0
}

 

이외에도 로그, 삼각함수와 같은 계산을 해주는 다양한 함수들이 있지만 현재로서는 크게 필요한 경우가 없을 것 같아 따로 정리하지 않았다. 필요한 경우 찾아서 사용하면 좋을 것이다.

 

2. 오늘 알게 된 것

- Kotlin의 Math 패키지를 불러오고 사용하는 법에 대해 정리해보았다.

- 복잡한 수학 연산이 필요한 경우 앞으로 쉽게 해결할 수 있을 것 같다.