본문으로 바로가기

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