![저작자표시-비영리-변경금지 88x31.png](https://licensebuttons.net/l/by-nc-nd/3.0/88x31.png)
1. 전략 패턴(Strategy Pattern)
전략 패턴은 동일 패턴의 알고리즘에 대하여 하나의 접근을 만들어서 상호 교환이 가능하도록 하는 패턴입니다.
지난번 플라이웨이트 패턴에서 이미 구현했던 패턴입니다. 무기라는 인터페이스를 통해 공격이라는 하나의 알고리즘을 통해 서로 다른 무기들의 공격 알고리즘을 실행시킬 수 있었습니다. 이번에는 자동차를 통해 전략 패턴 코드를 작성해보겠습니다.
![qq9fdjbqAQCAAC4FCEQAADAhQiBAAAALkQIBAAAcCFCIAAAgAs9VukGPOoOHTokwzAq3Qy41KFDhyrdhA1xfqCSOD+A8g4dOsQQMQAAAG5EdzAAAIALEQIBAABc6P8BsNpRnjp3ss8AAAAASUVORK5CYII=](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoEAAAE6CAYAAABptoiTAAAgAElEQVR4nO3df2wb933/8dcN+SPkqigRidqAEoUWmpBWhklTNUwBpbkThkoDgs2zMcWqLGBo1oqbCqRC7XSAITUV4S2bjLoBYsxKlmGopLrOYGMeAkwuBqKeSNgZVM0aUJtsBoVVQ8AJSLeyCt7+u+8f+t6VlEj9sCWT1j0fgBCHvB8fUnfUi+/P3edjHDp0yLp27ZqASjh06JB+9KMfVboZAAC4jiHJsiyr0u2ASxmGIY4/AAAevt+odAMAAADw8BECAQAAXIgQCAAA4EKEQAAAABciBAIAALgQIRAAAMCFCIEAAAAu5OoQmEql1NLSIsMwin4SicSm60xPTz/ElgIAAOwsV4dA29TUlCzLkmVZmpqaUkdHR9kgGAwGdfPmTfX39z/kVgIAAOwcQuAaR44c0eDgoCYnJ3X37l1FIhH19fWpr69PLS0tmpmZcSqBiUSiqHK4tkpoP28Yhnp6epTL5Yoej0ajzn8BAAAeJkLgGh6PR/X19Uqn0zJNU5J0+/Ztvf7667p586YOHDjgLBsKhdTd3a10Oi1JmpubkyS1tbUplUppaGhIU1NTyufzCgQCOnXqlLNNm2VZGhkZeUivDgAAYBUhcAva29vV0NCw7nGfz6dwOKzZ2VnlcjnNzs46yxYGQo/Ho87OTqXTaeXzeWf9rq6uh/YaAAAAChECH1BXV5du3LiheDyuGzduqLOzUx6PR4uLi1pYWFAoFJJhGDp+/Lju3LmjbDZb6SYDAAAQAtcyTVOZTEaBQEAej2fT5UOhkPbv368LFy5IWq38SVJjY6Oam5uVTCadm05u3rypYDC4q+0HAADYCkLgGvPz85qYmNDAwMCWQqDdJXzx4sWibmM7DM7Nzck0TUUiEUUikXXXBAIAAFQCIVDS8ePHnbt4Ozo6FI/HFQ6Ht7y+fW2f3RUsrQ4lc+7cOR0/flxer1fpdFqnT5/eUrAEAADYbYYky7KsSrcDLmUYhjj+AAB4+KgEAgAAuBAhEAAAwIUIgQAAAC5ECAQAAHAhQiAAAIALEQIBAABciBAIAADgQo89++yzMgyj0u2ASz377LOVbgIAAK7EYNGoKAaLBgCgMugOBgAAcCFCIAAAgAsRAgEAAFyIEAgAAOBChEAAAAAXIgQCAAC4ECEQAADAhR5aCEylUurr61Mul1v3XCKRUCQSkWmaJdc1TVORSESJROK+993d3a1UKrWlx7ey341ej22z1wUAAFApj1W6AZIUDocVDod3bfsNDQ06cOCA5ubmFAwGncfn5uZ04MABNTQ0bHubwWBQFy5c2MlmAgAAPDT3VQlcW+EqrIrZ1TPDMGQYxroq2ve+9z0ZhqGWlhanArd2e9FotOz69v5aWlpkGIZ6enqcaly56pzH41FnZ6dmZ2edfZimqdnZWXV2dsrj8SiRSDj7XFu9+8lPfuLsb3p6uuS+CttUqvq32fsCAADwMN1XCAyFQlpeXtbS0pKk1YpaU1OTfD6fzpw5o/r6elmWpXg8rqGhISfs3b59W5/97GdlWZaOHj2qs2fPrgtLdsiyLEvJZFJvvfWW7t696zyfy+X06quv6ty5c7IsS+FwWKdOnZJpmk51zufzrWtzW1ubPvroI6fNS0tLWl5eVk9Pj1KplMbGxpRMJpXP5yVJZ86ccdadn5/X9evXFY/HNT4+vq77OJfL6fXXX9fFixdlWZbq6+t1+fLlomU2el8AAAAetvsKgV6vV7W1tZqbm3Mqal1dXcrlckokEurq6pIktba2qr29XdlsVpK0b98+tbW1SZKzTKHCbUm/7nKtq6tzlkkmk5JWg6gk9fb2anl52Qlv5dhdwnZbCoNrYbewx+PRwMCAMpmME1DtamEoFNLBgwfXbTuZTKq2ttbpVh4ZGVF/f7/z/N27dzd8XwAAAB62siGwsEs2Go0WPWd3ry4uLjoVNTuUSVJHR4cMw5DX69XExITS6bQkqa6uTn6/v2xjTNN0lt3I1atX5ff7ZRiGQqGQbt++vWmgstsci8WUy+U0OTlZFEQnJibk9XplGIY6OjqUTqedEBgIBDbc9lbaLJV/XwAAAB62siFwZGRElmXJsiyNjIyse76trU23bt1SMpl0KmqS9NRTTymZTDrrWpZVVBXbiMfj2TRwSdLg4KDy+byz/Zs3bxbd8FFOIBBQIpFQPB5XIBBQa2ur89zY2FhRm2dmZooqkJttdzMP8r4AAADstPseIqahoUG1tbU6fPiwU1Hz+XxqamrSe++9J+nXN0ts9SYIj8ej+vp6xWIxZ/3u7m799Kc/dZYJhUJKp9Oan5+XtHoNYeHNIRuxq5WHDx92unil1UAbj8eda/Si0ei2hnbx+/1F1xtGo9Gi6mldXd0DvS8AAAA77b5DoN292t3dXdQVfOLECWUyGaer9uTJk9sa/mXt+qOjo3r++eed530+n958800NDQ3JMAyNj4/rzTfflM/n23TsPp/Pp3A4rObmZufaRGn12sPR0VGFQiHnzt3Tp087IXEza9fPZDI6ceLEhq9ru+8LAADATjIkWZZlVbodcCnDMMTxBwDAw8e0cQAAAC5ECAQAAHAhQiAAAIALEQIBAABciBAIAADgQo9VugEAqpthGJVuAlARjFyAvY4QCGBT/DGE2/DlB25AdzAAAIALEQIBAABciBAIAADgQoRAAAAAF/oNafUCWH74qcQPsBeYpqnXXntNqVRq0+Wi0ahyudy2tx+JRGQYhqLR6IM0FQAcj0nc+YfKIQhiL8jn87p37578fv+Gy83PzyuTycjr9W57+5KUzWbl8/nuu50AUIjuYAAowa6+TU9Pb/pcNpvVE088Ia/Xq1Qqpddee01vv/22DMNQJBKRaZpKJBLq6OjQxMSEzpw5I0mKRqNOVbxwP9PT0zp79qx6enr0la98RX6/XxMTEzp16pRTTbTXK6wMFlYMDcNQIpHY8PFoNOq0b62NngOwNxACAaCAHbBefPFFDQ8Pq7+/f9Pnstmsampq5PF4lM1mNT4+rt/8zd+UZVmqr6/X/Py8wuGwxsbGFI/HNTIyomg0qkwmo3w+r2w2q/fff9/pTl5cXNTVq1c1PT2td955x1nv/Pnzunz5sqTVHpx8Pq+VlRWlUimZpqnh4WF1dnbKsiwlk0lduXJFd+/e1fDwsOrr653H33rrLeVyOY2MjGh4eFgvvvjiukC50XMA9gZCIABISqVSamlpUVdXlyzL0s2bNxUMBjd9TpLS6bS6urqcf09NTRWFR2m1GreysiK/369UKqV4PK7h4WF5PB75fD41NTUpm83KNE1lMhmNjIzI5/MVrSdJv//7v6+RkZF17Z+fn5ckHTlyRJIUDAb193//97p9+7bS6bT+6q/+SpLU0NCgZ555Rtls1lnu5s2bsixLXV1d6unpca5Z3Og5AI8+QiAA6NeBJxaLyTCMkmGo1HOmaWphYUF+v9/5d1tbmyQpl8vp1q1b8vv9RdcNZrNZ/fCHP1QoFHK6aEdHRyX9+vq/UCjk/L+9nmmaOn36tLOO1+vV//zP/8jv9yudTqu+vl4ej6fodaXTaV29elV+v99Z54c//KHzvB1wDcNQLBbTzMyMc93hRs8BePQRAgGgwMjIiCzL0vT0tPr7+4uu1Sv1XGFIW3uDiF1t8/v9SiaTkuTcFDI2NibLsop+wuGwksmk6uvrnbBVeL2hXe3L5/OyLEvxeFyBQMDZZmNjY8nXNDU1VbQfu5IZjUZ19uxZXb9+XZZlFVUYN3oOwN7A3MEAUILP59PMzMymz6VSKSekLS0tOf+WVgNcU1OTfD5fUaXO7/fr1q1byuVy8vl8mp6e1uzsrM6ePat0Ol0U5gqvNyxkmqYmJyedbQYCAU1OTurIkSPK5/Pq7+/XyMhI0eMej8e5tm9kZGTDYEfoA/Y+KoEA8AAKQ9rc3Jyam5udwFYY6AKBgEZHRzU9Pa1gMKiXXnrJ6aK1A6DH49Hi4qICgYCz/cJttLa2SlqtJnq9XtXX1zvLhcNh1dfXy+v1yu/3a2RkROFwuOhxe0gmAh4ASTIkWYwTiEoxDINxKqscvyO4Ecc93IBKIAAAgAsRAgEAAFyIEAgAAOBCOxICC6cwKjWV0VqpVEp9fX07OuioPVXT3bt3tzSROwAAgJvtWCWwcMyrfD6vTCZTNggGg0FduHBhxwYdNU1T7777rl555RXV1dXplVde0bvvvsuclwAemunp6aJ5eW3RaFQtLS1lv5ja8/qWm6c3kUiU3O79LgcAtk1DYC6XUyQS2VbVzuPxaHh4WPF4XKlUSqlUSt3d3eru7lZPT48++OAD9fX1KZPJKBKJFH1oRaNRZ3BW+0OtcBJ2+wPz2LFjzgfe/Py8ampqnGmcgsGgampqnIFVAWC3tbW1qbm5WbFYzHksl8spkUiovb1dDQ0N97XdcDjsDCQNADtp164JbGho0IEDB5wR8z/55BONjo5qZmZGTz75pCTp8ccfV2dnp/OhaU+x1NbWplQqpbGxMSWTSWcapTNnzjjbf+GFF5wPxlgs5szbaevq6ir6MAaA3dTQ0KD29nYlEgnnS3M2m9WdO3fU2dkpj8fjVAsLv9jalpeX9eUvf3ndtHRrK3yFU7ltVPkr/BLNnL8ASikbAu0PEL/fr4mJCWdQ08IplLZj3759zlRKhQKBgPOhmUwmVVtbq4aGBs3NzenAgQNqaGiQx+PRwMCAMpmM86FpD566dnJ1m9/v18rKCl3CAB4Kj8ejzs5OXb161Zkibm5uTtJqlTCRSOj48eOKx+PKZrNKp9NFX2xv376t119/XclkUnfu3Ck5W0kul9Orr76qkydPyrIsjY2NKRqNrgt4qVRKQ0NDmpqaUj6fVyAQ0KlTp/g8BFCkbAi0uyCy2awGBweVzWZlWZb6+/u3tOF8Pq90Ou38f11dXckQGAqF9NRTTymbzSoWiznfmCVpYmLCGeW+o6ND6XTa+RCzR9TP5/P6+c9/vvVXDAC7pLBL2DRNzc7OOl3BsVhM3d3dCoVC8vl8CofDRV9s9+/fL7/fL7/fr/3792txcXHd9u2A2NbWJml15o+ZmZl111cXhk87nKbTaadXBQCkXZw72A6NpYJfIZ/Pp6amJl27dk0rKyvOh5u0erPJ2umN1n6T9Xq9euaZZ3au4QBwn+wu4Uwmo1QqpRs3bujkyZOSpEwmo6tXrxZ9JnZ3dxd9sfV6vRsGtcIv1htZXFzUwsKCQqGQ81hzc7Oy2eyO3ZAH4NG36TWBPp9P58+f39YHh2maOnv2rDo6OpybNTbS1dWlwcFB3bt3z7l4uq2tzbmxRFq9YaTU3XMej0c1NTXOtYe2cpOuA8BusatuN27c0Pe//31Jv67G1dfXq7u72/mCbFmWZmZmVFdXt+XtBwIBLSwsrPu8W6uxsVHNzc1KJpPOvm7evLmlz2MA7rFjN4aMjo46FyHbE5tvdZLyUCik7u7uoq7gYDCo0dFRhUIh5+Ln06dPlwx1pW4CKXWzCADsNrs3Y3x8vOiu4K6uLud6wVwup56eng3HUy3F/qy0P++mp6dLDj9jt2Fubm7TIWgAuJv1qMvn89bJkyetZDJpWZZlJZNJ6+TJk1Y+n69wy7CZvXD87XX8jrYnn89bg4ODliRramqq6LmpqSlLkiXJGhwctPL5vLO8/f/ZbNbq7u62xsbGLMuyrHg8bkmy4vG4ZVmrn2/Nzc3OduzH1y5n/78kq7u728pmsw/xXXj0cdzDDYz/f6BXJH3upFQqpXfffVd//dd/rTfeeEOvvPIKXR+PAMMwtBeOv72M3xHciOMebrBnQiAeTXzQVj9+R3Ajjnu4wa4NFg0AAIDqRQgEAABwoR0JgdFo1Lkz2P7Z6K63VCqlvr6+HZ3GKJVK6bXXXtPCwoK6u7vX3S1nz1+82STupaZg2kp7E4nEpnff2W3kDj0AAFBpO1YJHBsbc8ajyufzymQyZYNgMBjUhQsXdmzQUtM09e677+qVV17R888/rwMHDjgj5tsKp6Hbrp1qbzAYVHNzsy5fvvxA2wEAAHhQm4bAXC6nSCSyraqdx+PR8PCwM9izXYXr7u5WT0+PPvjgA/X19SmTyayrvkWjUWd+4sIJ0O0qm12xO3bsmDN+4Pz8vGpqahQMBp3BWmdnZ52Kmz19kz0OYant2n7yk584k7Pb7VhbCSycwL1U9c9uY6kJ3nt6ejQ7O8tk7gAAoKJ27ZrAhoYGHThwwBnZ/pNPPtHo6KhmZmb05JNPSpIef/xxdXZ2OgOf5nI53bp1S21tbUqlUhobG1MymXSmUSqcbP2FF16QZVkKh8PrBoZua2vTRx99pKWlJUnS0tKSlpeX1dPTs+l25+fndf36dcXjcY2Pj6/rPs7lcnr99dd18eJFWZal+vr6dZW9M2fOqL6+XpZlKR6Pa2hoyNmOz+dTfX29M8E8AABAJZQNgXa1zO/3a2JiQn6/v6g6tl379u0rOY9wIBBQIpFQLpdTMplUbW2tGhoairpvPR6PBgYGiiZbb2xslLRadVtZWSna9toAOjc3p6amJvl8vk23a1cLQ6GQDh48uK69hW2UVidw7+/vd56/e/euEomEE0pbW1vV3t5eNM1TY2PjlucABQAA2A1lQ2A4HJZlWcpmsxocHHTmuywMPBvJ5/NFQaeurq5kCAyFQnrqqaeUzWYVi8WKpo6bmJiQ1+uVYRjq6OhQOp0ummzd3s/Pf/7zom3aXcKxWEy5XE6Tk5NFlcKtbLecrYa3jo4OZwq9iYkJQh8AAKgqj+3Whu3QWCr4FfL5fGpqatK1a9e0srLizHkprd5ssnb+4bXX33m9Xj3zzDPrthsIBDQ5Oanf/u3fViAQUGtr67a2W04gENDs7OyGyzz11FNKJpPMWII94e2339Y777xT6WYAD01TU1OlmwA8FJuGQJ/Pp/Pnz29ro6Zp6uzZs+ro6FAwGCw7LIutq6tLHR0dGhwcdLpZ29ra9L3vfU+pVErBYFDRaFSZTEZ/8zd/U7Sux+NRTU2NstlsUegKhUKSpMOHD2tqasqpLm51u+X4/X7nekN7ffs1SKsVz6amJr333nsaGRlRKpXSyy+/rHPnzikcDkuSFhcXiyqTQDX76le/yswJALAH7diNIaOjo87dsF6vV/X19euqbeWEQiF1d3cXdQUHg0GNjo4qFAo5d9iePn3aeb5QV1eXc3OJzefzKRwOq7m5uai6uJ3tlrJ2/UwmoxMnThQtc+LECWUyGRmGoVAopJMnTzoBMJfLKZPJOCEVAACgEvbE3MGmaepb3/qWXnnllarvgrVvrNnqtZV7HfNzVj9+R3Ajjnu4wZ6YNs7j8eiVV17Ru+++W9WzcaRSKS0sLOjIkSOVbgoAAHC5PVEJxKOLb9sP3z/90z/pz/7sz1RTU7Ol5fkdwY047uEGe6ISiL3r2rVr+trXvrbpHdnYmp/97Gd69dVXVV9fr29/+9taWVmpdJMAABVCCERVunPnjgYHB3X8+HH96le/0rFjx/SXf/mX+vTTTyvdtEeez+fTBx98oI8//pgwCAAuVpEQmMvl1NfXVzSv8NphZMo9brPn5y2cl7dw3cK5fktJJBIl5/0tZXp62vkptU65x7fSnq20o3A+5Y1ejz1czU7bqP2bvfb78Z3vfEef+9zn9OSTT+rDDz/UP//zP+vDDz/UZz7zGX3uc5/Td7/73R3bl1sdPHhQ77zzjj744ANlMhk9/fTThEEAcJmKVwLtKd7m5uaKHi+c3m27gsGgLly4IJ/P98DtK7yZY+2cxNJqGJ2dnS0a3mY7wuGwzp8/f1/rrt2OpJKh+EHt5Pu5kffff1+f//zn9Z//+Z9KJBL6u7/7Oz3++OOSVgcFHx8f17Vr1xSLxfS7v/u7+vd///ddbY8bHDx4UG+//bZu3LhBGAQAl9k0BOZyOUUikU2ravYYgT09Pc6ydrXOfi6RSMg0TZ06dUo/+MEP9PLLL2tpaUmdnZ2anZ11qklrg1Xh9tdWnX7yk5+opaWlaF7jtZWrVCrlLFOqalWqnbb33ntPf/InfyKPx1MysC4tLemjjz5yxiKMRqPOdtZW7773ve/JMAy1tLQ4Fc61lcDp6emy6699LYXvtST19vbqypUrMk2zbPVu7eOFVdly7V+7jv37aGlp0cLCQsljYjt++tOf6ktf+pJOnjypb37zm/rXf/1XNTc3l1z2d37nd/Rv//Zv+sY3vqGvf/3rOn78uBYXFx+4DW5XGAY//vhjwiAAuMADVwJzuZzeeustJZNJWZalgYEBzczMSJLOnDmj+vp6WZaleDyuoaEhLS0t6fTp0zp27JguXryoYDC4rsK2tLSk5eVl9fT0KJVKaWxsTMlkUvl83tmubX5+XtevX1c8Htf4+Pi67uNcLqfXX39dFy9elGVZqq+v1+XLl4uWKdXOVCq1bmBne07iwsA6NzfnzIwyPT2tTCajfD6vZDKp8fFxJ1Devn1bn/3sZ2VZlo4ePaqzZ8+uC6OJREKzs7PK5/PKZrN6//33i15PLpfTq6++qnPnzsmyLIXDYZ06dcrZjl01tWczKVW9a2hoUG1trZLJpCQpmUyqtrZWDQ0Nmp6eViKRUDabXdd+WyqV0tDQkOLxuK5fv6579+5tfpBs4i/+4i/0ySef6Pbt2+rt7d3SOseOHVMqlVImk9Ef/uEfOsGVn41/AoGAfvWrX5V9X+1u4u9///u6cOGCvva1rz3w7xcAUJ3KhkC72uP3+zUxMSG/31+2OlWov79f/f39yuVySiQSzvRora2tam9vVzabXbeOXWGzn5ubm1NTU5N8Pl9Rt7DH49HAwIAymYwTfOxqYSgU0sGDB9dtuzDkSNLIyEjRQM13794t285sNqsnnnhCXq/XWb6trU3Ly8vK5/NOxbKrq2td9TIYDOro0aNKp9OSpH379jnVwnJTxsViMWd9n8+nCxcuFA1+bQc3O5T29vY6bZGKp9Arx+PxqL6+3plhpXCfi4uLGhgYkM/nc9q/diaWbDar9vZ2tba2Or+PB/WP//iP2rdvnw4ePKh/+Zd/2dI6P/jBDxQMBvX000/rP/7jP2RZFj9b+Emn0/rMZz5T9n29ffu2vvKVr+hLX/qS+vr69NZbbz3w7xcAUJ3KhsBwOCzLspTNZjU4OKhsNivLstbNdOHz+fT666/r5ZdfLtnd2tHR4UwlNzEx4YSiQnaFLRaLKZfLaXJysigoTUxMyOv1yjAMdXR0KJ1OO/sIBAIbvsBS+yulVDuz2ey6SldhJW1+fl7pdLpoCrjjx487VZfR0VGnq7Kurk5+v7/s/k3TVCaT2bSdV69edQJ5KBTS7du3Nwx9pXR1dSmTyejjjz/WrVu31NbWVnL/jY2N69bd6vu5Hc8//7y+//3va3x8XG+88YYOHz5ctpv5v//7v/XHf/zH+s53vqPvfve7mpycLNlObI8d/trb2/X000/r448/1re+9a0tjyUIAHj07MiNIcFgUDdv3pRlWers7HS6a5966imnm9j+KTddWiAQUCKRUDweVyAQUGtrq/Pc2NhY0TZmZmZUV1e3pbZtFhI3aqff79cTTzxRtGxhJS0WizmVM1s8Hi/azlbnT7a3u5nBwUHl83ln+zdv3tz2VHmhUEjLy8v68Y9/rGeeecapsq7df6lr7bbyft6vl156ST/+8Y/V2dmpcDisb37zm/q///s/SVI+n9fJkyf1hS98QV1dXfqv//ov/dEf/dGutcUtCH8A4F6bhkCfz6fz58+XvTO01A0IjY2N8vl8ampq0nvvvecs19LSUvbuVbuadvjw4aI7bdva2hSPx4tuXNjOkCR+v7/oesNoNFo0lEpdXV3Zdvr9ft27d8/pbrV1dXVpdHRUly5dcrp47Wrm5OSkTNNULpdTT0/Ppt3nhRobG53rDe31C9+vUCikdDqt+fl5Sas3kay9EWdlZWXDiqMk53dz+PBhNTc3O+91Y2OjJicnlcvllEqldOnSpXVd14VtME1Tk5OTW359W/WNb3xD//u//6tf/OIXeu655/Tnf/7neu655/SrX/1KH374ob7+9a/v+D7dhvAHAHjgSmAwGNRLL73kdFHOzs46c+OeOHFCmUzG6bo8efKkwuGwvF6vamtr9fLLLzvhzufzKRwOq7m52QlW9vZHR0cVCoWcO3dPnz695SFV1q6fyWR04sSJomXKtdPn86m+vt65Fs8WCoXU3d2t9vb2oiFs+vv7VV9fL6/XK7/fr3A4XLbyWcra9QcGBpyhX+z36M0339TQ0JAMw9D4+LjefPNNJ6DbQbehoWHTsRK7urrWvdf9/f0Kh8Py+/1F70Mhn8+nkZERdXR0yOv1qrW1dV21dCfs379fb7/9tqampvSZz3xGFy9e1D/8wz/os5/97I7vy21yuZx+7/d+j/AHAC7H3MGbSKVSevfdd/Xtb3/7gcfy223RaFRdXV3rgls1Y37Oh4+5g4HNcdzDDSo+WHS1CwaDam5uXjesTLWxu40fpQCIyvjyl79M5Q8AQCUQlcW37erH7whuxHEPN6ASCAAA4EKEQAAAABequhAYjUaVSCSUSCSKhnLZSRvdOTs9Pb2tIWgAAAAeRVUVAgtvbrBvcCg3ruCDKDevLgAAgFtsGgJzuZwikUjZ8eZM01QkEtGxY8dkGIZisZgikYgT3nK5nPr6+pRKpZwKXCQScaZWs5czTVNXrlxRb2+vs+3e3l5duXJFpmmWrd4lEomiyl3hcnbb1u5r7bbseZJbWlrKTlcGAACwl+xYJfCFF16QZVl68cUXN1zu9u3b6uzslGVZGhsbc2bYKBzo2Gb/e2lpqWz1zp4CzV5/bm5OTU1N8vl8zvR1+Xxe8XhcQ0NDzuDUtlQqpaGhIcXjcV2/fn3dXMEAAAB7UdkQaFfH/H6/JiYmnBlByk2D1tjYuKUd7tu3z5mlonBKsmw2q5qamqIBmT0ej2pqapTNZozmeEUAABQHSURBVMtuz559ZG5uTqZpanZ2Vl1dXTJNU5lMRgMDA/J4PGptbVV7e7vm5uaK1s9ms2pvb1dra6s8Ho8GBga29DoAAAAeZY+VeyIcDsuyLOVyOZ06dUqnT5/e8Bq6QCCwpR3W1dWVnNs2nU5vaf217Dl7FxcXtbS0pOXlZYVCIeXz+aJtejwe1dfX79h+Abd4++239c4771S6GcBD09TUVOkmAA9F2RC4U7LZrO7evbvpcoFAQIuLi/e1j7a2Nr3//vtKJpNOV7BpmkXB1K4Mrq1YBgIBzc7O3td+ATf46le/yqC5ALAHbXpNoM/n0/nz57d9J20sFpO0eo3eJ598sunyfr9fKysrRUOzmKaplZWVkpXDQg0NDaqtrdXhw4edLma78mdfczg/P68bN244XdG2UCikdDqt+fl5maapycnJbb1OAACAR9GODxHj8Xg0PDysS5cuyTAMffrppzp48OCm6xXeBGIrvFlko7H97C7h7u5uhUIh5/ETJ05IWr1usKOjQ+fOnVMwGCxa1+fzaWRkRB0dHfJ6vWptbdUTTzyx/RcOAADwCKmquYMTiYRisZhGRkYkrQ4c3dXV5YwZiL2H+TmrH78juBHHPdygqgaLLhwgunDgaAAAAOysqqoEwn34tl39+B3BjTju4QZVVQkEAADAw0EIBAAAcCFCIIBHQjQada4Xjkaju7KPjUYhmJ6eLpqnHAAedYRAAFWv8EaxwhvIdlq5OcoBYC8iBAK4L7lcTpFIpGTVTFod7D0SiejYsWMyDEOxWEyRSMQJb7lcTn19fUqlUk4FLhKJyDAMGYbhLGeapq5cuaLe3l5n2729vbpy5YpM0yxbvUskEkWVu8Ll7Lat3dfabdlzqLe0tGhhYWFn30AAqDBCIIBd9cILL8iyLL344osbLnf79m11dnbKsiyNjY05s/0UDhpvKxxcvlz1LhQKaXl52Vl/bm7OmVbyzJkzkqR8Pq94PK6hoSGlUqmi9VOplIaGhhSPx3X9+nXdu3fvwd4IAKgyhEAA22JXx/x+vyYmJuT3+2UYhqanp0suv3a+7nL27dvnTOtoT/8orc4/XlNTI4/H4zzm8XhUU1OjbDZbdnter1e1tbWam5uTaZqanZ1VV1eXM4/4wMCAPB6PWltb1d7errm5uaL1s9ms2tvb1draKo/Ho4GBgS29DgB4VBACAWxLOByWZVnKZrMaHBxUNpuVZVnq7+8vuXwgENjSduvq6krOE55Op++rnfZ0kouLi1paWtLy8rJCoZDy+XzRNu15xndqvwDwqCAEAqiIbDaru3fvbrrcVkNkKW1tbbp165aSyaTTFez1eou2aVcGd3K/APAoIAQCuC8+n0/nz5/f9p20sVhM0uo1ep988smmy/v9fq2srBQNzWKaplZWVkpWDgs1NDSotrZWhw8fdrqY7cqffc3h/Py8bty44XRF20KhkNLptObn52WapiYnJ7f1OgGg2hECATwUHo9Hw8PDunTpkgzD0KeffqqDBw9uul7hTSC2wptFNhrbz+4S7u7uVigUch4/ceKEpNXrBjs6OnTu3DkFg8GidX0+n0ZGRtTR0SGv16vW1lY98cQT23/hAFClmDsYFcX8nNWvGn5HiURCsVhMIyMjklYHju7q6nLGDAR2WjUc98BuoxIIoOoVDhBdOHA0AOD+UQlERfFtu/rxO4IbcdzDDagEAgAAuBAhEAAAwIUIgQAAAC702KFDh2QYRqXbAZc6dOhQpZsAAIArGdwVAmAjXCAPN+K4hxvQHQwAAOBChEAAAAAXIgQCAAC4ECEQAADAhQiBAAAALkQIBAAAcCFCIAAAgAsRAgEAAFzosUo3AED1Y1YhANh7CIEANsSsCZXx4Ycf6vOf/7x+/OMf67nnnqt0cwDsQUwbBwBV6MCBA/rZz36mZ599Vh999FGlmwNgD+KaQACoMh9++KHS6bT6+vqUTqf14YcfVrpJAPYgKoEAUGUOHDigX/ziF/rlL3+pJ598Uk899RTVQAA7jkogAFQRuwr4xhtvSJLeeOMNqoEAdgWVQACoIgcOHNAvf/lL/eIXv3AeoxoIYDdQCQSAKmFXAf/2b/+26HGqgQB2A5VAAKgSpaqANqqBAHYalUAAqALlqoA2qoEAdhqVQACoAoV3BJdDNRDATqISCAAVtvaO4HKoBgLYSVQCAaDCOjs7FY/Ht7x8R0eHZmdnd7FFANyAEAgAVeDy5cvrHjt69KguXbq07vEjR448jCYB2OMIgQBQpQzDEB/RAHYL1wQCAAC4ECEQAADAhQiBAAAALkQIBAAAcCFCIAAAgAsRAgEAAFyIEAgAAOBChEAAAAAXIgQCAAC4ECEQAADAhQiBAAAALkQIBAAAcCFCIAAAgAsRAgEAAFyIEAgAAOBChEAAAAAXIgQCAAC4ECEQAADAhQiBAAAALkQIBAAAcCFCIAAAgAsRAgEAAFyIEAgAAOBChEAAAAAXIgQCAAC4ECEQAADAhQiBAAAALkQIBAAAcCFCIAAAgAsRAgEAAFyIEAgAAOBChEAAAAAXIgQCAAC4ECEQAADAhQiBAAAALvRYpRsAd/vCF76ga9euVboZQNUyDKPSTQCq0qFDh/SjH/2o0s14pBmWZVmVbgTcyzAMcQgCpXF+AOVxfjw4uoMBAABciBAIAADgQoRAAAAAFyIEAgAAuBAhEAAAwIUIgQAAAC5ECAQAAHAhQiAAAIALEQIBAABciBAIAADgQoRAAAAAFyIEAgAAuBAhEAAAwIUIgQAAAC5ECAQAAHAhQiAAAIALEQIBAABciBAIAADgQoRAAAAAFyIEAgAAuBAhEAAAwIUIgQAAAC5ECAQAAHAhQiAAAIALEQIBAABciBAIAADgQoRAAAAAFyIEAgAAuBAhEAAAwIUIgQAAAC5ECAQAAHAhQiAAAIALEQIBAABciBAIAADgQoRAAAAAFyIEAgAAuBAhEAAAwIUIgQAAAC5ECAQAAHAhQiAAAIALEQIBAABciBAIAADgQoRAAAAAFyIEAgAAuBAhEAAAwIUIgQAAAC5ECAQAAHAhQiAAAIALGZZlWZVuxKPsC1/4gq5du1bpZsClDh06pB/96EeVbkZZnB+oJM4PoLxDhw4RAh+UYRjiLUSlVPvxV+3tw95W7cdftbcPe5thGHQHAwAAuBEhEAAAwIUIgQAAAC5ECAQAAHAhQiAAAIALEQIBAABciBAIAADgQoRA7LhUKqWWlhYZhlH0E4lEZJpmpZsHVEwikVh3Xtg/09PT296eaZqKRCKcW6iIXC6nnp6edZ/vhX8DotHolraVSCTu6xzYDfZ5mkgkKt2UXUcIxK6ZmpqSZVmyLEvJZFI3btzQ5cuXK90soGLC4bAsy1I+n9fg4KC6u7uVzWZlWZb6+/u3vT2Px6Pz58/r/Pnz8ng8u9BiYGtu3LihpaUlSVI2m9XCwsKW102lUhoaGtqtpmEDhEA8FH6/X/v379fi4uK66oX9bbLwG2M0GqWCCNeZnp52jvuWlhalUinnfOnp6VEul3OqFNPT01QCURW++MUvSloNf5IUi8X0xS9+Uc3NzUXLlfpcz+VyevXVV7WwsKDjx487fwfW9ijZVTn78ddee00tLS3Odgqr7Pa5Mz097fy7cF274lhuH2sVbts+D/cKQiAeimQyqatXr6qxsXHTZROJhEZHRxWPx6kgwjVSqZTef/99ZbNZZbNZ7d+/X2fPnpUkDQ8P686dOzp16pSi0agGBwd15MiRCrcYWFVXV6eDBw8qFos5X1R6enq0f/9+Z5loNKpEIuEc3+l0WmfOnJHP59Obb76p5uZmTU1NaWRkRKlUSi+//LJOnjwpy7I0NTWloaEhJ8xJ0r1793T9+nWdP39eS0tLGhoaUjweVz6fV3t7u86ePavf+q3fkiTNzc0V/betrc0Jn/Y+xsbGFI1G1wU8u0o5NTWlfD6vQCCgU6dO7ZkvXYRA7Jrjx4873546Ojq2/Yero6ND2WxWN2/evK+uMuBREgwGdeHCBc3MzMjv9+vq1atFzx09elQTExO6evWqBgYG6P5F1aitrdUf/MEfKJFIKJlM6s6dO0Vf+O1gGA6H5fP55PP5NDAwoEuXLhUFO1thWJPkBMr33nvPWaazs9M5B+bm5rR//36FQqGiSySef/55tbe3a3Z2VrlcTrOzs2pvb1dDQ4PTTnsfIyMjmpmZkc/nK9sWj8ejzs5OpdNp5fP5HXwHK4cQiF1TeE2g/c3vT//0T3X37t0N12ttbdXg4KCk1SDolgt04W52l9Ps7Kyy2axzDth6e3vV3NyswcFBtba2VqiVQGkHDhzQnTt3dOXKFe3fv18HDx50nstms+uC4UYWFxe1f/9++f3+LS9fSmFos3uV7PCYTqe3vO2FhQWFQiEZhqHjx4/rzp07Ttf3o44QiIfC5/MpHA5vaVn7m5zdDSCpZJke2EtisZi6u7t1+vRpeb3eoudM09TZs2e1sLCgiYkJLo9A1Tl48KD279+v8fFxBQKBomO48JrwrWhsbNxW0Npo+ba2Nt25c0exWMz5f0kKBAJaWFjYdB+NjY1qbm5WMpl0iho3b95UMBjcUtuqHSEQD4XdHRAIBFRXV6f6+nqnpG5fL2grvJj3yJEjGhwcXPehAuw1hX/I5ufnNTEx4Tx3+fJlTUxM6Ic//KEGBwc1Pj5eshsNqBSPx6NAICCpuKtW+nURIJFIKJfLKZfLaXJyUkePHi0ZpuygZnfFzszM6M6dO+rt7S2577XLR6NR5waOhoYGtbe3a3R01OkKlqRQKKTu7m4nHK69iaTUtvfijViEQOyawmsC7bL+6dOn5fF41Nvbqzt37sjv92tyclLd3d3Oev39/Tp69KhCoZC8Xq9u3Lih4eFhroHCnmZf9xQKhTQ0NKQvfvGLSqfT+vjjjzU5OanBwUF1dHRoeHhYkoqujwIqzev1qrOzU5KcMFhoZGRE4XBYfr9ffr9f4XBYIyMjkuQEtePHjysSiaihoUEXL17U+Pi4DMPQ+Pi4Ll68WLb6FgwGde7cOedvzqVLl/Tmm2/K5/M5XcJScTi1b0i5dOmS08177ty5dfso3LbX61U6nXb+ju0FhmVZVqUb8SgzDEO8haiUaj/+qr192Nuq/fir9vbtFdPT05sGSTcyDEOPVboRAAAAO80eamZhYUFTU1MEwBKoBD4gvsmhkqr9+Kv29mFvq/bjr9rbh73NMAyuCQQAAHAjQiAAAIALEQIBAABciBAIAADgQoRAAAAAF2KImAf07LPPyjCMSjcDLvXss89Wugkb4vxAJXF+AOU9++yzDBHzoLjFH5VU7cdftbcPe1u1H3/V3j7sbQwRAwAA4FKEQAAAABfimsAdwDUdQHmcH0B5nB+oJELgDuCaDlTKo/AHhPMDlcL5AZTHNYEAAAAuRQgEAABwIUIgAACACxECAQAAXIgQCAAA4EKEQAAAABciBAIAALgQIRAAAMCFCIEAAAAuRAgEAABwIUIgAACACxEC95hoNKpEIqFEIqFoNLor+0ilUurr61Mul1v33PT0tCKRiEzT3JV9Aw+C8wMoj/PDfQiBe0gikZAkhcNhhcPhosd2UjAY1IULF+Tz+XZ828Bu4fwAyuP8cCdC4C7L5XKKRCIlv/VIkmmaikQiOnbsmAzDUCwWUyQScU6+XC6nvr4+pVIp5xtUJBKRYRgyDMNZzjRNXblyRb29vc62e3t7deXKFZmmWfbbVyKRKPrmVbic3ba1+1q7rUQiIcMw1NLSooWFhZ19A7GncX4A5XF+YLcRAqvECy+8IMuy9OKLL2643O3bt9XZ2SnLsjQ2NqbJyUmZpqmlpSVJUkNDg7Os/e+lpaWy375CoZCWl5ed9efm5tTU1CSfz6czZ85IkvL5vOLxuIaGhpRKpYrWT6VSGhoaUjwe1/Xr13Xv3r0HeyOAEjg/gPI4P3C/CIG7xP524/f7NTExIb/fL8MwND09XXL5xsbGLW133759amtrkyR1dXU5j2ezWdXU1Mjj8TiPeTwe1dTUKJvNlt2e1+tVbW2t5ubmZJqmZmdn1dXVJdM0lclkNDAwII/Ho9bWVrW3t2tubq5o/Ww2q/b2drW2tsrj8WhgYGBLrwPuxvkBlMf5gYeFELhLwuGwLMtSNpvV4OCgstmsLMtSf39/yeUDgcCWtltXVye/37/u8XQ6fV/t9Hg86uzs1OLiopaWlrS8vKxQKKR8Pl+0TY/Ho/r6+h3bL9yN8wMoj/MDDwshsMpls1ndvXt30+W2+iFQSltbm27duqVkMumU8r1eb9E27W92O7lf4EFxfgDlcX5gM4TAXebz+XT+/Plt3wkVi8UkrV5j8cknn2y6vN/v18rKStGt9aZpamVlpeQ3v0INDQ2qra3V4cOHnS4C+5ubfc3I/Py8bty44XQl2EKhkNLptObn52WapiYnJ7f1OuFunB9AeZwf2G2EwCrj8Xg0PDysS5cuyTAMffrppzp48OCm6xVexGsrvNh3o7GZ7JJ+d3e3QqGQ8/iJEyckrV730dHRoXPnzikYDBat6/P5NDIyoo6ODnm9XrW2tuqJJ57Y/gsHtoDzAyiP8wPbZViWZVW6EY8ywzBULW9hIpFQLBbTyMiIpNWBP7u6upwxn7D3VNPxV0o1tY/zw32q6fgrpZrax/nhPoZhUAncSwoH+Cwc+BMA5wewEc4Pd6IS+ICq6Zsc3Kfaj79qbx/2tmo//qq9fdjbqAQCAAC4FCEQAADAhQiBAAAALkQIBAAAcCFCIAAAgAs9VukGPOoOHTokwzAq3Qy41KFDhyrdhA1xfqCSOD+A8g4dOsQQMQAAAG5EdzAAAIALEQIBAABc6P8BsNpRnjp3ss8AAAAASUVORK5CYII=)
클래스 다이어그램입니다.
Vehicle.java:
Vehicle은 탈것들의 인터페이스 입니다. run이라는 메소드의 접근점을 제공합니다.
Bus.java:
Taxi.java:
Motorcycle.java:
전략 객체 클래스 입니다. Vehicle 이라는 인터페이스를 상속받아 각각 run이라는 메소드를 구현했습니다.
Driver.java:
전략 객체들을 관리하는 컨텍스트(Context) 객체 클래스 입니다. 전략 객체 클래스와 집합(Agregation) 관계에 있으며, 여기서는 Vehicle을 상속받았습니다.
Main.java:
탈것없이 운전자 객체를 생성하여 run을 실행하고, 버스객체로 탈것을 전환한 뒤 다시 run을 실행하면 다음과 같이 출력됩니다.
![BRHq7Gm7Ojzr2nclI5+LdAnv6TeLKJsLkmHmpEuzDYeCBs+6LfW0T6QqCO+DV9bsFVrFGUGbMSGnh0j2uiWun3ufYhgb9NUrF9zSRXi+4LLtAbEvrpl59MSfCLR5Tj0s2Zi9gsKT4xibSG9Vw1zl9K25dZP8U1jWR3tHG71Ls+3CD9vNJLPXRZJu2a8cfjkUp9RtABkzCKWRPIpxCgiOcQoIjnEKCI5xCgiOcQoIjnEKCI5xCgiOcQoIjnEKCI5zyD+1cwJipS43DAAAAAElFTkSuQmCC](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJwAAAAtCAYAAABbLgKdAAAFEElEQVR4nO2bIXSrPhTGv/fO32Gmpnp2Tg1qBh1Xj4mvwM1HR6Hj5xDxMfg6NOapGszU1DPo/xNABxQCtCzttvtzW0sSmo97b5KPX09PT/+DIBzx+9YDIH4WJDjCKSQ4wilOBMekhlGRm+uYhDYKy3tz399P5L/rm2CQWiDw+v8vkas94sx2bQRlQmzrv4qUQyRT/XWv+aBAygVGL2cSWvg4To6p352CCc97Q5GCTw+W6LGC4DLE++4MMqkh/CMO1ollkDrEY67A46wWhIY8TgkigeDdiY6UQYg/42K7mgkxE7P5hJQagQceiiPwYgyMMRDn4Q+IOAKvwKFRVxbjNQcCvjyl7bYlctOWwxahMTCU6u6OFSJcCyahRQDkCvtWmGJSQzz0vrp5BIpDJ2pkb+8Q/gYMwKys1+qvGxUpIt0rKwnuo66aV4dZ8AIIYyCav4uRHpVBuF2hv1WoImo4q2792VwtOCZ1lTItRXQW7+dFLADt6DQUGRuhocyheLyg3c+EIupcrhbcSUyRgjFm/Is9QWZv7xDBMyLgNFFs8wiURxwt/SWCI6lXxi+SIVspnDDGVmmHsLNeDZcI8JFHfChSITHIdwI7yZDUq9SXwEORfmbU8hAIAyMGPipSqL8Lm2MMdplGUHoDs7+XSHx71hPc2H5Vw1ktliHe+1BGwNQKWFqPecHHtROdAVmM/cSsM7kb+aSp0XqUOdTreHuRCrH1sGok/uqsu0otc6hFT/P5ntqy7rqrYQD1yrUfTq/AErmb/l5GL03xrDcwJLYT6wqO6JFA7G89hvtiXcH1tzQ6rL+SW5RSibvgFxkwCZeQPYlwCgmOcAoJjnCKk1VqtfF7WM8/Vh/aD3hQai5foJyOztos3u75YPTez/YtW2Out3YOF9zDRb/1Ff0t5XrBDQw2Uga7vwN7ZJNNVT66ycm1beJevA9XGxCKFHzAbyeMgn82ISNm0DkCndrfG+IbmEjvah/Of/CA97fpSDIjwi2GbfCIvq+uIjE5dsLH5sw31d+4rs54/ePBcg9jjuVm6Cm45Uj6cu7DYHBHgovwvAVQzvXDrfwDZm94F0FlAM16cYwH8FDgbWpQtak0jbNuau7ovxbpREr9OE67D6GsxUqCOz9rLPNlLUQqxLbMkR59CBUhmwz1I+ebNct9cgkEP0JqAWN6rc6yQkVQ4RZlripxCD5qsQKT0OEjcsVPqZFJDaEljqdU/L2E1rCS4Lo/TqQMwv4pgCXLVdGgQMpjJGDYaAGjN+N10IyD+Ms4fz9jFk2KLwoUgYCWsNev/sNwOeA9wMdMt/PquDGRflpKbR+sDz7lQCuttAVbTXpVqBvwdqSarN3ORrH4zbGlbTaps2xeBkJUO2A4Ui6GvX2JAIeC6Vilbh3R3PR/uxqOSehwO5r6EsGRMAktDBTq73xKZBtxrEQKJoRlEurXI9FPt1V7kdR4lmzcTGpbpV54n1/BRHq7Gm7Ojzr2nclI5+LdAnv6TeLKJsLkmHmpEuzDYeCBs+6LfW0T6QqCO+DV9bsFVrFGUGbMSGnh0j2uiWun3ufYhgb9NUrF9zSRXi+4LLtAbEvrpl59MSfCLR5Tj0s2Zi9gsKT4xibSG9Vw1zl9K25dZP8U1jWR3tHG71Ls+3CD9vNJLPXRZJu2a8cfjkUp9RtABkzCKWRPIpxCgiOcQoIjnEKCI5xCgiOcQoIjnEKCI5xCgiOcQoIjnEKCI5zyD+1cwJipS43DAAAAAElFTkSuQmCC)
2. 상태 패턴(State Pattern)
상태 패턴은 객체의 내부 상태에 따라 행위를 변경해주는 패턴입니다. 전략 패턴과 유사해 보이지만 전략 패턴에서 클라이언트가 상태를 설정해주는 것과 달리 상태 패턴은 내부에서 자체적으로 상태를 변경합니다.
컴퓨터 전원 스위치를 예로 들어 코드를 작성해 보겠습니다.
![qS0oDZe0UF8AAAAASUVORK5CYII=](data:image/png;base64,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)
클래스 다이어그램입니다. 전략패턴과 유사해보입니다.
State.java:
상태 객체 클래스의 인터페이스 입니다. 토글 메소드를 정의합니다. 컨텍스트(Context) 객체인 Switch를 매개변수로 받습니다.
On.java:
Off.java:
상태 객체 클래스 입니다. on 상태에서는 toggle 메소드가 실행되면 컴퓨터가 꺼지고, off 상태에서는 컴퓨터가 켜집니다. 각각의 상태를 싱글톤으로 작성했습니다.
Switch.java:
컨텍스트(Context) 객체 클래스인 스위치 입니다. 초기 상태는 off상태입니다.
Main.java:
컴퓨터 스위치를 3번 토글한다면 다음과 같은 출력을 얻을 수 있습니다.
물론 enum을 통해서 다음과 같이 상태를 관리할 수도 있습니다.
그러나 이러한 코딩은 상태가 많아질수록 복잡해지며, 컨텍스트 객체 하나에서 모든 책임을 맡고 있습니다. 또한 상태가 추가될 때마다 코드를 수정해야만 합니다. 상태 패턴으로 작성한다면 책임을 각 상태 클래스에 위임할 수 있으며 코드도 간결해집니다.
최대절전모드를 추가해보겠습니다.
Switch.java:
longPush 메소드를 추가했습니다. on 상태에서만 동작하며, 강제 형변환을 통해 on 객체의 longPush 메소드를 실행합니다.
On.java:
longPush 메소드가 실행되면 컴퓨터가 꺼지고, toggle 메소드가 실행되면 최대절전모드가 됩니다.
Hibernate.java:
최대절전모드 상태 클래스 입니다. 토글시 컴퓨터가 켜집니다.
Main.java:
다음과 같이 컴퓨터를 켜고, 최대절전모드로 전환하고, 다시 컴퓨터를 켜고, 컴퓨터를 끌 수 있습니다.
|