코 틀린의 Val and Var


289

코 틀린 var과 의 차이점은 무엇입니까 val?

나는이 링크를 갔다 :

https://kotlinlang.org/docs/reference/properties.html

이 링크에 명시된 바와 같이 :

읽기 전용 속성 선언의 전체 구문은 두 가지면에서 변경 가능한 것과 다릅니다. var 대신 val로 시작하고 setter를 허용하지 않습니다.

그러나 바로 setter를 사용하는 예제가 있습니다.

fun copyAddress(address: Address): Address {
    val result = Address() // there's no 'new' keyword in Kotlin
    result.name = address.name // accessors are called
    result.street = address.street
    // ...
    return result
}

사이의 정확한 차이는 무엇 varval?

왜 둘 다 필요합니까?

이것은 Kotlin변수와 중복되지 않으며 Java와 다릅니다. var 대 val? 일반적으로가 아니라 문서의 특정 예제와 관련된 의심에 대해 묻고 있습니다.


4
result의 다른 인스턴스를 참조하도록 변경할 수 없지만 참조 Address하는 인스턴스는 계속 수정할 수 있습니다. 다음과 같은 경우 Java에서도 마찬가지입니다.final Address result = new Address();
Michael


변수를 설명하는 Kotlin 웹 사이트가 변수를 언급하기에는 너무 어리석기
AndroidDev

답변:


239

코드에서 result변경되지 않고 var속성이 변경됩니다. 아래의 의견을 참조하십시오.

fun copyAddress(address: Address): Address {
    val result = Address() // result is read only
    result.name = address.name // but not their properties.
    result.street = address.street
    // ...
    return result
}

valfinaljava 의 수정 자 와 동일합니다 . 아시다시피 final변수에 다시 할당 할 수는 없지만 속성을 변경할 수 있습니다.


1
함수와 클래스 또는 기본 생성자의 val과 var는 다른 의미를 가지고 있습니까?

3
@No No, 어디서나 동일합니다.
chandil03

그러나 클래스에서 var로 변수를 선언하면 속성을 선언하기 때문에 초기화가 필요했습니다. 그러나 함수에서 왜 초기화가 필요하지 않습니까?

클래스가 메모리에로드 될 때 해당 속성도 평가되기 때문입니다. 그러나 함수 코드는 함수 코드가 실행될 때 평가됩니다.
chandil03

그 두 키워드 기능 내부 또는 클래스 내부의 평균 valvar속성을 선언하는 데 사용된다? 가변적이지 않습니까?

142

val그리고 var둘 다 변수를 선언하는 데 사용됩니다.

var일반 변수와 유사 하며 kotlin 에서 가변 변수라고하며 여러 번 할당 할 수 있습니다.

valFinal 변수와 유사 하며 kotlin 에서는 불변으로 알려져 있으며 한 번만 초기화 할 수 있습니다.

무엇 자세한 내용 valvar아래 링크를 참조하시기 바랍니다

http://blog.danlew.net/2017/05/30/mutable-vals-in-kotlin/


23

var로 정의 된 변수 는 변경 가능 (읽기 및 쓰기)

val로 정의 된 변수 는 변경할 수 없습니다 (읽기 전용)

Kotlin은 findViewById를 제거하고 android studio에서 setOnClickListener의 코드를 줄일 수 있습니다. 전체 참조 : Kotlin의 멋진 기능

변경 가능한 변수의 값은 언제든지 변경할 수 있지만 변경 불가능한 변수의 값은 변경할 수 없습니다.

var와 where val을 어디에서 사용해야합니까?

값이 자주 바뀌는 var를 사용하십시오. 예를 들어 안드로이드 장치의 위치를 ​​가져 오는 동안

var integerVariable : Int? = null

전체 클래스에서 가치에 변화가없는 곳에 val을 사용하십시오. 예를 들어 프로그래밍 방식으로 텍스트보기 또는 버튼의 텍스트를 설정하려고합니다.

val stringVariables : String = "Button's Constant or final Text"

17
"Kotlin은 android studio에서 findViewById를 제거하고 setOnClickListener의 코드를 줄일 수 있습니다. 전체 참조 : Kotlin 굉장한 기능"질문과 관련이있는 방법은 무엇입니까?
denvercoder9

4
val 변수가 반드시 불변 인 것은 아닙니다. 그것들은 최종적이며 참조 만 불변입니다. 그러나 val에 저장된 객체가 변경 가능하면 val 또는 var를 통해 할당되는지 여부에 관계없이 객체가 변경 가능합니다.
트래비스

Java에서 이전에 훨씬 더 잘 이해할 수있는 두 개의 새로운 키워드를 소개 할 시점이 보이지 않습니다
ruben

18

val최종 변수를 선언하는 데 사용합니다. val변수의 특성

  1. 초기화해야합니다
  2. 값을 변경하거나 재 할당 할 수 없습니다 여기에 이미지 설명을 입력하십시오

var 일반적인 변수입니다

  1. lateinit수정자를 사용하여 나중에 초기화 할 수 있습니다

    [ lateinit전역 변수에도 사용합니다. 지역 변수에는 사용할 수 없습니다]

  2. 값을 변경하거나 재 할당 할 수는 있지만 전역 범위에서는 할 수 없습니다

여기에 이미지 설명을 입력하십시오

valin kotlinfinal키워드 와 같습니다 . java


12

간단히 var (변경 가능) 및 val (Java (최종 수정 자)와 같은 변경 불가능한 값)

var x:Int=3
x *= x

//gives compilation error (val cannot be re-assigned)
val y: Int = 6
y*=y



11
+----------------+-----------------------------+---------------------------+
|                |             val             |            var            |
+----------------+-----------------------------+---------------------------+
| Reference type | Immutable(once initialized  | Mutable(can able to change|
|                | can't be reassigned)        | value)                    |
+----------------+-----------------------------+---------------------------+
| Example        | val n = 20                  | var n = 20                |
+----------------+-----------------------------+---------------------------+
| In Java        | final int n = 20;           | int n = 20;               |
+----------------+-----------------------------+---------------------------+

참고


8

다음과 같이 쉽게 생각할 수 있습니다.

var setter에 사용됩니다 (값이 변경됨).

val getter에 사용됩니다 (읽기 전용, 값은 변경되지 않음).


8

우리가 사용하는 변수를 선언하면 val다음이 될 것입니다 읽기 전용 변수를. 우리는 그 가치를 바꿀 수 없습니다. Java의 최종 변수 와 같습니다 . 그것은이다 .immutable

그러나 변수를 사용하여 선언하면 거나 var 수있는 변수가 됩니다. 우리는 그 가치를 바꿀 수 있습니다. 그것은이다 .mutable

data class Name(val firstName: String, var lastName: String)

fun printName(name: Name): Name {
    val myName = Name("Avijit", "Karmakar") // myName variable is read only
    // firstName variable is read-only. 
    //You will get a compile time error. Val cannot be reassigned.
    myName.firstName = myName.firstName
    // lastName variable can be read and write as it's a var.
    myName.lastName = myName.lastName
    return myName
}

val키워드에 의해 최근에 초기화 될 수 없지만 키워드에 의해 lateinit기본 var이 아닌 것이 초기화 될 수 있습니다 lateinit.


함수와 클래스 또는 기본 생성자의 val과 var는 다른 의미를 가지고 있습니까?

8

원래

  • var= variable 이므로 변경할 수 있습니다
  • val= value 이므로 변경할 수 없습니다.

8

코 틀린에 valA는 읽기 전용 특성 그것은 단지 게터에 액세스 할 수 있습니다. val불변입니다.

val 예 :

val piNumber: Double = 3.1415926
    get() = field

그러나 varA는 읽기와 쓰기 가 게터 만 아니라 세터에 의해뿐만 아니라 액세스 할 수 있도록 속성은. var변경할 수 있습니다.

var 예 :

var gravity: Double = 9.8
    get() = field
    set(value) { 
        field = value 
    }    

불변을 변경하려고하면 valIDE에 오류가 표시됩니다.

fun main() {    
    piNumber = 3.14          // ERROR
    println(piNumber)
}

// RESULT:   Val cannot be reassigned 

그러나 변경 가능 변수 var는 다음과 같습니다.

fun main() {    
    gravity = 0.0
    println(gravity)
}

// RESULT:   0.0

도움이 되었기를 바랍니다.


4

val 속성은 Java의 최종 속성과 유사합니다. 한 번만 값을 할당 할 수 있습니다. 두 번째 값으로 다시 할당하려고하면 컴파일 오류가 발생합니다. var 속성은 변경 가능하며 원하는 시간과 원하는 시간에 자유롭게 다시 할당 할 수 있습니다.


4

변수를 변경하거나 영구적으로 설정해야합니까?

  • 이 같은 경우 좋은 예 발에 pi5places = 3.14159 당신이로 설정합니다가 val. 지금 또는 나중에 해당 변수를 변경해야 할 가능성이 있습니까? 그런 다음 변수를 var로 설정하십시오.

  • 예를 들어 , 자동차의 색상은 다음과 같습니다var colorCar = green . 나중에을 (를) 변경할 수없는 colorCar = blue위치로 변경할 val수 있습니다.

  • 답변은 여기에 관한 mutableimmutable괜찮지 만, 이러한 용어는 잘 알려진 방법이나 프로그램을 바로 학습에 들어가기하지 않으면 무서운 될 수있다.


3

val변수에 대한 값은 한 번만 지정할 수 있습니다.

val address = Address("Bangalore","India")
address = Address("Delhi","India") // Error, Reassigning is not possible with val

값을 다시 할당 할 수는 없지만 객체의 속성을 확실히 수정할 수 있습니다.

//Given that city and country are not val
address.setCity("Delhi") 
address.setCountry("India")

즉, 변수가 가리키는 객체 참조는 변경할 수 없지만 해당 변수의 기본 속성은 변경할 수 있습니다.

var 변수에 대한 값은 원하는 횟수만큼 재 할당 할 수 있습니다.

var address = Address("Bangalore","India")
address = Address("Delhi","India") // No Error , Reassigning possible.

분명히, 기본 속성은 val로 선언되지 않는 한 변경 될 수 있습니다.

//Given that city and country are not val
address.setCity("Delhi")
address.setCountry("India")


2

valconstant변수 와 마찬가지로 자체는 변경할 수 없으며 읽을 수만 있지만 속성은 val수정할 수 있습니다. var다른 프로그래밍 언어의 돌연변이 변수처럼.


2

val 은 불변이며 최종이며 첫 번째 할당 된 값은 변경할 수 없습니다.

val name:String = "andy"

name = "thomas" //Error: Val cannot be reassigned

var 는 변경 가능하고 재 할당 가능하며 계속해서 값을 변경할 수 있습니다.

val a:Int = 1
var b:Int = 1
println("${a + b}") // output 2

b = 4
println("${a + b}") // output 5

나는 그것을 기억하는 가장 쉬운 방법을 생각합니다 :

val = 가변 최종

var = 변수 재 할당 가능 또는 val의 반대.


봇을 차별화하는 방법이 아니라 두 가지의 차이점에 대한 질문입니다. 아래 링크를 통해 좋은 답변을 올리십시오. stackoverflow.com/help/how-to-answer
Prasoon Karunan V

많은 사람들이 대답하고 있지만 동일한 대답을 선호합니다. Kotlin을 처음 사용하는 사람들에게는 val과 var가 동일하게 들립니다. 따라서 차별화 방법과 예를 들어 설명해야합니다. 하지만 네 조언을 드리겠습니다. 감사.
Wahyu Anggara Raya

1

둘, val그리고 var변수 (로컬 및 클래스 속성을) 선언에 사용할 수 있습니다.

지역 변수 :

  1. val한 번만 할당 할 수 있지만 재 할당 할 수없는 읽기 전용 변수를 선언합니다 .

예:

val readonlyString = “hello”
readonlyString = “c u” // Not allowed for `val`
  1. varJava에서 지정할 수있는 변수를 선언합니다 (키워드는 Java 10, "local variable type inference"에 도입 됨 ).

예:

var reasignableString = “hello”
reasignableString = “c u” // OK

항상 사용하는 것이 좋습니다 val. var가능한 자주 피 하십시오!

클래스 속성 :

클래스 내에서 속성 을 정의하기 위해 두 키워드도 사용됩니다 . 예를 들어 다음을 살펴보십시오 data class.

data class Person (val name: String, var age: Int)

Person필드에는 두 개의 필드가 있으며 그 중 하나는 읽기 전용 ( name)입니다. 는 age제공된 통해 다른 한편, 클래스 인스턴스 후에 재 할당 될 수있다 setter. 참고 name해당 setter 메소드이 없습니다.


1

두 변수는 초기화로 사용됩니다

  • val은 상수 변수처럼 읽을 수 있으며 val의 속성을 수정할 수 있습니다.

  • 가변 변수처럼 var. 언제든지 값을 변경할 수 있습니다.


1

간단히 말해서, val 변수는 최종 (변경 불가능)이거나 미래에 변경되지 않는 상수 값이며 var 변수 (변경 가능)는 나중에 변경 될 수 있습니다.

class DeliveryOrderEvent(val d : Delivery)
// Only getter

위의 코드를 참조하십시오. 모델 클래스이며 데이터 전달에 사용됩니다. 이 변수는 데이터를 얻는 데 사용 되었으므로 변수 앞에 val 을 설정했습니다 .

class DeliveryOrderEvent(var d : Delivery)

// setter and getter is fine here. No error

또한 나중에 데이터를 설정 해야하는 경우 변수 앞에 var 키워드 를 사용해야 합니다. 값을 한 번만 얻은 다음 val 키워드 를 사용하십시오


1

표준

  • ValstaticJava에서와 같이 필드를 사용 하고 있습니다.Static Keyword

  • 마찬가지로 Static코 틀린 같이 자바 / 동일

  • 그리고 VarKotlin에서 Variable Field를 나타내면 변경할 수 있습니다.

  • 대부분 Static정적 메모리에 값을 한 번에 저장하려고 할 때 사용됩니다.

예:

 if you assign

 val a=1
 a=3  You can not change it 
  • 변경할 수 없습니다. 최종 값이며 정적입니다.

    var b=2

    b=4 U는 바꿀 수있어


1

val : 값을 추가하거나 초기화해야하지만 변경할 수 없습니다. var : 코드의 모든 줄에서 변수를 변경할 수 있습니다.


1

kotlin에서는 변수를 두 가지 유형으로 선언 할 수 있습니다 : valvar. val재 할당 할 수 없으면 최종 변수로 작동합니다.

val x = 2
x=3 // cannot be reassigned

다른 한편으로, var는 재 할당 될 수 있습니다.

var x = 2
x=3 // can be reassigned

0

둘 다 가변적이며 유일한 차이점은 가변 변수와 불변 변수이며 더 이상 차이가 없습니다. var는 Mutable 변수이고 val은 불변입니다. 간단한 언어에서 var는 초기화 후 값을 변경할 수 있습니다 .val은 상수이므로 값을 초기화 한 후에는 값을 변경할 수 없습니다.


0

val(값에서) : 변경할 수없는 참조. 로 선언 된 변수는 val초기화 후에 재 할당 할 수 없습니다. finalJava 의 변수에 해당합니다 .

var(변수에서) : 가변 참조. 이러한 변수의 값을 변경할 수 있습니다. 이 선언은 일반 (최종이 아닌) Java 변수에 해당합니다.


0

바르 수단 변수 사용 개체 저장 - 만약 'var에' 이 시간에 변경 될 수 있습니다.

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

fun main(args: Array<String>) {
    var a=12
    var b=13
    var c=12
    a=c+b **//new object 25**
    print(a)
}

Val값을 의미 합니다 -java의 '일정한' 과 같습니다. 'val'을 사용하여 객체를 저장하면 시간이 변경되지 않습니다.

예를 들어 :

fun main(args: Array<String>) {
    val a=12
    var b=13
    var c=12
    a=c+b **//You can't assign like that.it's an error.**
    print(a)
}

0

VAR은 응용 프로그램에서 시간이 지남에 따라 값이 변경되는 변수를 만드는 데 사용됩니다. VAL은 신속한 VAR과 동일하지만 VAL은 응용 프로그램에서 시간이 지남에 따라 값이 변경되지 않는 변수를 만드는 데 사용됩니다.


0

val-불변 (초기화되면 재 할당 할 수 없음)

var-가변 (값을 변경할 수 있음)

코 틀린에서-val n = 20 & var n = 20

자바에서-final int n = 20; & int n = 20;


0

var는 변경 가능한 변수이며 여러 번 할당 될 수 있으며 val은 변경 불가능한 변수이며 한 번만 초기화 할 수 있습니다.

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