티스토리 뷰

Java로 개발을 하던 시절에는 static을 이용하여서 변수나 function을 만들어서 사용하였습니다.

그렇지만 kotlin은 이런것이 없고, 패키지 내에 함수를 선언하여서 바로 사용을 할수 있게 되어 있습니다.


예를 들어 보겠습니다.


Java

1
2
3
4
5
6
7
8
package com.mrgamza.example
 
class Example {
  public static final String TEXT = "text";
  public static void test() {
    // test
  }
}



kotlin

1
2
3
4
5
6
package com.mrgamza.example
 
const val TEXT = "text"
fun test() {
  // test
}



이렇게 두개의 사용범위는 조금 다르기는 하지만 static 처럼 사용이 가능합니다.


그렇지만 이렇게 전체 범위에 선언하다 보면 네임스페이스가 없어서 다소 헷갈리는데요...

그렇다면 kotlin에서는 어떻게 선언하는게 방법이 있을까요?


1. object를 이용한다


1
2
3
4
5
6
7
8
package com.mrgamza.example
 
object Example {
    const val TEXT = "text"
    fun test() {
        // test
    }
}



일단 네임스페이스를 만들어서 사용하려고 했던 의도는 충족이 되었습니다.

하지만... 우리가 만들어서 사용하는 방식들은 ExampleActivity가 있다고 한다면. ExampleActivity.Extra.Name 이런거였습니다.


2. 파일내에 선언하기


1
2
3
4
5
6
7
8
9
10
11
package com.mrgamza.example
 
const val TEXT = "text"
 
fun test() {
    // text
}
 
class ExampleActivity {
    ...
}



뭔가 넣어놓기는 했는데 구분도 되는거 같기는 합니다만 Java를 섞어서 사용하는 부분에서는 뭔가가 이상한 코드가 됩니다.


ExampleActivityKt.TEXT와 ExampleActivityKt.test() 처럼 뒤에 kt가 붙는 형태로 접근하여야 합니다.

물론 이것을 해결하는 방법도 있기는 합니다.


@file:JvmName(name: String) 이것을 파일의 제일 위에 붙여주게 되면 JVM에서 사용되는 이름이 변경됩니다.

@file:JvmName(name: "ExampleActivity") 이렇게 사용하면 되지만... 위에 뭔가를 계속 붙이는게 너무 싫습니다.


3. companion object 를 이용한다.


1
2
3
4
5
6
7
8
class Example {
    companion object {
        const val TEXT = "text"
        fun test() {
            // test
        }
    }
}



무언가를 하나 더 넣어서 조금 어색하고 불편하기는 합니다만...

자바처럼 class의 내부에서 static하게 만들어서 사용할수 있습니다.

그렇지만... 이렇게 해놓기만 하면 Java에서 가져다가 바로 사용할수 없습니다.


4. @JvmStatic을 이용하자


1
2
3
4
5
6
7
8
class Example {
    companion object {
        const val TEXT = "text"
        @JvmStatic fun test() {
            // test
        }
    }
}



이렇게 사용하게 되면 Java에서도 이전에 우리가 사용하던 것처럼 Example.test()를 사용할 수 있습니다. Example.TEXT도 접근이 가능합니다. 오...


5. @JvmField을 이용할 경우


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// kotlin
class Test {
    fun test()
}
 
class Example {
    companion object {
        @JvmField TEST = Test()
    }
}
 
// Java
public void doTest() {
    Test test = Example.TEST; // 접근 
}


이 경우는 const 키워드를 사용하지 못할 경우에 사용합니다. const는 primitive와 String에만 사용이 가능하여서 다른 타입의 객체를 사용할 경우에는 앞에 JvmField를 넣어주어야 합니다.


6. 마지막으로...


가장 좋은 방법은 제가 생각하기에는 섞어서 사용하지 않는 방법이 제일 좋은것 같고요.

이게 안될 경우에는 위의 방법으로 하고...

개발을 하다보면 웬만하면 스태틱으로 무언가를 만들어서 사용하는 방식은 좋지 않은것을 느끼었습니다.


그럼 즐거운 코딩 되시길.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함