const val 는 컴파일 시간에 결정되는 상수이다. 런타임에 할당되는 val 와 달리 컴파일 시간 동안 할당이 되어야 한다.
즉, const 는 함수나 어떤 클래스의 생성자에게도 결코 할당 될 수 없고 오직 문자열이나 기본 자료형으로 할당되어야 한다.
const val foo = complexFunctionCall() //Not okay
val fooVal = complexFunctionCall() //Okay
const val bar = "Hello world" //Also okay
class Sample {
companion object {
private const val SAMPLE_SIZE = 5
}
val sampleSize = getSize()
private fun getSize(): Int {
return 5
}
}
때문에 const 로 선언을 하면 클래스의 프로퍼티나 지역변수로 할당 할 수 없게 된다.
때문에 일반적으로 companion object 안에 상수로 선언하게 된다.
public final class Sample {
private final int sampleSize = this.getSize();
private static final int SAMPLE_SIZE = 5;
public static final Sample.Companion Companion = new Sample.Companion((DefaultConstructorMarker)null);
public final int getSampleSize() {
return this.sampleSize;
}
private final int getSize() {
return 5;
}
public static final class Companion {
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
companion object 안에 const val 로 선언한 변수는 자바에서의 static final 형태로 선언되게 된다.
https://stackoverflow.com/questions/37595936/what-is-the-difference-between-const-and-val
https://kotlinlang.org/docs/tutorials/kotlin-for-py/objects-and-companion-objects.html