본문 바로가기

kotlin

var 와 val

var 와 val



kotlin의 기본적인 변수 var 와 val 에 대해 살펴보자.


intelij에 Search Everywhere(shift 연속으로 두번)을 누르고 Show Kotlin Bytecode 를 입력하면 코틀린 코드에 대한 바이트코드


를 볼 수 있다.





이를 통하여 Kotlin의 변수 var, val이 어떻게 다른지 decompile된 자바코드로 확인해보자.




class A {

var a : String = "aaa"



먼저 전역 변수로 선언한 var 변수의 경우이다.



public final class A {
@NotNull
private String a = "aaa";

@NotNull
public final String getA() {
return this.a;
}

public final void setA(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.a = var1;
}
}


선언된 프로퍼티의 필드는 private를 통해 외부 접근으로부터 보호된다.


보이는 바와 같이 getter, setter 와 같은 프로퍼티가 생성이 되는것이 볼 수 있다. setter를 통한 write와 getter를 통한 read 를 이용


하여 필드값에 접근 하는것을 볼 수 있다.



class A {

val a : String = "aaa"


자 이번엔 val 변수로 바꿔서 디컴파일한 결과를 보자


public final class A {
@NotNull
private final String a = "aaa";

@NotNull
public final String getA() {
return this.a;
}
}



getter 프로퍼티만 나와있는것을 볼 수 있다. 초기 세팅값으로 a 라는 변수가 박혀 있는것도 볼 수 있는데 


이를 통하여 var는 읽고 쓰는것이 가능한 변수 val은 읽는것만 가능한 변수 라는것을 직접 확인할 수 있다.



그렇다면 local variable(지역변수)는 어떻게 될까?



class A {

fun test(){

var a : String = "hello"
}

}



위의 예제 코드로 디컴파일을 진행하여 보았다.



public final class A {
public final void test() {
String a = "hello";
}
}



프로퍼티가 없이 자바에서 항상 선언하는 변수로 선언이 되는 것을 볼 수 있다. 이렇게 처리된 지역변수는 자유롭게 접근할 수도 있


지 않겠나 생각해 볼 수도 있겠지만 이미 언어 수준에서 값과 변수의 차이가 처리되므로 지역변수의 수정과 접근은 불가하다.










'kotlin' 카테고리의 다른 글

Any , 타입변환  (0) 2018.12.06
asList와 toList  (0) 2018.12.04
Kotlin의 유용한 함수 - let, apply, run, with  (0) 2018.12.04
constructor와 init  (0) 2018.12.03
kotlin의 코드생성 목적과 언어 설계  (0) 2018.12.03