파라오 슬롯 brunch

You can make anything
by writing

C.S.Lewis

코틀린 Getters and Setters #1

빠르게 살펴보기

Getters and Setters


코틀린에서 property를 선언할 때 생략 없는 full syntax는 다음과 같습니다.


var <propertyName[: <PropertyType] [= <property_initializer]

06

[<setter]


여기서 [ ]로 표시된 property_initializer, getter, setter은 선택사항입니다. 생략할 수 있다는 말입니다.


앞서 property를 공부할 때 다음과 같은 예제를 보았습니다.


class Person {

var 파라오 슬롯: Int = 0

var name: String = 파라오 슬롯;Suzuki파라오 슬롯;

}


getter, setter은 전혀 보이지 않습니다.그런데 initializer는 사용했습니다. initializer을 생략을 하려면 어떻게 할 수 있을까요?

일단 initializer를 지워보면 Error:(22, 9) Property must be initialized or be abstract가 발생합니다.

파라오 슬롯Alt + Enter로 Error 수정하기


따라서 abstract로 선언하는 방법이 있고 위와 같이 constructor의 파라미터로 옮길 수 있습니다.


abstract class Person {

abstract var 파라오 슬롯: Int

09

}


or


class Person(var 파라오 슬롯: Int) {

var name: String = 파라오 슬롯;Suzuki파라오 슬롯;

}


property type도 생략할 수 있습니다. 단, initializer로부터 type을 유추할 수 있을 때만 가능합니다.


class Person() {

var 파라오 슬롯 = 0 // var 파라오 슬롯: 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 파라오 슬롯;

@NotNull

private String name = 파라오 슬롯;Suzuki파라오 슬롯;;

public final int get파라오 슬롯(){

return this.파라오 슬롯;

}

public final vo파라오 슬롯 set파라오 슬롯(int var1){

this.파라오 슬롯 = var1;

}

@NotNull

public final String getName(){

return this.name;

}

public final vo파라오 슬롯 setName(@NotNull String var1){

Intrinsics.checkParameterIsNotNull(var1, 파라오 슬롯;<set-?파라오 슬롯;);

this.name = var1;

}

}


코틀린 코드에서는 선언한 적이 없는 getter와 setter가 존재합니다. 이것으로 미루어 볼 때 코틀린에서는 기본적으로 getter와 setter를 선언할 필요가 없습니다.


property 사용 방법을 떠올려보면 getter와 setter를 사용하지 않고 변수명으로 직접 get/set을 하였습니다.


val student = Person()

student.파라오 슬롯 = 10 // 직접 set을 하고 있음

println(파라오 슬롯;student.name ${student.id}파라오 슬롯;) // 직접 get 하고 있음



이것이 가능한 이유가 Java 코드로 Decompile 했을 때 getter/setter가 존재하기 때문이라는 것을 알 수 있습니다.


getter와 setter을 생략하지 않고 선언하는 방법도 있습니다.


class Person() {

var 파라오 슬롯 = 0

get() = 100

var name = 파라오 슬롯;Suzuki파라오 슬롯;

set(value) {

07= 파라오 슬롯;Kim파라오 슬롯;

}

}



위 Decomplie 결과물을 참고하여 getter/setter를 추가했을 때의 코드를 Java 코드로 직접 변환해봅시다.


public static final class Person {

private int 파라오 슬롯;

@NotNull

private String name = 파라오 슬롯;Suzuki파라오 슬롯;;


public final int get파라오 슬롯() {

return 100;

}


public final vo파라오 슬롯 set파라오 슬롯(int var1) {

this.파라오 슬롯 = var1;

}


@NotNull

public final String getName() {

return this.name;

}


public final vo파라오 슬롯 setName(@NotNull String value) {

Intrinsics.checkParameterIsNotNull(value, 파라오 슬롯;value파라오 슬롯;);

this.name = 파라오 슬롯;Kim파라오 슬롯;;

}

}



이제 파라오 슬롯의 getter는 100만 리턴해주고 name의 setter는 Kim으로만 assign을 합니다.

그럼 아무리 파라오 슬롯의 값을 reassign 하더라도 student.파라오 슬롯는 100을 리턴하게 됩니다. name은 아무리 reassign하더라도 Kim으로만 assign 됩니다. 확인해볼까요?


fun main() {
var student = Person()
student.name = 파라오 슬롯;파라오 슬롯;
student.파라오 슬롯 = 200

println(파라오 슬롯;student.id ${student.id} student.name ${student.name}파라오 슬롯;)
}

class Person() {
var 파라오 슬롯 = 0
get() = 100
var name = 파라오 슬롯;Suzuki파라오 슬롯;
set(value) {
field= 파라오 슬롯;Kim파라오 슬롯;
}
}



student.파라오 슬롯 100 student.name Kim


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari