Kotlin - JvmName, JvmMultifileClass

WindSekirun (wind.seo)·2022년 4월 26일
0

이 글은 기존 운영했던 WordPress 블로그인 PyxisPub: Development Life (pyxispub.uzuki.live) 에서 가져온 글 입니다. 모든 글을 가져오지는 않으며, 작성 시점과 현재 시점에는 차이가 많이 존재합니다.

작성 시점: 2017-06-19

기본적으로 코틀린은 JVM Class를 생성할 때 아래와 같은 명명규칙을 가지는 것 같다.

AlertUtils.kt -> AlertUtilsKt.java
RKeyHash.kt -> RKeyHashKt.java

생성할 때 이름을 변경해줄 수 있는데, @file:JvmName("Utils") 가 그 역할을 한다.

가령, 안드로이드 앱의 키스토어 해시를 꺼내는 유틸성 코드가 있다고 해보자.

@file:JvmName("Utils")

package pyxis.uzuki.live.richutilskt

import android.annotation.SuppressLint
import android.content.Context
import android.content.pm.PackageManager
import android.util.Base64
import android.util.Log
import java.security.MessageDigest

@SuppressLint("PackageManagerGetSignatures")
fun Context.getKeyHash() : String {
    val hashList:ArrayList<String> = ArrayList()
    try {
        val info = this.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
        for (signature in info.signatures) {
            val md = MessageDigest.getInstance("SHA")
            md.update(signature.toByteArray())
            hashList.add(String(Base64.encode(md.digest(), 0)))
        }

        return if (hashList.isNotEmpty()) hashList[0] else ""
    } catch (e: Exception) {
        Log.e("name not found", e.toString())
    }

    return ""
}

패키지 선언문 위에 적어주게 되면 위 명명규칙을 따르지 않고 Utils.java로 생성된다.

만약 유틸성 코드 파일이 수십개를 넘어간다면 한 개의 코틀린 파일로 통합하는 것이 아닌 @file:JvmMultifileClass 를 JvmName 밑에 작성해주면 된다.

결과적으로 자바에서 해당 유틸성 코드를 사용하려면, Utils.getKeyHash(Context) 로 사용하면 된다.

개인적으로 예전에 사용하던 static class였던 Utils.java와 큰 차이는 없게 되어 매우 좋은 기능이라 생각된다.

profile
Android Developer @kakaobank

0개의 댓글