android studio ver. 3.1.2
kotlin_version = 1.2.51

Util 과 같은 클래스 안에 static method 를 만들어 놓고,

전역에서 호출하여 사용할 수 있습니다. 코틀린은 static 이 없다고 하니, 펑션 만 만들어 줍니다.

public class Utils_j {

    public static void load(String value) {
        Log.i("trip_", "method load : "+ value);
    }
}

코틀린으로 변환 해 보았습니다.

object Utils {

    fun load(value: String) {
        Log.i("trip_", "method load : $value")
    }
}

// 실행
override fun onClick(v: View?) {
        when(v?.id) {
            R.id.iv -> {
                Utils_j.load("java test")

                Utils.load("kotlin test")

            }
        }
    }


결과




여기까지는 kotlin file 에서 kotlin file 을 접근했을 때이고,

만약 java file > kotlin file 로 접근 해서 fun 호출 하게 되면 좀 더 다른점을 볼수 있어요.
Logger 라는 코틀린 파일을 만들어서 테스트를 진행 해보았습니다. 


object Logger {

    private const val TAG = "trip_"

    /** Log Level Information  */
    fun i(vararg message: Any) {
        if (BuildConfig.DEBUG) Log.i(TAG, buildLogMsg(*message))
    }

    /** Log Level Debug  */
    fun d(vararg message: Any) {
        if (BuildConfig.DEBUG) Log.d(TAG, buildLogMsg(*message))
    }
}

// 자바에서 kotlin 펑션을 호출
@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.iv:
                Logger.INSTANCE.d("kotlin input test");
            break;
        }
    }


Logger.d 이런식으로는 사용이 안되게 되어 있고, INSTANCE 가 붙어서 싱글톤 형태여야 쓸 수 있는 의미가 됩니다.

그래서 전 그냥 Logger.d 로 쓰고 싶어요 한다면 여러가지 방법이 있겠습니다.


우선 아래 코드 처럼 object Logger { } 부분을 지우면
LoggerKt.d() 로 사용할 수가 있어요.

//object Logger {

    private const val TAG = "trip_"

    /** Log Level Information  */
    fun i(vararg message: Any) {
        if (BuildConfig.DEBUG) Log.i(TAG, buildLogMsg(*message))
    }

    /** Log Level Debug  */
    fun d(vararg message: Any) {
        if (BuildConfig.DEBUG) Log.d(TAG, buildLogMsg(*message))
    }
//}

// 자바에서 kotlin 펑션을 호출
@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.iv:
                //Logger.INSTANCE.d("kotlin input test");
                LoggerKt.d("kotlin input test");
            break;
        }
    }


LoggerKt.d() 로 사용하는 것이 불편할 수 있습니다. 제가 그래요.


Logger.d() 로 쓰고 싶다면
아래 코드 처럼 @file:JvmName("Logger") 라고 추가 해주면 Logger.d() 의 형태로 사용 할 수 있게 되었습니다.

@file:JvmName("Logger")

package example.kr.myapplication

//object Logger {

    private const val TAG = "trip_"

    /** Log Level Information  */
    fun i(vararg message: Any) {
        if (BuildConfig.DEBUG) Log.i(TAG, buildLogMsg(*message))
    }

    /** Log Level Debug  */
    fun d(vararg message: Any) {
        if (BuildConfig.DEBUG) Log.d(TAG, buildLogMsg(*message))
    }
//}

// 자바에서 kotlin 펑션을 호출
@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.iv:
                //Logger.INSTANCE.d("kotlin input test");
                //LoggerKt.d("kotlin input test");
                Logger.d("kotlin input test");
            break;
        }
    }


+ Recent posts