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 |