{"id":733,"date":"2020-10-27T11:41:53","date_gmt":"2020-10-27T02:41:53","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=733"},"modified":"2025-09-12T17:41:43","modified_gmt":"2025-09-12T08:41:43","slug":"android-viewmodel-livedata","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2020\/10\/27\/733\/","title":{"rendered":"Android: ViewModel &#038; LiveData"},"content":{"rendered":"\n<p> ViewModel\uc740 Android Architecture Component\uc911 \ud558\ub098\ub85c android jetpack\ub77c\uc774\ube0c\ub7ec\ub9ac \ud615\ud0dc\ub85c \uc9c0\uc6d0\ud55c\ub2e4. \uc55e\uc11c \uc598\uae30\ud588\ub4ef\uc774, MVVM \ubaa8\ub378\uc758 ViewModel\uc744 \uad6c\ud604\ud558\ub294\ub370 \uc0ac\uc6a9\ub41c\ub2e4. Activity, Fragment\ub4e4\uc774 UI Controller\ub85c\uc11c XML\uacfc \ud568\uaed8 \ud654\uba74 rotation\uc758 \uacbd\uc6b0\ucc98\ub7fc UI\uac00 destroy-create\ub418\ub294 \uc0c1\ud669\uc5d0\uc11c\ub3c4, ViewModel\uc740 data\ub97c \ub4e4\uace0 \uc644\uc804\ud788 finished \ub418\uae30 \uc804\uae4c\uc9c0 \uc720\uc9c0\ud558\uac8c \ub41c\ub2e4. <\/p>\n\n\n\n<p> ViewModel\uc740 \uc5b4\uca0c\ub4e0 UI Activity\ub098 Fragment\uc5d0 \ub300\uc751\ud558\uace0 UI\uac00 \uc644\uc804\ud788 finished\ub418\uba74, \uac19\uc774 destory\ub418\uae30 \ub54c\ubb38\uc5d0 lifecycle\uc758\uc874\ub3c4\uac00 \uc788\uace0,  lifecycle\ud328\ud0a4\uc9c0 \uc544\ub798\uc5d0 \uc874\uc7ac\ud55c\ub2e4. \uc0ac\uc6a9\ud558\ub824\uba74, build.gradle \ud30c\uc77c\uc5d0 androidx\uc758 \ub2e4\uc74c \ud328\ud0a4\uc9c0\ub97c \ucd94\uac00\ud55c\ub2e4. \ubc84\uc804\uc774\ub098 \uc815\ud655\ud55c \uc774\ub984\uc740 <a href=\"https:\/\/developer.android.com\/jetpack\/androidx\/releases\/lifecycle#declaring_dependencies\">lifecycle\uc758 \ub9b4\ub9ac\uc988 \ub178\ud2b8\ubd80\ubd84\uc744 \ucc38\uace0<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>android {\n    dependencies {\n    ...\n        implementation \"androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0\"<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCBDFB\">android<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">dependencies<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        implementation <\/span><span style=\"color: #96D0FF\">&quot;androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0&quot;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>ViewModel \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc\uac19\uc774 \uc0c1\uc18d\ubc1b\uc544 \uc815\uc758\ud55c\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.android.guesstheword.screens.game\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\n\nclass GameViewModel : ViewModel() {\n    init{\n        Log.i(\"GameViewModel\", \"GameViewModel created!\")\n    }\n\n    override fun onCleared() {\n        super.onCleared()\n        Log.i(\"GameViewModel\", \"GameViewModel destroyed\")\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">package<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">com.example.android.guesstheword.screens.game<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">import<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">android.util.Log<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">import<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">androidx.lifecycle.ViewModel<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">GameViewModel<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">ViewModel<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">init<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        Log.<\/span><span style=\"color: #DCBDFB\">i<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;GameViewModel&quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;GameViewModel created!&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onCleared<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">onCleared<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        Log.<\/span><span style=\"color: #DCBDFB\">i<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;GameViewModel&quot;<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #96D0FF\">&quot;GameViewModel destroyed&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>onCleared() \uba54\uc18c\ub4dc\ub294 viewmodel\uc774 \ub354\uc774\uc0c1 \ud544\uc694\ud558\uc9c0 \uc54a\uc544 \uc81c\uac70\ub420 \ub54c \ud638\ucd9c\ub41c\ub2e4.<\/p>\n\n\n\n<p>Fragment\uc0ac\uc6a9\uc2dc, \uac01 Fragment\ub2f9 \ud558\ub098\uc758 viewmodel\uc774 \ud544\uc694\ud558\ub2e4. Fragment\uc5d0\uc11c viewmodel\uc744 \uc0dd\uc131\ud558\uba74, destroy\uc2dc \uac19\uc774 \uc5c6\uc5b4\uc9c0\ubbc0\ub85c ViewModelProvider\ub97c \uc774\uc6a9\ud574 \uc778\uc2a4\ud134\uc2a4\ub97c \uc0dd\uc131\ud55c\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class GameFragment : Fragment() {\n    private lateinit var viewModel: GameViewModel\n...\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,\n                              savedInstanceState: Bundle?): View? {\n\n                viewModel = ViewModelProvider(this).get(GameViewModel::class.java)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">GameFragment<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">Fragment<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">lateinit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> viewModel: <\/span><span style=\"color: #F69D50\">GameViewModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onCreateView<\/span><span style=\"color: #ADBAC7\">(inflater: <\/span><span style=\"color: #F69D50\">LayoutInflater<\/span><span style=\"color: #ADBAC7\">, container: <\/span><span style=\"color: #F69D50\">ViewGroup<\/span><span style=\"color: #ADBAC7\">?,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                              savedInstanceState: <\/span><span style=\"color: #F69D50\">Bundle<\/span><span style=\"color: #ADBAC7\">?): <\/span><span style=\"color: #F69D50\">View<\/span><span style=\"color: #ADBAC7\">? {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                viewModel <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">ViewModelProvider<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">).<\/span><span style=\"color: #DCBDFB\">get<\/span><span style=\"color: #ADBAC7\">(GameViewModel::<\/span><span style=\"color: #DCBDFB\">class<\/span><span style=\"color: #ADBAC7\">.java)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>ViewModelProvider\ub294 ViewModel\uc774 \uc774\ubbf8 \uc874\uc7ac\ud558\uba74, \uadf8 \uc778\uc2a4\ud134\uc2a4\ub97c \ub3cc\ub824\uc8fc\uace0, \uc5c6\uc73c\uba74 \uc0c8\ub85c\uc0dd\uc131\ud55c\ub2e4. ViewModelProvider\uc5d0 \uc778\uc790\ub85c this\uac00 \ub118\uc5b4\uac00\uace0 \uc788\ub294\ub370, <a href=\"https:\/\/developer.android.com\/reference\/androidx\/lifecycle\/ViewModelProvider\">API\ubb38\uc11c<\/a>\ub97c \ubcf4\uba74, ViewModelStoreOwner \ub85c \uc0dd\uc131\ud558\ub294 ViewModel\uc758 \uc18c\uc720\uc790\ub97c \uc9c0\uce6d\ud55c\ub2e4. \uc18c\uc720\uc790\uc758 lifecycle\uc774 \uc644\uc804\ud788 \uc885\ub8cc\ub420 \ub54c, ViewModel\uc758 onCleared()\uac00 \ubd88\ub9ac\uba70 ViewModel\uc758 \uc778\uc2a4\ud134\uc2a4\ub3c4 \uac19\uc774 \uc18c\uba78\ub41c\ub2e4. <br> get()\uc758 \uc778\uc790\ub85c\ub294 GameViewModel\uc758 \ud074\ub798\uc2a4\ub97c \uc804\ub2ec\ud558\uace0 \uc788\ub2e4. <\/p>\n\n\n\n<p>\ub2f9\uc5f0\ud558\uac8c\ub3c4 viewmodel\uc5d0 UI \uc694\uc18c\uc758 \ub808\ud37c\ub7f0\uc2a4\uac00 \uc874\uc7ac\ud558\uba74 \uc548\ub41c\ub2e4. Fragment\ub294 \uc77c\uc2dc\uc801\uc73c\ub85c destroy\ub420 \uc218 \uc788\uace0, \uc774\ub807\uac8c\ub418\uba74 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \ub808\ud37c\ub7f0\uc2a4\ub97c \ub4e4\uace0\uc788\uac8c\ub41c\ub2e4.<\/p>\n\n\n\n<p> default ViewModel\uc740 \uc0dd\uc131\uc790\uc5d0 \uc778\uc790\uac00 \uc5c6\ub2e4. Fragment \uc0ac\uc774\uc5d0 \uac12\uc744 \uc8fc\uace0\ubc1b\ub294\uacbd\uc6b0, ViewModel\uc0dd\uc131\uc2dc\uc5d0\ub3c4 \uac12\uc744 \uc804\ub2ec\ud574\uc57c \ud558\ub294\ub370, \uc778\uc790\uac00 \ucd94\uac00\ub41c \uc0dd\uc131\uc790\uac00 \ud544\uc694\ud55c \uacbd\uc6b0\ub97c \uc704\ud574 ViewModelProvider\uc5d0\uc11c ViewModel Factory\ub97c \uc81c\uacf5\ud55c\ub2e4. ViewModelProvider.Factory\ub97c \uc0c1\uc18d\ubc1b\uc544 create() \ud568\uc218\ub97c override\ud574\uc11c Custom Factory\ub97c \ub9cc\ub4e4\uace0, ViewModel\uc744 \uac00\uc838\uc62c \ub54c, Factory\ub3c4 \uc778\uc790\ub85c \ub118\uaca8\uc8fc\uac8c\ub41c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package com.example.android.guesstheword.screens.score\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\n\nclass ScoreViewModelFactory(private val finalScore: Int): ViewModelProvider.Factory {\n    override fun &lt;T : ViewModel?> create(modelClass: Class&lt;T>): T {\n        if(modelClass.isAssignableFrom(ScoreViewModel::class.java)){\n            return ScoreViewModel(finalScore) as T\n        }\n        throw IllegalArgumentException(\"Unknown ViewModel class\")\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">package<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">com.example.android.guesstheword.screens.score<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">import<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">androidx.lifecycle.ViewModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">import<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">androidx.lifecycle.ViewModelProvider<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">ScoreViewModelFactory<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> finalScore: <\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">): <\/span><span style=\"color: #F69D50\">ViewModelProvider<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">Factory<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> &lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">ViewModel<\/span><span style=\"color: #ADBAC7\">?&gt; <\/span><span style=\"color: #DCBDFB\">create<\/span><span style=\"color: #ADBAC7\">(modelClass: <\/span><span style=\"color: #F69D50\">Class<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\">&gt;): <\/span><span style=\"color: #F69D50\">T<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\">(modelClass.<\/span><span style=\"color: #DCBDFB\">isAssignableFrom<\/span><span style=\"color: #ADBAC7\">(ScoreViewModel::<\/span><span style=\"color: #DCBDFB\">class<\/span><span style=\"color: #ADBAC7\">.java)){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">ScoreViewModel<\/span><span style=\"color: #ADBAC7\">(finalScore) <\/span><span style=\"color: #F47067\">as<\/span><span style=\"color: #ADBAC7\"> T<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">throw<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">IllegalArgumentException<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Unknown ViewModel class&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class ScoreFragment : Fragment() {\n\n    private lateinit var viewModel: ScoreViewModel\n    private lateinit var viewModelFactory: ScoreViewModelFactory\n...\n    override fun onCreateView(\n            inflater: LayoutInflater,\n            container: ViewGroup?,\n            savedInstanceState: Bundle?\n    ): View? {\n...\n        viewModelFactory = ScoreViewModelFactory(ScoreFragmentArgs.fromBundle(requireArguments()).score)\n        viewModel = ViewModelProvider(this, viewModelFactory).get(ScoreViewModel::class.java)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">ScoreFragment<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">Fragment<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">lateinit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> viewModel: <\/span><span style=\"color: #F69D50\">ScoreViewModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">lateinit<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> viewModelFactory: <\/span><span style=\"color: #F69D50\">ScoreViewModelFactory<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">onCreateView<\/span><span style=\"color: #ADBAC7\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            inflater: <\/span><span style=\"color: #F69D50\">LayoutInflater<\/span><span style=\"color: #ADBAC7\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            container: <\/span><span style=\"color: #F69D50\">ViewGroup<\/span><span style=\"color: #ADBAC7\">?,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            savedInstanceState: <\/span><span style=\"color: #F69D50\">Bundle<\/span><span style=\"color: #ADBAC7\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    ): <\/span><span style=\"color: #F69D50\">View<\/span><span style=\"color: #ADBAC7\">? {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        viewModelFactory <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">ScoreViewModelFactory<\/span><span style=\"color: #ADBAC7\">(ScoreFragmentArgs.<\/span><span style=\"color: #DCBDFB\">fromBundle<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #DCBDFB\">requireArguments<\/span><span style=\"color: #ADBAC7\">()).score)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        viewModel <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">ViewModelProvider<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">, viewModelFactory).<\/span><span style=\"color: #DCBDFB\">get<\/span><span style=\"color: #ADBAC7\">(ScoreViewModel::<\/span><span style=\"color: #DCBDFB\">class<\/span><span style=\"color: #ADBAC7\">.java)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>ScoreFragment\uc5d0\uc11c ViewModelFactory \uc778\uc2a4\ud134\uc2a4\ub97c \ub9cc\ub4e4\uace0, viewModel\uc744 ViewModelProvider\uc5d0\uc11c \uac00\uc838\uc62c \ub54c \uc778\uc790\ub85c \uac19\uc774 \uc804\ub2ec\ud558\uace0 \uc788\ub2e4. <\/p>\n\n\n\n<p>ScoreViewModelFactory\uc5d0\ub294 Bundle\ub85c\ubd80\ud130 arguments\ub97c \ubc1b\uc544\uc640 \uc0dd\uc131\uc790\uc5d0 \ub123\uc5b4\uc8fc\uace0 \uc788\ub2e4. \uc774 Factory\ub97c \ud1b5\ud574 \uc778\uc790\uac00 \uc788\ub294 ViewModel\uc744 \uc5bb\uc5b4\uc624\uac8c \ub41c\ub2e4. \uc774 \uc791\uc5c5\uc740 ViewModelProvider\uc5d0\uc11c \uc774\ub8e8\uc5b4\uc9c0\uba70, \uc0dd\uc131\ud55c Factory\ub97c \uc778\uc790\ub85c \ub118\uaca8\uc900\ub2e4. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Live Data<\/h2>\n\n\n\n<p> ViewModel\uc774 \uac00\uc9c0\uace0 \uc788\ub294 data\ub4e4\uc911\uc5d0 data binding\uc73c\ub85c UI\uc640 \uc5ee\uc774\ub294 \uac12\ub4e4\uc740 LiveData\ub85c \ub4e4\uace0 \uc788\uac8c\ub41c\ub2e4. LiveData\ub294 Observable data holder\uc774\ub2e4. \uc774\ub9d0\uc740, Observer\uac00 \uc774 \uac12\uc5d0 \uc5f0\uacb0\ub418\uc5b4 \uac12\uc774 \ubcc0\uacbd\ub420 \ub54c\ub9c8\ub2e4 \uc54c\ub9bc\uc744 \ubc1b\uc744 \uc218 \uc788\ub2e4\ub294 \uac83\uc774\ub2e4. \ub2e8\uc21c\ud55c Observable value\uc640 \ub2e4\ub978\uc810\uc740 LifecycleOwner\uc5d0 \ub530\ub77c, UI\uc758 \uc720\ud6a8\ud55c \ub77c\uc774\ud504 \uc0ac\uc774\ud074\ub3d9\uc548 \uc791\ub3d9\ud55c\ub2e4.  <\/p>\n\n\n\n<p>\uadf8\ub7fc \uc0ac\uc6a9\ubc95\uc744 \uc54c\uc544\ubcf4\uc790. \uba3c\uc800 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ucd94\uac00\ud574\uc57c\ud55c\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>dependencies{\n    def lifecycle_version = \"2.2.0\"\n...\n    \/\/ LiveData\n    implementation \"androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version\"<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCBDFB\">dependencies<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    def lifecycle_version <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;2.2.0&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #768390\">\/\/ LiveData<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    implementation <\/span><span style=\"color: #96D0FF\">&quot;androidx.lifecycle:lifecycle-livedata-ktx:<\/span><span style=\"color: #6CB6FF\">$lifecycle_version<\/span><span style=\"color: #96D0FF\">&quot;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc870\uae08 \ud2b9\uc774\ud55c \uc810\uc73c\ub85c, \ub2e4\uc74c\uacfc\uac19\uc774 appcompat \ub77c\uc774\ube0c\ub7ec\ub9ac\ub9cc \uc788\uc5b4\ub3c4 \ube4c\ub4dc\uc5d0 \ubb38\uc81c\uac00 \uc0dd\uae30\uc9c0\ub294 \uc54a\ub294\ub2e4. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>implementation 'androidx.appcompat:appcompat:1.2.0'<\/code><\/pre>\n\n\n\n<p>\uc774\uc720\ub294 \uc815\ud655\ud788 \ubaa8\ub974\uaca0\uc9c0\ub9cc, appcompat\uc774 \uc774\uc804 \ubc84\uc804 \ud638\ud658\uc131\uc744 \uc704\ud55c \ud328\ud0a4\uc9c0\uc774\uace0 \uc544\ub9c8\ub3c4 \ud638\ud658\uc131\uc744 \uc704\ud574 \uadf8\ub807\uac8c \ub418\uc5b4 \uc788\ub294\uac8c \uc544\ub2d0\uae4c \ucd94\uce21\ub41c\ub2e4. <\/p>\n\n\n\n<p> Android Tutorial\uc758 Guess The Word \ud504\ub85c\uc81d\ud2b8 \uc608\uc81c\ub97c \uc0b4\ud3b4\ubcf4\uc790. \uba3c\uc800, ViewModel\uc5d0 \ubcc0\uc218 \ub300\uc2e0, MutableLiveData&lt;T&gt; \ub85c LiveData \uc778\uc2a4\ud134\uc2a4\ub97c \uc0dd\uc131\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>    var word = MutableLiveData&lt;String>()\n    var score = MutableLiveData&lt;Int>()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> word <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">MutableLiveData<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">&gt;()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> score <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">MutableLiveData<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">&gt;()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uac12\uc740 value property\ub85c \uc811\uadfc \ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>init{\n        word.value = \"\"\n        score.value = 0\n        ...\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCBDFB\">init<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        word.<\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        score.<\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>score.value = (score.value)?.plus(1)\n...\nword.value = wordList.removeAt(0)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">score.<\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> (score.<\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #ADBAC7\">)?.<\/span><span style=\"color: #DCBDFB\">plus<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">word.<\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> wordList.<\/span><span style=\"color: #DCBDFB\">removeAt<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uac12\uc744 \uc0ac\uc6a9\uc790 \uc4f0\ub808\ub4dc\uc5d0\uc11c \ubcc0\uacbd\ud558\ub294 \uacbd\uc6b0, postValue()\ub97c \uc774\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p>UI\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 Observer\ub97c \ub4f1\ub85d\ud558\uba74 \ub530\ub85c \uac12 \ubcc0\uacbd\uc2dc \uc9c1\uc811 \uc124\uc815\ud574\uc8fc\uc9c0 \uc54a\uc544\ub3c4 \uc790\ub3d9\uc73c\ub85c \uac19\uc774 \ubcc0\uacbd\ub41c\ub2e4. Observer\uc758 \ub4f1\ub85d\uc740 LiveData.observe() \ud568\uc218\ub97c \uc774\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>viewModel.score.observe(viewLifecycleOwner, Observer { newScore ->\n            binding.scoreText.text = newScore.toString()\n        })<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">viewModel.score.<\/span><span style=\"color: #DCBDFB\">observe<\/span><span style=\"color: #ADBAC7\">(viewLifecycleOwner, <\/span><span style=\"color: #DCBDFB\">Observer<\/span><span style=\"color: #ADBAC7\"> { newScore <\/span><span style=\"color: #F47067\">-&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            binding.scoreText.text <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> newScore.<\/span><span style=\"color: #DCBDFB\">toString<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        })<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ud2b9\uc774\uc0ac\ud56d\uc73c\ub85c\ub294 LifecycleOwner\ub97c \ub118\uaca8\uc918\uc57c \ud55c\ub2e4. \uc55e\uc5d0\uc11c \uc598\uae30\ud588\ub4ef\uc774, UI\uac00 \uc720\ud6a8\ud55c <a href=\"https:\/\/developer.android.com\/reference\/android\/arch\/lifecycle\/Lifecycle.State\">lifecycle state<\/a>(STARTED or RESUMED)\uc5d0\uc11c\ub9cc \uc791\ub3d9\ud558\uae30 \uc704\ud568\uc774\ub2e4. Observer\ub294 \ud3b8\uc758\ub97c \uc704\ud574 lambda \ud45c\ud604\uc2dd\uc744 \ub118\uae30\uace0 \uc788\ub2e4. anonymous function\uc73c\ub85c \uc0dd\uac01\ud558\uba74 \ub41c\ub2e4.<\/p>\n\n\n\n<p>LiveData\uac12\uc744 backing property\ub97c \uc774\uc6a9\ud574 encapsulation \uc2dc\ud0ac\uc218\ub3c4 \uc788\ub2e4. score\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \ubc14\uafd4\ubcf4\uc790.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>private val _score = MutableLiveData&lt;Int>()\nval score: LiveData&lt;Int>\n    get() = _score<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> _score <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">MutableLiveData<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">&gt;()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> score: <\/span><span style=\"color: #F69D50\">LiveData<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">Int<\/span><span style=\"color: #ADBAC7\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">get<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> _score<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc678\ubd80\uc5d0\uc11c \ucc38\uc870\ub294 score\ub97c \uc77d\uae30\uc804\uc6a9\uc73c\ub85c \ub9cc\ub4e4\uace0, backing property\ub85c _score\ub294 \ubcc0\uacbd\uc774 \uac00\ub2a5\ud558\ub2e4. MutableLiveData \uc640 LiveData\ub85c \uc778\uc2a4\ud134\uc2a4\uac00 \uc0dd\uc131\ub41c \uac83\ub3c4 \uc54c \uc218 \uc788\ub2e4. \uc774\ub807\uac8c \ubcc0\uacbd\ud558\uba74, \ub0b4\ubd80\uc801\uc73c\ub85c \ubcc0\uacbd\ud558\ub294 \uac12\uc740 _score\ub85c \uc218\uc815\ud574\uc918\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>init{\n        _score.value = 0\n        ...\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCBDFB\">init<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        _score.<\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>_score.value = (score.value)?.plus(1)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">_score.<\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> (score.<\/span><span style=\"color: #F47067\">value<\/span><span style=\"color: #ADBAC7\">)?.<\/span><span style=\"color: #DCBDFB\">plus<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc9c0\uae08\uae4c\uc9c0 \uc124\uba85\ud55c \ub0b4\uc6a9\uc744 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc73c\ub85c \uadf8\ub9ac\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"166\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/10\/before-1024x166.png\" alt=\"\" class=\"wp-image-750\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/before-1024x166.png 1024w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/before-300x49.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/before-768x125.png 768w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/before.png 1431w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Data Binding with LiveData<\/h2>\n\n\n\n<p>\uc55e\uc5d0\uc11c\ub294 Fragment \ucf54\ub4dc\uc5d0\uc11c LiveData.observe()\ub97c \uc774\uc6a9\ud574 \uac12\uc744 \ubaa8\ub2c8\ud130\ub9c1 \ud588\uc5c8\ub2e4. \uadf8\ub7f0\ub370, data binding\uc744 \uc774\uc6a9\ud558\uba74 \uc774 \uacfc\uc815\uc5c6\uc774 XML\uc744 \uc9c1\uc811 \uc5f0\uacb0\ud560 \uc218 \uc788\ub2e4. \uc774\uc804\uc5d0 data binding\uc744 \uc0ac\uc6a9\ud588\uc5c8\uc9c0\ub9cc, LiveData\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc73c\uba74, \uac12\uc774 \ubcc0\uacbd\ub418\ub3c4 \uc5f0\uacb0\ub41c UI\uc5d0\ub294 \ubc18\uc601\ub418\uc9c0 \uc54a\uc558\ub2e4. \ud558\uc9c0\ub9cc, LiveData\ub97c \uc0ac\uc6a9\ud558\uba74, \uac12\uc758 \ubcc0\uacbd\uc774 \ubc14\ub85c \ubc18\uc601\ub418\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<p>\uc608\uc81c\ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c, score_fragment.xml \uacfc ScoreFragment \ud074\ub798\uc2a4\ub97c \ubcf4\uc790. \uba3c\uc800 score_fragment.xml\uc5d0 data binding\uc744\uc704\ud574 \ub2e4\uc74c\uc744 \ucd94\uac00\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;layout ...>\n    &lt;data>\n        &lt;variable\n            name=\"scoreViewModel\"\n            type=\"com.example.android.guesstheword.screens.score.ScoreViewModel\" \/>\n    &lt;\/data>\n&lt;androidx.constraintlayout.widget.ConstraintLayout\n...<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #8DDB8C\">layout<\/span><span style=\"color: #ADBAC7\"> ...&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    &lt;<\/span><span style=\"color: #8DDB8C\">data<\/span><span style=\"color: #ADBAC7\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        &lt;<\/span><span style=\"color: #8DDB8C\">variable<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #6CB6FF\">name<\/span><span style=\"color: #ADBAC7\">=<\/span><span style=\"color: #96D0FF\">&quot;scoreViewModel&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #6CB6FF\">type<\/span><span style=\"color: #ADBAC7\">=<\/span><span style=\"color: #96D0FF\">&quot;com.example.android.guesstheword.screens.score.ScoreViewModel&quot;<\/span><span style=\"color: #ADBAC7\"> \/&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    &lt;\/<\/span><span style=\"color: #8DDB8C\">data<\/span><span style=\"color: #ADBAC7\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #8DDB8C\">androidx.constraintlayout.widget.ConstraintLayout<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ud654\uba74\uc5d0 \ubcf4\uc5ec\uc9c8 TextView\uc758 text \ubd80\ubd84\uc744 \ucd94\uac00\ud55c data\ud56d\ubaa9\uc758 \ubcc0\uc218\ub97c \uc774\uc6a9\ud558\uc5ec \ud45c\uc2dc\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;TextView\n   android:id=\"@+id\/score_text\"\n   ...\n   android:text=\"@{String.valueOf(scoreViewModel.score)}\"\n   ... \/><\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #8DDB8C\">TextView<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   <\/span><span style=\"color: #6CB6FF\">android:id<\/span><span style=\"color: #ADBAC7\">=<\/span><span style=\"color: #96D0FF\">&quot;@+id\/score_text&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   ...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   <\/span><span style=\"color: #6CB6FF\">android:text<\/span><span style=\"color: #ADBAC7\">=<\/span><span style=\"color: #96D0FF\">&quot;@{String.valueOf(scoreViewModel.score)}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   ... \/&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc774\uc81c ScoreFragment \ud074\ub798\uc2a4\uc5d0\uc11c \ub2e4\uc74c\uacfc\uac19\uc774 \uc0dd\uc131\ud588\ub358 viewModel\uc744 xml\uc758 \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud574\uc900\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>...\nviewModel = ViewModelProvider(this, viewModelFactory).get(ScoreViewModel::class.java)        \nbinding.scoreViewModel = viewModel        \nbinding.lifecycleOwner = viewLifecycleOwner\n...<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">viewModel <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">ViewModelProvider<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">, viewModelFactory).<\/span><span style=\"color: #DCBDFB\">get<\/span><span style=\"color: #ADBAC7\">(ScoreViewModel::<\/span><span style=\"color: #DCBDFB\">class<\/span><span style=\"color: #ADBAC7\">.java)        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">binding.scoreViewModel <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> viewModel        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">binding.lifecycleOwner <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> viewLifecycleOwner<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">..<\/span><span style=\"color: #ADBAC7\">.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc8fc\uc758\ud560 \uc810\uc740 binding.lifecycleOwner\uc5d0 viewLivecycleOwner\ub97c \ud560\ub2f9\ud558\ub294 \ubd80\ubd84\uc774\ub2e4. \uc774\uac8c \uc790\ub3d9\uc73c\ub85c \uc774\ub904\uc9c0\uc9c0 \uc54a\ub294\uac8c \uc870\uae08 \uc758\uc544\ud558\uc9c0\ub9cc, \uc9c1\uc811 \uc124\uc815\ud574\uc918\uc57c \ud558\ub294 \uac83\uc73c\ub85c \ubcf4\uc778\ub2e4.<\/p>\n\n\n\n<p>\uc774\ub807\uac8c\ud558\uba74, \uc55e\uc11c \uc0ac\uc6a9\ud588\ub358 observe() \ucf54\ub4dc\ub294 \ud544\uc694\uac00 \uc5c6\uc5b4\uc9c4\ub2e4.<\/p>\n\n\n\n<p>\ubc84\ud2bc\ud074\ub9ad\uacfc \uac19\uc740 \uc774\ubca4\ud2b8 \ud578\ub4e4\ub7ec\ub3c4 \uc774\ub97c \uc774\uc6a9\ud574 \ubc14\ub85c \uc5f0\uacb0\uc774 \uac00\ub2a5\ud558\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&lt;Button\n   android:id=\"@+id\/play_again_button\"\n   ...\n   android:onClick=\"@{() -> scoreViewModel.onPlayAgain()}\"\n   ... \/><\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #8DDB8C\">Button<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   <\/span><span style=\"color: #6CB6FF\">android:id<\/span><span style=\"color: #ADBAC7\">=<\/span><span style=\"color: #96D0FF\">&quot;@+id\/play_again_button&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   ...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   <\/span><span style=\"color: #6CB6FF\">android:onClick<\/span><span style=\"color: #ADBAC7\">=<\/span><span style=\"color: #96D0FF\">&quot;@{() -&gt; scoreViewModel.onPlayAgain()}&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">   ... \/&gt;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ub2f9\uc5f0\ud558\uac8c\ub3c4 scoreViewModel\uc5d0\ub294 onPlayAgain()\uc774 \uad6c\ud604\ub418\uc5b4 \uc788\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p>data binding\uc744 \uc774\uc6a9\ud558\uc5ec, \ubcf4\ub2e4 \uac04\ub2e8\ud574\uc9c4 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc744 \uc5bb\uc5b4\ub0bc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"992\" height=\"236\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/10\/after.png\" alt=\"\" class=\"wp-image-751\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/after.png 992w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/after-300x71.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/10\/after-768x183.png 768w\" sizes=\"auto, (max-width: 992px) 100vw, 992px\" \/><\/figure>\n\n\n\n<p>\uc774\ub85c\uc11c, MVVM \ud328\ud134\uc5d0 View-ViewModel \ubd80\ubd84\uc774 \uc644\uc131\ub418\uc5c8\ub2e4. ViewModel-Model \ubd80\ubd84\ub9cc \uad6c\ud604\uc774 \ub41c\ub2e4\uba74, \uc804\uccb4 \uc571 \uc544\ud0a4\ud14d\uccd0\uc758 \uc644\uc131\ub41c \uadf8\ub9bc\uc744 \uc5bb\uc744 \uc218 \uc788\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ViewModel\uc740 Android Architecture Component\uc911 \ud558\ub098\ub85c android jetpack\ub77c\uc774\ube0c\ub7ec\ub9ac \ud615\ud0dc\ub85c \uc9c0\uc6d0\ud55c\ub2e4. \uc55e\uc11c \uc598\uae30\ud588\ub4ef\uc774, MVVM \ubaa8\ub378\uc758 ViewModel\uc744 \uad6c\ud604\ud558\ub294\ub370 \uc0ac\uc6a9\ub41c\ub2e4. Activity, Fragment\ub4e4\uc774 UI Controller\ub85c\uc11c XML\uacfc \ud568\uaed8 \ud654\uba74 rotation\uc758 \uacbd\uc6b0\ucc98\ub7fc UI\uac00 destroy-create\ub418\ub294 \uc0c1\ud669\uc5d0\uc11c\ub3c4, ViewModel\uc740 data\ub97c \ub4e4\uace0 \uc644\uc804\ud788 finished \ub418\uae30 \uc804\uae4c\uc9c0 \uc720\uc9c0\ud558\uac8c \ub41c\ub2e4. ViewModel\uc740 \uc5b4\uca0c\ub4e0 UI Activity\ub098 Fragment\uc5d0 \ub300\uc751\ud558\uace0 UI\uac00 \uc644\uc804\ud788 finished\ub418\uba74, \uac19\uc774 destory\ub418\uae30 \ub54c\ubb38\uc5d0 lifecycle\uc758\uc874\ub3c4\uac00 <a href=\"http:\/\/batmask.net\/index.php\/2020\/10\/27\/733\/\" class=\"btn btn-link continue-link\">\ub354 \uc77d\uae30<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,34],"tags":[186,38,198,191,197,20,41],"class_list":["post-733","post","type-post","status-publish","format-standard","hentry","category-android","category-kotlin","tag-android-2","tag-kotlin","tag-livedata","tag-mvvm","tag-viewmodel","tag-android","tag-kotlin-kr"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/733","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=733"}],"version-history":[{"count":10,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/733\/revisions"}],"predecessor-version":[{"id":3512,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/733\/revisions\/3512"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=733"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}