Web/Kotlin

[Kotlin] 내부 프로퍼티의 Setter만 막는 2가지 방법

 

외부에서 변경(setter)을 막기 위한 변수가 필요할 때가 있습니다.

그리고 코틀린에서는 생성자에서 val로 변수를 선언하면 자동으로 getter만 지원합니다.

 

하지만 생성자에 노출되지 않고 내부에서만 사용하는 프로퍼티에서 setter만 막고 getter만 지원하고 싶다면 어떻게 해야할까요?

 

이번 포스팅은 내부에서만 사용하는 프로퍼티에서 setter만 막고 getter만 지원하기 위한 2가지 방법을 소개하고 이 둘의 차이점을 설명합니다.

 

 

private set

data class Game(val words: Words, val date: LocalDate) {

    var count: Int = 0
        private set
        
    ...

 

count는 생성자로 직접 주입해주지 않고 내부에서만 사용되는 변수이지만, getter가 제공됩니다.

하지만 내부에서만 사용하고, 변경을 허용하지 않으므로 setter는 닫아야 합니다.

 

이때 private set 키워드를 변수선언 아래에 붙이면 외부에 setter를 허용하지 않을 수 있습니다.

 

 

 

 

Backing Properties

class Game(private val words: Words, val maxGameCount: Int) {

    ...
    private var _results: MutableList<List<Tile>> = mutableListOf()

    val results: List<List<Tile>>
        get() = _results
	...

 

List를 반환할땐 외부에서 데이터의 수정이 일어나면 안됩니다.

 

위 코드에서 _results는 MutableList로 선언되어 내부에선 변경가능한 List로 사용을 합니다.

만약 외부에서 이 result 데이터가 필요해 제공해야 한다면, 변경이 불가능한 List로 반환해야 합니다.

 

 

 

Backing Properites를 사용하면 get()이나 set()에 로직도 추가가 가능합니다.

var statusCode: Int = 100
    set(value) {
        if (value in 100..599) statusCode = value
    }
    ...
class Rectangle(val width: Int, val height) {
  val isSquare : Boolean
    get() {
      return width == height
    }
}

 

 

 

 

 

 

정리

 

사용하던 변수를 그대로 리턴해도 된다면 private set()으로 변수의 setter만 막자

 

만약 사용하던 변수에 로직에 추가되며 반환해야 한다면 Backing Proerties (get(), set())을 사용하자