Kotlin
[Kotlin] getter/setter 를 만들지 말자
익세망
2022. 1. 23. 13:08
Kotlin의 var과 val은 프로퍼티기 때문에 getter와 setter를 포함하고 있다.
이것이 어떻게 동작되는지 Java로 Decompile 시켜서 확인해보자
Java decompile
class Person {
val gender = "male"
var age = 3
}
위의 클래스를 Java로 변환시키면
public final class Person {
@NotNull
private final String gender = "male";
private int age = 3;
@NotNull
public final String getGender() {
return this.gender;
}
public final int getAge() {
return this.age;
}
public final void setAge(int var1) {
this.age = var1;
}
}
이런 형태로 Decompile 되는것을 볼 수 있다.
Java에서 직접 getter와 setter를 만들어 사용 하던것과 완전히 동일하다.
val의 경우는 불변객체이기 때문에 setter가 제공되지 않는다.
접근제어자
프로퍼티 앞에 붙히는 접근제어자는 getter와 setter의 접근제어자에 해당이 된다.
private getter/setter는 무의미한 동작이기 때문에 생성되지 않는다.
실제 변수의 접근제어자는 무조건 private이다.
class Person {
private val gender = "male"
protected var age = 3
}
public final class Person {
private final String gender = "male";
private int age = 3;
protected final int getAge() {
return this.age;
}
protected final void setAge(int var1) {
this.age = var1;
}
}
Custom getter/setter
getter/setter를 custom하게 사용하고 싶은 경우도 있을 것이다.
class Person {
val gender: String
get() = "male$age"
var age: Int = 3
get() {
return field + 1
}
set(value) {
field = value + 1
}
}
gender의 get() = 처럼 한줄로 작성할 수도 있고
get() { } 형태로 블럭으로 작성할 수도 있다.
field는 자기자신을 가르키는 변수이다.
Decompile 된 결과는 다음과 같다.
public final class Person {
private int age = 3;
private final String getGender() {
return "male" + this.getAge();
}
public final int getAge() {
return this.age + 1;
}
public final void setAge(int value) {
this.age = value + 1;
}
}
gender의 값을 확인해보면 custom getter를 만든대로 실행 되는것을 볼 수 있다.
fun main() {
println(Person().gender) // male4
}
제목에는 getter와 setter를 쓰지 말자고 적었지만
코드를 작성하다보면 사용해야 하는 곳이 있을 수도 있다.
하지만 Java를 사용하던 것 처럼 변수만 반환, 설정하는
getter/setter는 만들지 않는것이 좋을것 같다.
반응형