Getters and Setters
var <propertyName>[: <PropertyType>] [= <property_initializer>] [<getter>] [<setter>] |
여기서 [ ]로 표시된 property_initializer, getter, setter은 선택사항입니다. 생략할 수 있다는 말입니다.
앞서 property를 공부할 때 다음과 같은 예제를 보았습니다.
class Person { var id: Int = 0 var name: String = "Suzuki" } |
getter, setter은 전혀 보이지 않습니다. 그런데 initializer는 사용했습니다. initializer을 생략을 하려면 어떻게 할 수 있을까요?
일단 initializer를 지워보면 Error:(22, 9) Property must be initialized or be abstract가 발생합니다.
따라서 abstract로 선언하는 방법이 있고 위와 같이 constructor의 파라미터로 옮길 수 있습니다.
abstract class Person { abstract var id: Int var name: String = "Suzuki" } |
or
class Person(var id: Int) { var name: String = "Suzuki" } |
property type도 생략할 수 있습니다. 단, initializer로 부터 type을 유추할 수 있을 때만 가능합니다.
class Person() { var id = 0 // var id: Int = 0 var name = "Suzuki" // var name: String = "Suzuki" } |
getter, setter는 생략되었는데 문제가 없는지 살펴봅시다. 위의 Person 클래스를 Java 코드로 Decompile 하면 다음과 같습니다.
Decomplie 하는 방법은 Tools > Kotlin > Show Kotlin Bytecode 선택 후 Kotlin Bytecode 창에서 Decompile을 누르시면 됩니다.
public static final class Person { private int id; @NotNull private String name = "Suzuki"; public final int getId() { return this.id; } public final void setId(int var1) { this.id = var1; } @NotNull public final String getName() { return this.name; } public final void setName(@NotNull String var1) { Intrinsics.checkParameterIsNotNull(var1, "<set-?>"); this.name = var1; } } |
코틀린 코드에서는 선언한 적이 없는 getter와 setter가 존재합니다. 이것으로 미루어 볼 때 코틀린에서는 기본적으로 getter와 setter를 선언할 필요가 없습니다.
property 사용 방법을 떠올려보면 getter와 setter를 사용하지 않고 변수명으로 직접 get/set을 하였습니다.
val student = Person() student.id = 10 // 직접 set을 하고 있음 println("student.name ${student.id}") // 직접 get 하고 있음 |
이것이 가능한 이유가 Java 코드로 Decompile 했을 때 getter/setter가 존재하기 때문이라는 것을 알 수 있습니다.
getter와 setter을 생략하지 않고 선언하는 방법도 있습니다.
class Person() { var id = 0 get() = 100 var name = "Suzuki" set(value) { field = "Kim" } } |
위 Decomplie 결과물을 참고하여 getter/setter를 추가했을 때의 코드를 Java 코드로 직접 변환해봅시다.
public static final class Person { private int id; @NotNull private String name = "Suzuki"; public final int getId() { return 100; } public final void setId(int var1) { this.id = var1; } @NotNull public final String getName() { return this.name; } public final void setName(@NotNull String value) { Intrinsics.checkParameterIsNotNull(value, "value"); this.name = "Kim"; } } |
이제 id의 getter는 100만 리턴해주고 name의 setter는 Kim으로만 assign을 합니다.
그럼 아무리 id의 값을 reassign 하더라도 student.id는 100을 리턴하게 됩니다. name은 아무리 reassign하더라도 Kim으로만 assign됩니다. 확인해볼까요?
class ExampleUnitTest { @Test fun kotlin() { var student = Person() student.name = "" student.id = 200 println("student.id ${student.id} student.name ${student.name}") } class Person() { var id = 0 get() = 100 var name = "Suzuki" set(value) { field = "Kim" } } } |
student.id 100 student.name Kim |
'프로그래밍 > Kotlin' 카테고리의 다른 글
코틀린(Kotlin) 함수(function) #1 (0) | 2017.12.13 |
---|---|
코틀린(Kotlin) 추상클래스 & 인터페이스 (0) | 2017.12.11 |
코틀린 Getters and Setters #2 (0) | 2017.12.10 |
코틀린(Kotlin) 클래스 상속 (0) | 2017.12.09 |
코틀린(Kotlin) 클래스 선언 방법 #3 (0) | 2017.12.08 |
코틀린(Kotlin) 클래스 선언 방법 #2 (0) | 2017.12.07 |
코틀린(Kotlin) 클래스 선언 방법 #1 (0) | 2017.12.05 |