[Kotlin] Backing Properties

Hanbinยท2021๋…„ 7์›” 30์ผ
1

Kotlin

๋ชฉ๋ก ๋ณด๊ธฐ
1/3
post-thumbnail

๐Ÿค” ์™œ์ผ๊นŒ?

Android ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ViewModel ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” Backing Properties์— ๋Œ€ํ•œ ๊ถ๊ธˆ์ ์ด ์ƒ๊ฒผ๋‹ค.

๊ตฌ๊ธ€์ƒ˜ํ”Œ์—์„œ ์ฐธ๊ณ ํ–ˆ์„ ๋•Œ ์•„๋ž˜ ์ฝ”๋“œ๋Š” ํ™”๋ฉด์˜ ๋กœ๋”ฉ ๋…ธ์ถœ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ์ด๋‹ค

    private val _dataLoading = MutableLiveData<Boolean>()
    val dataLoading: LiveData<Boolean> = _dataLoading
    
    private val _dataLoading = MutableLiveData<Boolean>()
    val dataLoading: LiveData<Boolean> 
    	get() = _dataLoading

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์€ ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ์„๊นŒ?

๐Ÿ” ์ฐพ์•„๋ณด์ž

1. ๊ธฐ๋ณธ setter๋ฅผ ์ด์šฉํ•œ ๊ฐ’ ์„ค์ •

    private val _dataLoading = MutableLiveData<Boolean>()
    val dataLoading: LiveData<Boolean> = _dataLoading

์œ„์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ดˆ๊ธฐํ™”๋  ๋‹น์‹œ dataLoading์— _dataLoading๋ฅผ ์„ธํŒ…ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

2. Custom getter๋ฅผ ์ด์šฉํ•œ ๊ฐ’ ์„ค์ •

   private val _dataLoading = MutableLiveData<Boolean>()
   val dataLoading: LiveData<Boolean> 
   	get() = _dataLoading

์œ„์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด dataLoading์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ _dataLoading๋ฅผ return ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

3. 2๊ฐ€์ง€ ๋ฐฉ์‹ ๋น„๊ต

์œ„์˜ ์˜ˆ์‹œ์™€ ๋‹ฌ๋ฆฌ _dataLoading์ด ๊ฐ€๋ณ€์ด๊ณ  ์žฌ์ƒ์„ฑ ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

2๋ฒˆ ๋ฐฉ์‹์—์„œ๋Š” dataLoading์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ _dataLoading ์ž์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์ƒ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด์— 1๋ฒˆ ๋ฐฉ์‹์—์„œ๋Š” ์ดˆ๊ธฐํ™” ๋‹น์‹œ์˜ _dataLoading์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์ƒ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ๋Š” ์–ป์„ ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค.

๐Ÿงช ์ง์ ‘ ํ•ด๋ณด์ž

๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.

  class BackingPropertiesTest {

      private var _user = User("์ด๋ฆ„")
      private val user1 = _user
      private val user2
          get() = _user

      @Test
      fun test() {
          println("user1: $user1")
          println("user2: $user2")
          println("_user: ์žฌ์ƒ์„ฑ")
          _user = User("์ด๋ฆ„๋ณ€๊ฒฝ")
          println("user1: $user1")
          println("user2: $user2")
      }

      data class User(var name: String)
  }
  
  // ์‹คํ–‰๊ฒฐ๊ณผ
  user1:: User(name=์ด๋ฆ„)
  user2: User(name=์ด๋ฆ„)
  _user: ์žฌ์ƒ์„ฑ
  user1: User(name=์ด๋ฆ„)
  user2: User(name=์ด๋ฆ„๋ณ€๊ฒฝ)

user1์€ ์ดˆ๊ธฐํ™” ๋‹น์‹œ์˜ User๋ฅผ return ํ•  ๊ฒƒ์ด๊ณ , user2๋Š” _user ์ž์ฒด๋ฅผ return ํ•  ๊ฒƒ์ด๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด ๋ดค์œผ๋‹ˆ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‚ดํŽด๋ณด์ž.

๋จผ์ € user1์„ ์‚ดํŽด๋ณด๋ฉด private final BackingPropertiesTest.User user1; ๋งด๋ฒ„๋ฒˆ์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ๊ณ , public BackingPropertiesTest() { this.user1 = this._user; } ์ดˆ๊ธฐํ™” ๋‹น์‹œ์— _user๋ฅผ ํ• ๋‹นํ•ด ์ฃผ๊ณ  ์žˆ๋‹ค.

user2๋ฅผ ์‚ดํŽด๋ณด๋ฉด private final BackingPropertiesTest.User getUser2() { return this._user; } ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ _user๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ๋‹ค.

๐Ÿ™ ๋งˆ์น˜๋ฉฐ

์ด์ œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์˜ ์ฐจ์ด์ ์„ ํ™•์—ฐํžˆ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€