-
[Kotlin] getter/setter 를 만들지 말자Kotlin 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는 만들지 않는것이 좋을것 같다.
반응형