"const"와 "val"의 차이점은 무엇입니까?


276

최근에 const키워드 에 대해 읽었으며 혼란스러워합니다! 키워드 constval키워드의 차이점을 찾을 수 없습니다. 둘 다를 사용하여 변경 불가능한 변수를 만들 수 있습니다. 누락 된 것이 있습니까?



답변:


388

consts 컴파일 시간 상수입니다. val런타임에 수행 할 수있는 s 와 달리 컴파일 시간 동안 해당 값을 할당해야 함을 의미 합니다.

즉, const함수 나 클래스 생성자에 s를 지정할 수 없으며 a String또는 primitive 에만 s를 지정할 수 없습니다 .

예를 들면 다음과 같습니다.

const val foo = complexFunctionCall()   //Not okay
val fooVal = complexFunctionCall()  //Okay

const val bar = "Hello world"           //Also okay

3
어떻게 이런 일에 대해 : const val foo = "Hello world"val bar = "Hello world"? 그들은 같은가요?
Mathew Hany 2016 년

5
@MathewHany는 적어도하지 바이트 코드의 관점에서, 참조 : stackoverflow.com/questions/37482378/static-data-in-kotlin/...
단축키

4
const컴파일하는 동안 값이 완전히 인라인 될 것이라고 생각 합니다.
Luka Jacobowitz 2016 년

102
이것은 또 다른 질문을 제기합니다. 왜 Kotlin은 왜 const val대신에 필요 const합니까? val이 맥락에서 키워드가 완전히 불필요한 것처럼 보입니다 . 왜냐하면 const var얼굴에 터무니없는 것입니다.
Eric Lloyd

18
@EricLloyd으로는 const val, const에 수정입니다 val보다는 키워드. 수정 자> 키워드. 이와 같은 디자인의 추가 예로는, 아르 annotation/enum/data class, private val, inline fun
아로

38

Luka의 답변에 추가하기 만하면됩니다.

컴파일 타임 상수

컴파일 타임에 알려진 값은 const 한정자를 사용하여 컴파일 시간 상수로 표시 할 수 있습니다. 이러한 속성은 다음 요구 사항을 충족해야합니다.

이러한 속성은 주석에 사용될 수 있습니다.

출처 : 공식 문서


21

Kotlin을 Java로 변환 할 수 있습니다. 그러면 const에 val 보다 정적 수정자가 하나 더 있음을 알 수 있습니다. . 이와 같은 간단한 코드.

코 틀린 :

const val str = "hello"
class SimplePerson(val name: String, var age: Int)

Java (부분)로 :

@NotNull
public static final String str = "hello";

public final class SimplePerson {
   @NotNull
   private final String name;
   private int age;

   @NotNull
   public final String getName() {
      return this.name;
   }

   public final int getAge() {
      return this.age;
   }

   public final void setAge(int var1) {
      this.age = var1;
   }

   public SimplePerson(@NotNull String name, int age) {
      Intrinsics.checkParameterIsNotNull(name, "name");
      super();
      this.name = name;
      this.age = age;
   }
}

2
누군가이 답변이 왜 망각으로 하향 조정 되었습니까?
제임스 조던 테일러

3
@JamesJordanTaylor 나는 찬성했다. 그러나 나는 일부 사람들 이주의 깊게 읽지 않았기 때문에이 대답은 언뜻보기에 Java에서 kotlin으로 변환하는 방법에 대해 이야기하는 것 같습니다.
user1032613

2
하면 어떻게 const제거, 그것은 다른 자바 파일을 얻을 것인가?
DYS

2
@ DYS : "정적"을 제거하고 공개 최종 문자열이 될 것이라고 생각합니다. str = "hello";
Varun Ajay Gupta

5

모두 valconst 불변입니다.

const컴파일 타임 상수를 선언하는 데 사용되는 반면 val런타임 상수는 선언 됩니다.

const val VENDOR_NAME = "Kifayat Pashteen"  // Assignment done at compile-time

val PICon = getIP()  // Assignment done at run-time

4

const kotlin을 Java로

const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";

val kotlin에서 Java로

val Car_1 = "BUGATTI"   // final String Car_1 = "BUGATTI";

간단한 언어로

  1. const 변수의 값은 컴파일 타임에 알려져 있습니다.
  2. val 값은 런타임시 상수를 정의하는 데 사용됩니다.

실시 예 1-

const val Car_1 = "BUGATTI"val Car_2 = getCar() ✔    
const val Car_3 = getCar()//Because the function will not get executed at the compile time so it will through error

fun getCar(): String {
    return "BUGATTI"
}

getCar ()는 런타임에 평가되어 그 값을 Car에 할당하기 때문입니다.

또한-

  1. val 은 읽기 전용이며 런타임에 알려진 불변입니다.
  2. 런타임에 알려진 var 는 변경 가능
  3. const 는 불변이며 컴파일 타임에 알려진 변수

3

kotlin에서 const그리고 val둘 다 불변성을 나타내며 값을 읽고 finalJava에서 키워드로 작동 합니다.

val키워드는 런타임 값 const을 선언하는 데 사용해야 하고 키워드는 컴파일 시간 값을 선언하는 데 사용해야합니다.

const는 함수 및 생성자가 아닌 기본 데이터 유형에만 사용해야합니다.

Example -

const val fun1 = anyFunctionOrConstructor() // it is not fine
    val fun2 = anyFunctionOrConstructor() // it is perfectly fine
    
    const val aa = "My String" // it is perfectly fine

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.