최상위 함수와 프로퍼티

2018, Jun 22    

자바에서는 모든 코드를 클래스 기반에서 작성해야 한다. 하지만 특정 도메인 영역에는 포함되기 어려운 유틸에 관련된 변수나 메소드를 생성해야 할 경우가 있는데, 클래스를 하나 생성하고 그 클래스에 static 멤버로 선언하여 사용하는 것이 보통이다.

  • 코틀린에서는 이런 무의미한 클래스가 필요 없다.
  • 코틀린에서는 코틀린파일(.kt)의 최상위 수준, 모든 다른 클래스의 밖에 선언된 메소드와 프로퍼티는 static 멤버로 처리한다.
  • 이런 함수나 프로퍼티는 패키지의 멤버이므로 다른 패키지에서 사용하고자 한다면 해당 패키지를 import해야 한다.

아래와 같이 ‘strings’라는 이름의 패키지에 ‘prefix.kt’이라는 파일을 생성하여,함수 하나를 선언해 보자.

package strings

fun prefixAddFirst(s: String, prefix: String): String {
    return prefix+s
}

>>> print(prefixAddFirst("hello", "Juhee! "))
Juhee! hello

코틀린도 JVM에서 실행 되기 때문에, 코틀린 컴파일러는 이파일을 컴파일 할때 코틀린 파일명으로 새로운 클래스를 정의해준다.
예제와 같은 경우 파일명이 ‘prefix.kt’이므로 ‘PrefixKt’라는 이름으로 클래스가 만들어진다.
컴파일 후에는 자바에서는 다음과 같은 코드로 인식 될 것이다.

package strings

public class PrefixKt {
  public static String prefixAddFirst(String s, String prefix) {
    return prefix+s
  }
}

함수와 마찬가지로 프로퍼티도 파일의 최상위 수준에 놓일 수 있다.

var opCount = 0

fun performOperation() {
    opCount++
}

fun reportOperationCount() {
    print("Operation performed $opCount times")
}

함수와 마찬가지로 최상위 프로퍼티도 정적 필드에 저장된다.
최상위 프로퍼티를 활용해 val로 선언하면 상수로 사용할 수 있다.

  val UNIX_LINE_SEPARATOR = "\n"
  • 기본적으로 최상위 프로퍼티도 일반적인 프로퍼티처럼 접근자 메소드(getter, setter)를 통해 자바코드에 노출 된다.
    코틀린 코드 상에서 상수처럼 보이지만, 자바에서 위에 UNIX_LINE_SEPARATOR같은 변수에 접근 하려면 getter를 이용해야 한다.
  • 자바에서와 같은 상수를 선언하기 위해서는 const 키워드를 사용하여야 한다.
    const val UNIX_LINE_SEPARATOR = "\n"
    

    위 코드는 다음 자바 코드와 동일한 바이트 코드를 만들어 낸다.

    public static final String UNIX_LINE_SEPARATOR = "\n"