자바에서 전역 변수는 static로 선언된다.
반면 코틀린은 static 키워드가 없기 때문에 다른 방법을 사용한다.
코틀린에서 사용하는 방법들에 대해 조사하려 한다.
클래스 없이 파일에 작성하는 변수
// Top-level
val a = "A"
자바 파일로 변환하면 아래와 같다.
파일 이름으로 클래스가 만들어지고 static 변수로 설정된다.
public final class StaticTestKt {
@NotNull
private static final String a = "A";
@NotNull
public static final String getA() {
return a;
}
}
클래스에 포함된 형태로 작성하는 변수
// Companion object
class B {
companion object {
val b = "B"
}
}
자바 파일로 변환하면 아래와 같다.
Companion 클래스를 추가로 생성했으며 static 변수로 클래스를 선언했다.
변수에 대한 접근을 Companion 클래스를 통해서만 하게 만들었다.
public final class B {
@NotNull
private static final String b = "B";
@NotNull
public static final Companion Companion = new Companion((DefaultConstructorMarker)null);
public static final class Companion {
@NotNull
public final String getB() {
return B.b;
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
object 키워드를 사용해서 만든 싱글턴 클래스의 멤버로 작성하는 변수
// object
object C {
val c = "C"
}
자바 파일로 변환하면 아래와 같다.
일반적인 싱글턴 패턴으로 만들었으며 변수에 대한 접근을 클래스를 통해서만 가능하게 했다.
public final class C {
@NotNull
private static final String c;
@NotNull
public static final C INSTANCE;
@NotNull
public final String getC() {
return c;
}
private C() {
}
static {
C var0 = new C();
INSTANCE = var0;
c = "C";
}
}
일단 변수를 사용할 때는 다음 차이점이 있다.
a는 변수가 어디에 있는지 알 수 없지만, b, c는 어디에 있는지 알 수 있다.
a
B.b
C.c
자바 코드로 비교하면 다음과 같다. Top-level이 성능에 영향이 가장 적을 것으로 예상된다.
Top-level: 가장 간단한 형태
companion object: 코드도 길고 클래스도 2개를 사용하는 형태
object: Top-level 보다는 복잡하지만 companion object 보다는 간단한 형태
Top-level
클래스와 크게 연관이 없고 독립적으로 사용되는 값. 주로 사용하는 걸 추천
companion object
클래스와 깊게 연관된 경우 사용하지만, 단순히 변수를 선언하는 용도로는 추천하지 않음.
다만 메소드의 경우 companion object를 많이 활용하는 것으로 보임
object
companion object 대신 사용하기 적합
연관된 클래스와 다른 이름을 사용해야 하는 문제가 있음