{"id":818,"date":"2016-06-14T07:52:08","date_gmt":"2016-06-14T07:52:08","guid":{"rendered":"http:\/\/yoonhada.com\/wp\/?p=818"},"modified":"2023-12-27T03:10:00","modified_gmt":"2023-12-26T18:10:00","slug":"android-mvc-mvvm-mvp","status":"publish","type":"post","link":"http:\/\/yoonhada.com\/?p=818","title":{"rendered":"Android, MVC, MVVM, MVP"},"content":{"rendered":"<p>\t\t\t\t\uc6d0\ubcf8\ub9c1\ud06c(<a href=\"http:\/\/tosslab.github.io\/android\/2015\/03\/01\/01.Android-mvc-mvvm-mvp.html\">Android \uc640 \uac1c\ubc1c \ud328\ud134 1\ubd80<\/a>)<\/p>\n<p>\ucf54\ub4dc\ub97c \uc791\uc131\ud574 \uac00\ub294\ub370 \uc788\uc5b4\uc11c \ub9ce\uc740 \uac1c\ubc1c\uc790\ub4e4\uc740 \uc77c\uad00\uc131\uc744 \uc720\uc9c0\ud558\uace0 \uc720\uc9c0\ubcf4\uc218\uc131\uc744 \ub192\uc77c \uc218 \uc788\ub294 \ub9ce\uc740 \uac1c\ubc1c \ubaa8\ub378\ub4e4\uc744 \uc0dd\uac01\ud574 \uc654\uc2b5\ub2c8\ub2e4. \ud2b9\ud788\ub098 \ud611\uc5c5\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \ub85c\uc9c1\uacfc View \ub97c \ub2e4\ub8e8\ub294 \ucf54\ub4dc\uac00 \ub4a4\uc11e\uc774\uac8c \ub418\uba74 \uc791\uc131\uc790\ubfd0\ub9cc \uc544\ub2c8\ub77c \ub3d9\ub8cc\ub4e4\uc870\ucc28\ub3c4 \uc720\uc9c0\ubcf4\uc218 \ud558\uae30 \ud798\ub4e4\uc5b4\uc9c0\ub294 \ubaa8\uc2b5\uc744 \uc27d\uac8c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub7ec\ud55c \ucf54\ub4dc \uc791\uc131\ub54c\ubb38\uc5d0 \ud300\ub2e8\uc704\ub85c, \ud504\ub85c\uc81d\ud2b8 \ub2e8\uc704\ub85c, \ub54c\ub85c\ub294 \ud68c\uc0ac \ub2e8\uc704\ub85c \uc5ec\ub7ec\uac00\uc9c0 \uc815\ucc45\uc744 \uac00\uc9c0\uace0 \ucf54\ub4dc\uc640 \uac1c\ubc1c \ubaa8\ub378\ub4e4\uc744 \uc77c\uad00\ub418\uac8c \ud558\ub824\uace0 \ub9ce\uc740 \ub178\ub825\uc744 \ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ub178\ub825\uc5d0 \uac1c\ubc1c\uc790\ub4e4 \uc0ac\uc774\uc5d0\uc11c \ub9ce\uc774 \ud1b5\uc6a9\ub418\ub294 \uac1c\ubc1c \ud328\ud134\ub4e4\uc774 \ub098\uc624\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub300\ud45c\uc801\uc73c\ub85c MVC \ubaa8\ub378\uc774\ub77c\uace0 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud544\uc790\uac00 \uacfc\uac70\uc5d0 \ud588\ub358 \uc6f9 \ud504\ub85c\uc81d\ud2b8 \uc911 SpringMVC \ud504\ub808\uc784\uc6cc\ud06c\ub294 \uc678\ubd80\ub85c\ubd80\ud130\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 Controller, \uc2e4\uc9c8\uc801\uc778 \ube44\uc9c0\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uc218\ud589\ud558\ub294 Model, \uadf8\ub9ac\uace0 \ud654\uba74 \ucc98\ub9ac\ub97c \ub2f4\ub2f9\ud558\ub294 View \ub97c \uad6c\ubd84\ud560 \uc218 \uc788\ub3c4\ub85d \uc9c0\uc6d0\ub418\uc5b4 \ub9ce\uc740 \uac1c\ubc1c\uc790\ub4e4\uc5d0\uac8c \uc0ac\ub791\ubc1b\uace0 \uc788\ub294 \ud504\ub808\uc784\uc6cc\ud06c \uc911 \ud558\ub098\uc785\ub2c8\ub2e4.<\/p>\n<p>\ucc28\uce30 View \uc790\uccb4\uc5d0\uc11c \ucc98\ub9ac\ud574\uc57c\ud558\ub294 \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud574\uc9d0\uc5d0 \ub530\ub77c MVVM\uacfc MVP \ud328\ud134\uc774 \ub098\uc624\uba74\uc11c View \ub0b4\uc5d0\uc11c\ub3c4 Logic\uacfc Presenter \ub97c \uad6c\ubd84\ud558\ub824\ub294 \ub178\ub825\uc774 \ub04a\uc784\uc5c6\uc774 \ub098\uc654\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc678\uc5d0\ub3c4 \ub9ce\uc740 \uac1c\ubc1c \ud328\ud134\ub4e4\uc774 \uc788\uc9c0\ub9cc \uac00\uc7a5 \ub9ce\uc774 \ud1b5\uc6a9\ub418\ub294 \uc774\uc57c\uae30\ub97c \ud558\uace0\uc790 \ud569\ub2c8\ub2e4.<\/p>\n<p><span style=\"font-size: 14pt;\"><strong>\ucd08\ucc3d\uae30 \uc548\ub4dc\ub85c\uc774\ub4dc \uac1c\ubc1c \ucf54\ub4dc\uc758 \ubaa8\uc2b5<\/strong><\/span><\/p>\n<p>\uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c\ub3c4 \ucd08\ucc3d\uae30 \ubd80\ud130 \uc774\ub7ec\ud55c \ub178\ub825\uc774 \ub04a\uc784\uc5c6\uc774 \ub098\uc654\uc2b5\ub2c8\ub2e4. MVC \uc640 \uac19\uc740 \uac1c\ubc1c \ud328\ud134\uc5d0 \uc775\uc219\ud574\uc838 \uc788\ub358 \ub9ce\uc740 \uac1c\ubc1c\uc790\ub4e4\uc740 \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\ub3c4 \uc774\uc640 \uac19\uc740 \ubaa8\uc2b5\uc744 \uc801\uc6a9\ud558\ub824\uace0 \ub178\ub825\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c \ucf54\ub4dc\ub294 \uc77c\ubc18\uc801\uc73c\ub85c \ucc98\uc74c \uc548\ub4dc\ub85c\uc774\ub4dc\ub97c \uc811\ud558\ub294 \uc0ac\ub78c\ub4e4\uc774 \uc4f0\ub294 \ucf54\ub4dc\ub4e4\uc785\ub2c8\ub2e4.<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\n\tpublic class MainAcivity extends Activity<br \/>\n\t{<\/p>\n<p>\t\t@Override<br \/>\n\t\tpublic void onCreate( Bundle saveInstance )<br \/>\n\t\t{<br \/>\n\t\t\tsuper.onCreate( saveInstance );<br \/>\n\t\t\tsetContent( R.layout.main );<\/p>\n<p>\t\t\tTextView textView = ( TextView ) findViewById( R.id.btn_confirm );<br \/>\n\t\t\ttextView.setText( &quot;Non-Clicked&quot; );<\/p>\n<p>\t\t\tfindViewById( R.id.btn_confirm ).setOnClickListener( new View.OnClickListener()<br \/>\n\t\t\t{<\/p>\n<p>\t\t\t\t@Override<br \/>\n\t\t\t\tpublic void onClick( View view )<br \/>\n\t\t\t\t{<br \/>\n\t\t\t\t\tTextView textView = ( TextView ) findViewById( R.id.btn_confirm );<br \/>\n\t\t\t\t\ttextView.setText( getClickedText() );<br \/>\n\t\t\t\t}<br \/>\n\t\t\t} );<br \/>\n\t\t}<\/p>\n<p>\t\tString getClickedText()<br \/>\n\t\t{<br \/>\n\t\t\treturn &quot;Clicked!!!&quot;;<br \/>\n\t\t}<\/p>\n<p>\t}<br \/>\n[\/code]<\/p>\n<p>Activity \ub0b4\uc5d0 \uc774\ubca4\ud2b8\ub97c \ud578\ub4e4\ub9c1\ud558\ub294 \ucc98\ub9ac\ub098 \ubdf0\uc5d0 \uc811\uadfc\ud558\ub294 \ucf54\ub4dc\ub4e4\uc774 \ubaa8\ub450 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>&nbsp;<\/p>\n<p>\uc774\ub7ec\ud55c \ucf54\ub4dc\ub4e4\uc758 \ubaa8\uc2b5\uc740 \uc11c\ubc84\uae30\ubc18 \ub3d9\uc791\uc2dc\uc5d4 \ud558\ub098\uc758 Activity \ub0b4\uc5d0 \ub124\ud2b8\uc6cc\ud06c \ucc98\ub9ac\ub97c \uc704\ud55c \uc4f0\ub808\ub4dc \ucc98\ub9ac\uae4c\uc9c0 \ud558\uac8c\ub418\ub294 \ub4f1 \ucf54\ub4dc\uac00 \ucee4\uc9c0\uba74 \ucee4\uc9c8\uc218\ub85d \uac00\ub3c5\uc131\ub3c4 \ub5a8\uc5b4\uc9c0\uba70 \uc720\uc9c0\ubcf4\uc218\uac00 \ud798\ub4e4\uc5b4\uc9c0\ub294 \ucf54\ub4dc\ub85c \uac00\uae30 \uc26c\uc6cc\uc9d1\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub798\uc11c \uae30\uc874\uc758 \uc6f9\uc5d0\uc11c\ucc98\ub7fc \uc880 \ub354 \uae30\ub2a5\ubcc4\ub85c \ubd84\ud560\ud558\uc5ec \ucf54\ub4dc\ub4e4\uc744 \uac04\uacb0\ud558\uace0 \uc720\uc9c0\ubcf4\uc218\uac00 \uc26c\uc6cc\uc9c0\ub3c4\ub85d \ud558\uae30 \uc704\ud55c \ubc29\ubc95\ub4e4\uc774 \ub9ce\uc774 \ub3c4\uc785\ub418\uae30 \uc2dc\uc791\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong><span style=\"font-size: 14pt;\">\ub098\uc740 \ucf54\ub4dc\ub4e4\uc744 \uc704\ud55c \ud328\ud134\ub4e4<\/span><\/strong><\/p>\n<p>\ud558\uc9c0\ub9cc \ud654\uba74\uc774 \uc810\uc810 \ubcf5\uc7a1\ud574\uc9c0\uac8c \ub418\uace0 \uc810\uc810 View \uc5d0 \uc758\ud574 \uc81c\uc5b4\ub418\ub294 \ub85c\uc9c1\ub4e4\uc774 \ub9ce\uc544\uc9d0\uc5d0 \ub530\ub77c \uc774\ub97c \ubd84\ub9ac\ud558\uace0\ud558\ub294 \ub178\ub825\ub4e4\uc774 \ub098\uc654\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc740 \uc6f9 \uc11c\ube44\uc2a4 \uac1c\ubc1c\uc790\ub4e4\uc5d0\uac8c \uac00\uc7a5 \uc27d\uac8c \uc0ac\uc6a9\ub418\uc5c8\ub358 <strong>MVC <\/strong>\ud328\ud134\uc744 \uc801\uc6a9\ud55c \ucf54\ub4dc\uc785\ub2c8\ub2e4.<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\n\tpublic class MainAcivity extends Activity<br \/>\n\t{<br \/>\n\t\tprivate MainModel mainModel;<\/p>\n<p>\t\t@Override<br \/>\n\t\tpublic void onCreate( Bundle saveInstance )<br \/>\n\t\t{<br \/>\n\t\t\tsuper.onCreate( saveInstance );<br \/>\n\t\t\tsetContent( R.layout.main );<\/p>\n<p>\t\t\tmainModel = new MainModel();<\/p>\n<p>\t\t\tTextView textView = ( TextView ) findViewById( R.id.btn_confirm );<br \/>\n\t\t\ttextView.setText( &quot;Non-Clicked&quot; );<\/p>\n<p>\t\t\tfindViewById( R.id.btn_confirm ).setOnClickListener( new View.OnClickListener()<br \/>\n\t\t\t{<\/p>\n<p>\t\t\t\t@Override<br \/>\n\t\t\t\tpublic void onClick( View view )<br \/>\n\t\t\t\t{<br \/>\n\t\t\t\t\tString text = mainModel.getClickedText();<br \/>\n\t\t\t\t\tTextView textView = ( TextView ) findViewById( R.id.btn_confirm );<br \/>\n\t\t\t\t\ttextView.setText( mainModel.getClickedText() );<br \/>\n\t\t\t\t}<br \/>\n\t\t\t} );<br \/>\n\t\t}<br \/>\n\t}<br \/>\n[\/code]<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\n\tpublic class MainModel<br \/>\n\t{<br \/>\n\t\tpublic String getClickedText()<br \/>\n\t\t{<br \/>\n\t\t\treturn &quot;Clicked!!!&quot;;<br \/>\n\t\t}<br \/>\n\t}<br \/>\n[\/code]<\/p>\n<p>View \uc5d0 \uc0c1\uad00\uc5c6\ub294 \ub85c\uc9c1\uc744 MainModel \ub85c \ubd84\ub9ac\ub97c \ud558\uc600\uae30 \ub54c\ubb38\uc5d0 Activity \ub294 View \uc640 Click Event \ub97c \ucc98\ub9ac\ud558\ub294 \ubaa8\uc2b5\uc73c\ub85c \ubcc0\ud654\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud558\uc9c0\ub9cc Click Event \uc640 View \uc5d0 \ub300\ud55c \ucc98\ub9ac\uac00 \ud568\uaed8 \uc788\ub294 \uac83\uc744 \uc720\uc2ec\ud788 \uc0dd\uac01\ud574\ubcfc \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. MVC \ubaa8\ub378\uc5d0\uc11c Controller \ub294 View \uc5d0 \ub300\ud55c \ucc98\ub9ac\ub97c \uc9c1\uc811 \ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c View \uc5d0 \ub300\ud55c \uc815\ubcf4\ub9cc\uc744 View \uc5d0 \uc804\ub2ec\ud568\uc73c\ub85c\uc368 \ud654\uba74\uc744 \uadf8\ub9ac\ub294 View \uc640 \ub3d9\uc791\uc744 \ucc98\ub9ac\ud558\ub294 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\uace0\uc790 \ud558\ub294\ub370\uc11c \uc2dc\uc791\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud5cc\ub370 Controller \uc758 \uc5ed\ud560\uc744 \uc218\ud589\ud558\ub294 Activity \uc5d0\uc11c View \uc5d0 \ub300\ud55c \uc9c1\uc811\uc801\uc778 \uc870\uc791\uc744 \uc218\ud589\ud558\ub294 \uac83\uc740 MVC \ubaa8\ub378\uc5d0 \uc5b4\uae0b\ub098\ub294 \ubaa8\uc2b5\uc744 \ubcf4\uc5ec\uc8fc\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub294 Android \uc5d0\uc11c Activity(Fragment) \uac00 View \uc640 Controller \ub450\uac00\uc9c0\uc758 \ud2b9\uc131\uc744 \ubaa8\ub450 \uac00\uc9c0\uace0 \uc788\uae30 \ub54c\ubb38\uc5d0 View \ub098 Controller \ub97c \ud55c\ucabd\uc73c\ub85c \ube7c\uac8c \ub420 \uacbd\uc6b0 View \uc5d0 \ub300\ud55c \ubc14\uc778\ub529\uc774\ub098 \ucc98\ub9ac\uc5d0\uc11c \uc911\ubcf5 \ucf54\ub4dc\ub098 \uc77c\uad00\uc131\uc744 \uc783\uc5b4\ubc84\ub9ac\ub294 \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \uc774\ub97c \uac1c\uc120\ud558\uae30 \uc704\ud574\uc11c <strong>MVVM <\/strong>\uc774\ub780 \ud328\ud134\uc744 \uc801\uc6a9\ud574\ubd24\uc2b5\ub2c8\ub2e4.<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\n\tpublic class MainAcivity extends Activity<br \/>\n\t{<\/p>\n<p>\t\tprivate MainViewModel mainViewModel;<\/p>\n<p>\t\t@Override<br \/>\n\t\tpublic void onCreate( Bundle saveInstance )<br \/>\n\t\t{<br \/>\n\t\t\tsuper.onCreate( saveInstance );<br \/>\n\t\t\tsetContent( R.layout.main );<\/p>\n<p>\t\t\tmainViewModel = new MainViewModel( MainActivity.this );<\/p>\n<p>\t\t}<\/p>\n<p>\t}<br \/>\n[\/code]<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\n\tpublic class MainModel<br \/>\n\t{<\/p>\n<p>\t\tpublic String getClickedText()<br \/>\n\t\t{<br \/>\n\t\t\treturn &quot;Clicked!!!&quot;;<br \/>\n\t\t}<\/p>\n<p>\t}<br \/>\n[\/code]<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\n\tpublic class MainViewModel<br \/>\n\t{<\/p>\n<p>\t\tprivate Activity activity;<br \/>\n\t\tprivate MainModel mainModel;<br \/>\n\t\tprivate TextView textView;<\/p>\n<p>\t\tpublic MainViewModel( Activity activity )<br \/>\n\t\t{<br \/>\n\t\t\tthis.activity = activity;<br \/>\n\t\t\tthis.mainModel = new MainModel();<br \/>\n\t\t\tinitView( activity );<br \/>\n\t\t}<\/p>\n<p>\t\tprivate void initView( Activity activity )<br \/>\n\t\t{<\/p>\n<p>\t\t\ttextView = ( TextView ) activity.findViewById( R.id.btn_confirm );<br \/>\n\t\t\ttextView.setText( &quot;Non-Clicked&quot; );<\/p>\n<p>\t\t\tactivity.findViewById( R.id.btn_confirm ).setOnClickListener( new View.OnClickListener()<br \/>\n\t\t\t{<\/p>\n<p>\t\t\t\t@Override<br \/>\n\t\t\t\tpublic void onClick( View view )<br \/>\n\t\t\t\t{<br \/>\n\t\t\t\t\tString text = mainModel.getClickedText();<br \/>\n\t\t\t\t\ttextView.setText( text );<br \/>\n\t\t\t\t}<br \/>\n\t\t\t} );<br \/>\n\t\t}<\/p>\n<p>\t}<br \/>\n[\/code]<\/p>\n<p>ViewModel \ub85c View \uc5d0 \ub300\ud55c \ucc98\ub9ac\uac00 \ubd84\ub9ac\ub418\uc5c8\uc74c\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud558\uc9c0\ub9cc \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c MVVM\uc774 \uac00\uc9c0\ub294 \ubb38\uc81c\uc810\uc740 View \uc5d0 \ub300\ud55c \ucc98\ub9ac\uac00 \ubcf5\uc7a1\ud574\uc9c8\uc218\ub85d ViewModel \uc5d0 \uac70\ub300\ud574\uc9c0\uac8c \ub418\uace0 \uc0c1\ub300\uc801\uc73c\ub85c Activity \ub294 \uc544\ubb34\ub7f0 \uc5ed\ud560\ub3c4 \ud558\uc9c0 \uc54a\ub294 \ud615\ud0dc\uc758 \ud074\ub798\uc2a4\ub85c \ubcc0\ubaa8\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<p>Controller \uc758 \uc131\uaca9\uc744 \uc9c0\ub2cc Activity \uac00 \uc2e4\uc9c8\uc801\uc73c\ub85c \uc544\ubb34\ub7f0 \uc5ed\ud560\uc744 \ud558\uc9c0 \ubabb\ud558\uace0 ViewModel \uc5d0 \uce58\uc911\ub41c \ubaa8\uc2b5\uc744 \ubcf4\uc5ec\uc90c\uc73c\ub85c\uc368 \ub2e4\ub978 \ud615\ud0dc\uc758 Activity \ud074\ub798\uc2a4\ub97c \uad6c\ud604\ud55c \uaf34\uc774 \ub418\uc5b4\ubc84\ub9ac\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>MainViewModel \uc5d0 \uc788\ub294 \ub85c\uc9c1\uc744 \ub2e4\uc2dc Activity \ub85c \ub864\ubc31\ud55c\ub2e4\ud558\uba74 \ub2e4\uc2dc MVC \uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ubb38\uc81c\uc810\uc744 \uac00\uc9c0\uac8c \ub418\ub294 \uc544\uc774\ub7ec\ub2c8\ud55c \ubaa8\uc2b5\uc744 \uac00\uc9c0\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc740 \uc774\ub7ec\ud55c View &#8211; Model &#8211; Controller \uc758 \ubaa8\uc2b5\uc744 \uba85\ud655\ud788 \uad6c\ubd84\ud558\uace0\uc790 \ub098\uc628 <strong>MVP <\/strong>\ubaa8\ub378\uc744 \ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\n\tpublic interface MainPresenter<br \/>\n\t{<\/p>\n<p>\t\tvoid setView( MainPresenter.View view );<\/p>\n<p>\t\tvoid onConfirm();<\/p>\n<p>\t\tpublic interface View<br \/>\n\t\t{<br \/>\n\t\t\tvoid setConfirmText( String text );<br \/>\n\t\t}<\/p>\n<p>\t}<br \/>\n[\/code]<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\n\tpublic class MainAcivity extends Activity implements MainPresenter.View<br \/>\n\t{<\/p>\n<p>\t\tprivate MainPresenter mainPresenter;<\/p>\n<p>\t\tprivate Button confirmButton;<\/p>\n<p>\t\t@Override<br \/>\n\t\tpublic void onCreate( Bundle saveInstance )<br \/>\n\t\t{<br \/>\n\t\t\tsuper.onCreate( saveInstance );<br \/>\n\t\t\tsetContent( R.layout.main );<\/p>\n<p>\t\t\tmainPresenter = new MainPresenterImpl( MainActivity.this );<br \/>\n\t\t\tmainPresenter.setView( this );<\/p>\n<p>\t\t\tconfirmButton = ( Button ) findViewById( R.id.btn_confirm );<br \/>\n\t\t\tconfirmButton.setOnClickListener( new View.OnClick()<br \/>\n\t\t\t{<br \/>\n\t\t\t\t@Override<br \/>\n\t\t\t\tpublic void onClick( View view )<br \/>\n\t\t\t\t{<br \/>\n\t\t\t\t\tmainPresenter.onConfirm();<br \/>\n\t\t\t\t}<br \/>\n\t\t\t} );<br \/>\n\t\t}<\/p>\n<p>\t\t@Override<br \/>\n\t\tpublic void setButtonText( String text )<br \/>\n\t\t{<br \/>\n\t\t\tconfirmButton.setText( text );<br \/>\n\t\t}<br \/>\n\t}<br \/>\n[\/code]<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\n\tpublic class MainModel<br \/>\n\t{<\/p>\n<p>\t\tpublic String getClickedText()<br \/>\n\t\t{<br \/>\n\t\t\treturn &quot;Clicked!!!&quot;;<br \/>\n\t\t}<\/p>\n<p>\t}<br \/>\n[\/code]<\/p>\n<p>[code language=&#8221;java&#8221;]<br \/>\n\tpublic class MainPresenterImpl implements MainPresenter<br \/>\n\t{<\/p>\n<p>\t\tprivate Activity activity;<br \/>\n\t\tprivate MainPresenter.View view;<\/p>\n<p>\t\tpublic MainPresenterImpl( Activity activity )<br \/>\n\t\t{<br \/>\n\t\t\tthis.activity = activity;<br \/>\n\t\t\tthis.mainModel = new MainModel();<br \/>\n\t\t}<\/p>\n<p>\t\t@Override<br \/>\n\t\tpublic void setView( MainPresenter.View view )<br \/>\n\t\t{<br \/>\n\t\t\tthis.view = view;<br \/>\n\t\t}<\/p>\n<p>\t\t@Override<br \/>\n\t\tpublic void onConfirm()<br \/>\n\t\t{<br \/>\n\t\t\tif( view != null )<br \/>\n\t\t\t{<br \/>\n\t\t\t\tview.setConfirmText( mainModel.getClickedText() );<br \/>\n\t\t\t}<br \/>\n\t\t}<\/p>\n<p>\t}<br \/>\n[\/code]<\/p>\n<p>MVP \ubaa8\ub378\uc758 \uad6c\ubd84\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<ol>\n<li>View \ub294 \uc2e4\uc81c view \uc5d0 \ub300\ud55c \uc9c1\uc811\uc801\uc778 \uc811\uadfc\uc744 \ub2f4\ub2f9\ud55c\ub2e4.<\/li>\n<li>view \uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\ub294 \uc9c1\uc811 \ud578\ub4e4\ub9c1\ud558\ub098 Presenter \uc5d0 \uc704\uc784\ud558\ub3c4\ub85d \ud55c\ub2e4.<\/li>\n<li>Presenter \ub294 \uc2e4\uc9c8\uc801\uc778 \uae30\ub2a5\uc744 \uc81c\uc5b4\ud558\ub294 \uacf3\uc73c\ub85c\uc368 ViewController \ub85c\uc368 \uc774\ud574\ud558\uba74 \uc27d\ub2e4.<\/li>\n<li>Model \uc740 \ube44\uc9c0\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uc2e4\uc9c8\uc801\uc73c\ub85c \uc218\ud589\ud55c\ub2e4.<\/li>\n<\/ol>\n<p>Presenter : View \ub294 1:1 \ub85c \ub9e4\uce6d\ud558\uba70 View Presenter \uac00 \uc8fc\uc694 \uae30\ub2a5\uc744 \uad00\uc7a5\ud558\ub418 \uc2e4\uc81c view \uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\ub294 Presenter (\uc774\ubca4\ud2b8 : View -&gt; Presenter) \ub85c \uc804\ub2ec\ud558\uc5ec \ucc98\ub9ac\ud558\ub3c4\ub85d \ud558\uace0 \ub2e4\uc2dc \ucc98\ub9ac\ub41c \uacb0\uacfc\ub294 Presenter \uac00 View \uc5d0 \uc804\ub2ec\ud558\ub3c4\ub85d \ud558\uc5ec \ucc98\ub9ac\ud55c\ub2e4. (\ucc98\ub9ac \uacb0\uacfc \ud45c\ud604 : Presenter -&gt; View)<\/p>\n<p><span style=\"font-size: 14pt;\"><strong>\uc815\ub9ac<\/strong><\/span><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/tomyrhymond.files.wordpress.com\/2011\/09\/mvc-mvp-mvvm_thumb.png\" alt=\"\" width=\"658\" height=\"436\" \/><\/p>\n<p><strong>MVC<\/strong><br \/>\n\uc678\ubd80\uc758 \ubaa8\ub4e0 \uc774\ubca4\ud2b8\ub97c Controller(Activity) \uc5d0\uc11c \ucc98\ub9ac\ud558\ub418 View \uc5d0 \uad00\uc5ec\ub294 \ud558\uc9c0 \uc54a\ub294 \uac83\uc774 \uc6d0\uce59\uc785\ub2c8\ub2e4. \ud558\uc9c0\ub9cc Activity \uc758 \ud2b9\uc131\uc0c1 View \uad00\uc5ec\ud558\uc9c0 \uc54a\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uacb0\uad6d Android \uc5d0\uc11c\ub294 MVC \uc758 \uad6c\uc870\ub97c \uacc4\uc18d\uc801\uc73c\ub85c \uc720\uc9c0\ud558\uae30\uc5d0\ub294 \ubb34\ub9ac\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>MVVM<\/strong><br \/>\nViewModel \uc774 \ubdf0\uc640\uc758 \uc0c1\ud638\uc791\uc6a9 \ubc0f \uc81c\uc5b4\uc5d0 \uc9d1\uc911\ud569\ub2c8\ub2e4. ViewModel \uc5d0\uc11c \uc9c1\uc811 \ubdf0\uc758 \uc774\ubca4\ud2b8\ub97c \ucc98\ub9ac\ud558\uae30 \ub54c\ubb38\uc5d0 Controller \uc758 \uc5ed\ud560\ub3c4 \ud568\uaed8 \uc218\ud589\ud558\uac8c \ub418\uc5b4 \uc810\uc810 \ucf54\ub4dc\uac00 \uc9d1\uc911 \ub418\ub294 \uad6c\uc870\uac00 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c \ucd08\uae30\ud654\uc640 \uc678\ubd80 \uc774\ubca4\ud2b8(\ubdf0\uc5d0 \uc758\ud55c \uac83\uc774 \uc544\ub2cc \uc774\ubca4\ud2b8)\ub97c \uc81c\uc678 \ud558\uace0\ub294 Activity \uc758 \uc5ed\ud560\uc774 \ubaa8\ud638\ud574\uc9c0\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<p><strong>MVP<\/strong><br \/>\nView \uc5d0 \ub300\ud55c \uc9c1\uc811\uc801\uc778 \uc811\uadfc\uc774 \uc694\uad6c\ub418\ub294 Android \uc758 Activity \ub294 \uc9c1\uc811\uc801\uc778 view \uc811\uadfc\uc740 Activity \uac00 \ud558\ub3c4\ub85d \ud558\uace0 \uc774\uc5d0 \ub300\ud55c \uc81c\uc5b4\ub294 Presenter \uac00 \ud558\ub3c4\ub85d \ud558\uace0 \uc788\ub2e4.<\/p>\n<p>\uc5b4\ub290 \uac83\uc774 \ub0ab\ub2e4\ub77c\uace0 \ub9d0\ud558\uae30\uc5d0\ub294 \uc5b4\ub824\uc6b4 \ub2e8\uacc4\uc785\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ub9ce\uc740 \uac1c\ubc1c\uc790\ub4e4\uc774 \uc548\ub4dc\ub85c\uc774\ub4dc\uc5d0\uc11c\ub294 MVC \uc790\uccb4\uc758 \ubaa8\uc2b5\ubcf4\ub2e4\ub294 MVVM \uc774\ub098 MVP \uac00 \uac00\uc7a5 \uc801\ud569\ud558\ub2e4\ub294 \ub9d0\uc744 \ub9ce\uc774 \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 Activity \uac00 View \ub97c \ud3ec\ud568\ud55c \ud074\ub798\uc2a4\uc774\uae30 \ub54c\ubb38\uc5d0 \ub098\ud0c0\ub098\ub294 \ud604\uc0c1\uc774\ub77c\uace0 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ucc38\uace0 \ube14\ub85c\uadf8<\/p>\n<p><a href=\"http:\/\/blog.javarouka.me\/2013\/06\/understanding-mvc-mvp-and-mvvm.html\">MVC, MVP, MVVM \uc758 \uc774\ud574 &#8211; \uc774\ud56d\ud76c<\/a><\/p>\n<p><a href=\"https:\/\/tomyrhymond.wordpress.com\/2011\/09\/16\/mvc-mvp-and-mvvm\/\">MVC, MVP AND MVVM &#8211; tomyrhymond<\/a>\t\t<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc6d0\ubcf8\ub9c1\ud06c(Android \uc640 \uac1c\ubc1c \ud328\ud134 1\ubd80) \ucf54\ub4dc\ub97c \uc791\uc131\ud574 \uac00\ub294\ub370 \uc788\uc5b4\uc11c \ub9ce\uc740 \uac1c\ubc1c\uc790\ub4e4\uc740 \uc77c\uad00\uc131\uc744 \uc720\uc9c0\ud558\uace0 \uc720\uc9c0\ubcf4\uc218\uc131\uc744 \ub192\uc77c \uc218 \uc788\ub294 \ub9ce\uc740 \uac1c\ubc1c \ubaa8\ub378\ub4e4\uc744 \uc0dd\uac01\ud574 \uc654\uc2b5\ub2c8\ub2e4. \ud2b9\ud788\ub098 \ud611\uc5c5\ud558\ub294 \uacfc\uc815\uc5d0\uc11c \ub85c\uc9c1\uacfc View \ub97c \ub2e4\ub8e8\ub294 \ucf54\ub4dc\uac00 \ub4a4\uc11e\uc774\uac8c \ub418\uba74 \uc791\uc131\uc790\ubfd0\ub9cc \uc544\ub2c8\ub77c \ub3d9\ub8cc\ub4e4\uc870\ucc28\ub3c4 \uc720\uc9c0\ubcf4\uc218 \ud558\uae30 \ud798\ub4e4\uc5b4\uc9c0\ub294 \ubaa8\uc2b5\uc744 \uc27d\uac8c \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ucf54\ub4dc \uc791\uc131\ub54c\ubb38\uc5d0 \ud300\ub2e8\uc704\ub85c, \ud504\ub85c\uc81d\ud2b8 \ub2e8\uc704\ub85c, \ub54c\ub85c\ub294 \ud68c\uc0ac \ub2e8\uc704\ub85c \uc5ec\ub7ec\uac00\uc9c0 \uc815\ucc45\uc744 \uac00\uc9c0\uace0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[17,33],"class_list":["post-818","post","type-post","status-publish","format-standard","hentry","category-programming","tag-android","tag-pattern"],"_links":{"self":[{"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/posts\/818","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/yoonhada.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=818"}],"version-history":[{"count":1,"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/posts\/818\/revisions"}],"predecessor-version":[{"id":2198,"href":"http:\/\/yoonhada.com\/index.php?rest_route=\/wp\/v2\/posts\/818\/revisions\/2198"}],"wp:attachment":[{"href":"http:\/\/yoonhada.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=818"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yoonhada.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=818"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yoonhada.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=818"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}