getter 와 setter에 대해 알아보자
class Test1 {
val test1: Int = 0
var test2: Int? = null
}
위와 같은 코드를 Java로 변환해보자
Android Studio에서 Tools > Kotlin > show Kotlin ByteCode를 통해 확인 할 수 있다.
public final class Test1 {
private final int test1;
@Nullable
private Integer test2;
public final int getTest1() {
return this.test1;
}
@Nullable
public final Integer getTest2() {
return this.test2;
}
public final void setTest2(@Nullable Integer var1) {
this.test2 = var1;
}
}
val로 선언된 변수는 get함수만 생기고
var로 선언된 변수는 get과 set 함수가 같이 생긴다.
즉 코틀린에서는 변수 선언 방식에 따라 getter/setter이 자동으로 생성된다
위와 같이 같은 방식외에도 직접 임의의 getter와 setter를 지정해 줄수도 있다.
class Test2 {
var test: Int? = null
get() = field
set(value) {
field = if (value == null) null else (value * 2)
}
init {
test = 545
println(test)
}
}
위와 같은 예제가 있다고 하자
get할시에는 test의 값을 가져오고
set을 할시에는 null이면 null값을 이외에는 들어온값에 2배를 넣도록 하엿다.
위 class에서는 test= 545로 초기화 해주므로 println(test)에서는 1090이 나옴을 알 수 있다.
public final class Test2 {
@Nullable
private Integer test;
@Nullable
public final Integer getTest() {
return this.test;
}
public final void setTest(@Nullable Integer value) {
this.test = value == null ? null : value * 2;
}
public Test2() {
this.setTest(545);
Integer var1 = this.getTest();
System.out.println(var1);
}
}
자바로 변환된 코드를 보면 우리가 지정한 되로 get과 set함수가 만들어 졌음을 알 수 있다.
작업을 하다보면 두가지 형태를 본적이 있을 것이다. 두형태는 뭐가 다를까?
val a :Int = 1
val a :Int
get() = 1
아래 와 같이 정의하고 java로 바꾸어 보자
class Test3 {
var number = 4
val getterNumber
get() = number
val localNumber = number
}
public final class Test3 {
private int number = 4;
private final int localNumber;
public final int getNumber() {
return this.number;
}
public final void setNumber(int var1) {
this.number = var1;
}
public final int getGetterNumber() {
return this.number;
}
public final int getLocalNumber() {
return this.localNumber;
}
public Test3() {
this.localNumber = this.number;
}
}
그렇다면 여기서 추가적인 작업을 해보자 init에 다음과 같은 추가작업을 하였다 결과는?
init {
println(getterNumber)
println(localNumber)
number += 1000
println(getterNumber)
println(localNumber)
}
Test3 실행해보기
결과는 아래와 같이
4
4
1004
4
이다 그이유는 getterNumber의 경우 number의값이 반환되므로 number가 바뀌면 변화가 생기지만
localNumber이 경우 number의 값으로 최초 초기화가 됬을뿐 get은 localNumber의 값을 반환한다.
감사합니다.