[Kotlin] λ‚ μ§œμ™€ μ‹œκ°„ 클래슀

πŸ’‘ μ½”ν‹€λ¦°μ—μ„œ λ‚ μ§œμ™€ μ‹œκ°„μ„ λ‹€λ£¨λŠ” ν΄λž˜μŠ€μ— λŒ€ν•˜μ—¬ ν•™μŠ΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€! Java의 API와 Kotlin 자체 라이브러리λ₯Ό λΉ„κ΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

Java API

  • Kotlin은 JVM 언어이기 λ•Œλ¬Έμ— Java의 λ‚ μ§œ 및 μ‹œκ°„ APIλ₯Ό 직접 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Java 8μ—μ„œ λ„μž…λœ java.time νŒ¨ν‚€μ§€μ˜ APIλ₯Ό 많이 μ‚¬μš©ν•©λ‹ˆλ‹€.

java.time νŒ¨ν‚€μ§€

  • Java 8μ—μ„œ λ„μž…λœ λ‚ μ§œμ™€ μ‹œκ°„ κ΄€λ ¨ API둜, ν˜„λŒ€μ μΈ λ°©μ‹μœΌλ‘œ λ‚ μ§œμ™€ μ‹œκ°„μ„ μ²˜λ¦¬ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
    • [LocalDate] : λ‚ μ§œ(λ…„, μ›”, 일)을 ν‘œν˜„ν•˜λŠ” 클래슀
    • [LocalTime] : μ‹œκ°„(μ‹œ, λΆ„, 초, λ‚˜λ…Έμ΄ˆ) 을 ν‘œν˜„ν•˜λŠ” 클래슀
    • [LocalDateTime] : λ‚ μ§œμ™€ μ‹œκ°„ λͺ¨λ‘ ν‘œν˜„ν•˜λŠ” 클래슀
    • [Period] : 두 λ‚ μ§œ κ°„μ˜ 차이λ₯Ό ν‘œν˜„ν•˜λŠ” 클래슀
    • [Duration] : 두 μ‹œκ°„ κ°„μ˜ 차이λ₯Ό ν‘œν˜„ν•˜λŠ” 클래슀
  • 이 이외에도 μ‹œκ°„λŒ€ 정보λ₯Ό ν‘œν˜„ν•˜λŠ” ZonedDateTime이 μžˆμŠ΅λ‹ˆλ‹€.
import java.time.LocalDate
import java.time.LocalTime
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

fun main() {
    val currentDate = LocalDate.now()
    val currentTime = LocalTime.now()
    val currentDateTime = LocalDateTime.now()

    val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")

    println("ν˜„μž¬ λ‚ μ§œ: $currentDate")
    println("ν˜„μž¬ μ‹œκ°„: $currentTime")
    println("ν˜„μž¬ λ‚ μ§œμ™€ μ‹œκ°„: ${currentDateTime.format(formatter)}")
}

Calendar

  • Java 8 μ΄μ „μ—λŠ” java.util.Date와 java.util.Calendar 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‚ μ§œμ™€ μ‹œκ°„μ„ μ²˜λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • ν•˜μ§€λ§Œ μœ„ ν΄λž˜μŠ€λ“€μ€ μ„€κ³„μƒμ˜ 문제둜 인해 μ‚¬μš©μ΄ λ²ˆκ±°λ‘œμ›Œ ꡬ식 API둜 κ°„μ£Όλ˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
import java.util.Date
import java.util.Calendar

fun main() {
    val date = Date() // ν˜„μž¬ λ‚ μ§œμ™€ μ‹œκ°„μ„ κ°€μ Έμ˜΄
    val calendar = Calendar.getInstance()
    
    println("ν˜„μž¬ λ‚ μ§œμ™€ μ‹œκ°„ (Date): $date")
    println("ν˜„μž¬ λ‚ μ§œμ™€ μ‹œκ°„ (Calendar): ${calendar.time}")
}

java.util.Date와 java.util.Calendar 문제점

  • μœ„ ν΄λž˜μŠ€λ“€μ€ Java의 초기 버전에 λ‚ μ§œμ™€ μ‹œκ°„μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λ„μž…λœ ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
  • 이 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ μ•„λž˜μ™€ 같은 문제점이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • [λΆˆλ³€μ„±] : 두 클래슀 λ‹€ λ³€κ²½ κ°„μœΌν•œ 객체λ₯Ό μƒμ„±ν•˜λ―€λ‘œ, λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • [API 섀계] : 두 클래슀의 APIλŠ” 직관적이지 μ•Šκ³  μ‚¬μš©ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€.
      • ex> 월은 0μ›”λΆ€ν„° μ‹œμž‘ν•˜λ©°, 1월이 0, 12월이 11

Kotlin 라이브러리

  • μ½”ν‹€λ¦°μ—μ„œλŠ” 자체적으둜 λ‚ μ§œμ™€ μ‹œκ°„μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ kotlinx-datetime 라이브러리λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • 이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” Kotlin Multiplatform ν”„λ‘œμ νŠΈμ—μ„œλ„ μ‚¬μš©ν•  수 있으며, java.timeκ³Ό μœ μ‚¬ν•œ ꡬ쑰λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.

kotlinx-datetime νŒ¨ν‚€μ§€

  • [LocalDate] : λ‚ μ§œ(λ…„, μ›”, 일)λ₯Ό ν‘œν˜„ν•˜λŠ” 클래슀
  • [LocalDateTime] : λ‚ μ§œμ™€ μ‹œκ°„μ„ λͺ¨λ‘ ν‘œν˜„ν•˜λŠ” 클래슀
  • [Instant] : νŠΉμ • μ‹œμ μ„ λ‚˜νƒ€λ‚΄λŠ” 클래슀
  • [TimeZone] : μ‹œκ°„λŒ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 클래슀

kotlinx-datetime μ˜μ‘΄μ„± μΆ”κ°€

  • kotlinx-datetime 라이브러리λ₯Ό ν™œμš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” Gradle νŒŒμΌμ— μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.
dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
}

kotlinx-datetime ν™œμš©ν•˜κΈ°

import kotlinx.datetime.*

fun main() {
    // ν˜„μž¬ λ‚ μ§œμ™€ μ‹œκ°„ κ°€μ Έμ˜€κΈ°
    val currentDate = LocalDate.now()
    val currentDateTime = LocalDateTime.now()

    // ν˜„μž¬ μ‹œκ°„λŒ€λ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • μ‹œμ (Instant) 생성
    val currentInstant = Clock.System.now()

    // ν˜„μž¬ μ‹œμŠ€ν…œμ˜ μ‹œκ°„λŒ€ κ°€μ Έμ˜€κΈ°
    val currentZone = TimeZone.currentSystemDefault()

    // Instantλ₯Ό LocalDateTime으둜 λ³€ν™˜ (ν˜„μž¬ μ‹œκ°„λŒ€)
    val localDateTimeFromInstant = currentInstant.toLocalDateTime(currentZone)

    // UTC μ‹œκ°„λŒ€λ‘œ λ³€ν™˜
    val utcZone = TimeZone.UTC
    val utcDateTime = currentInstant.toLocalDateTime(utcZone)

    // 좜λ ₯
    println("ν˜„μž¬ λ‚ μ§œ: $currentDate")
    println("ν˜„μž¬ μ‹œκ°„: $currentDateTime")
    println("ν˜„μž¬ μ‹œμ  (Instant): $currentInstant")
    println("ν˜„μž¬ μ‹œμ μ—μ„œμ˜ LocalDateTime: $localDateTimeFromInstant")
    println("UTC μ‹œκ°„λŒ€μ—μ„œμ˜ LocalDateTime: $utcDateTime")
}

정리

  • Kotlinμ—μ„œ λ‚ μ§œμ™€ μ‹œκ°„μ„ μ²˜λ¦¬ν•  λ•Œ Java의 java.time APIλ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Kotlin νŠΉν™” 라이브러리인 kotlinx-datetime을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν”„λ‘œμ νŠΈμ˜ μš”κ΅¬μ‚¬ν•­κ³Ό ν”Œλž«νΌ(Android, JVM, Multiplatform λ“±)에 따라 μ μ ˆν•˜κ²Œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ !

μ°Έκ³ 

https://kotlinworld.com/57