<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>  dreaming DiNO</title>
    <link>https://coding-mia.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 26 May 2026 01:18:03 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>MK_____</managingEditor>
    <item>
      <title>[프로그래머스] 짝수의 합 (Kotlin)</title>
      <link>https://coding-mia.tistory.com/198</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-22 오후 10.50.11.png&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;1090&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMQ9pu/btsAIFnxLVD/fAdbxj3IpUkIVFRYehH7N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMQ9pu/btsAIFnxLVD/fAdbxj3IpUkIVFRYehH7N0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMQ9pu/btsAIFnxLVD/fAdbxj3IpUkIVFRYehH7N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMQ9pu%2FbtsAIFnxLVD%2FfAdbxj3IpUkIVFRYehH7N0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;499&quot; data-filename=&quot;스크린샷 2023-11-22 오후 10.50.11.png&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;1090&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700661054645&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    fun solution(n: Int): Int {
        var answer: Int = 0
        
        var mok = 0
        
        if (n%2 == 0) {
            mok = n/2
        } else {
            mok = (n-1)/2
        }
        
        for (i in 1 .. mok) {
           answer += 2 * i
        }
        
        return answer
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 나머지 연산자 % 를 이용해서 홀수, 짝수 분기 하였고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) for문 이용하여 몫까지 더해주도록 하였다&lt;/p&gt;</description>
      <category>알고리즘</category>
      <author>MK_____</author>
      <guid isPermaLink="true">https://coding-mia.tistory.com/198</guid>
      <comments>https://coding-mia.tistory.com/198#entry198comment</comments>
      <pubDate>Wed, 22 Nov 2023 22:52:12 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 두 수의 나눗셈 (Kotlin)</title>
      <link>https://coding-mia.tistory.com/197</link>
      <description>&lt;div id=&quot;SE-b5dfb4bb-9c29-44a8-99f2-ac75505587a1&quot; style=&quot;background-color: #ffffff; color: #8a837e; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-81c0159f-903a-4ceb-9778-495d8bb431d5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;정수 num1, num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 solution 함수를 완성해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b0af443c-6042-4d77-b683-a2419a0728db&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-56045328-7eeb-4024-a1d6-00eed7e54fd1&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;입출력 예&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-fbb3fae5-e62d-4a20-bf9e-bb390c5a6102&quot; style=&quot;background-color: #ffffff; color: #8a837e; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;text-align: left; border-collapse: collapse; width: 46.8605%; height: 137px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f7f7f7;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;num1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #f7f7f7;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;num2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #f7f7f7;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;result&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;1500&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;2333&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;16&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;62&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-46f31154-09a5-4847-96b0-82f7588391f4&quot; style=&quot;background-color: #ffffff; color: #8a837e; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-51c98e72-9ec5-418e-bca5-2ee65eb49a6e&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700659612312&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    fun solution(num1: Int, num2: Int): Int {
        var answer: Int = 0
        
        // double 형변환
        var newNum1 = num1.toDouble()
        var newNum2 = num2.toDouble()
        
        var after = newNum1 / newNum2 * 1000
        
        /*
        var after = num1.toDouble() / num2.toDouble() * 1000
        */
        
        answer = after.toInt() // Int 형변환

        return answer
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>알고리즘</category>
      <author>MK_____</author>
      <guid isPermaLink="true">https://coding-mia.tistory.com/197</guid>
      <comments>https://coding-mia.tistory.com/197#entry197comment</comments>
      <pubDate>Wed, 22 Nov 2023 22:28:37 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 평행 (Kotlin)</title>
      <link>https://coding-mia.tistory.com/196</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-11-22 오후 6.25.33.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;1148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caSnQN/btsAL4eRRed/NyzJZRbZwMgyQ9uaFSaLzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caSnQN/btsAL4eRRed/NyzJZRbZwMgyQ9uaFSaLzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caSnQN/btsAL4eRRed/NyzJZRbZwMgyQ9uaFSaLzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaSnQN%2FbtsAL4eRRed%2FNyzJZRbZwMgyQ9uaFSaLzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;1148&quot; data-filename=&quot;스크린샷 2023-11-22 오후 6.25.33.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;1148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;기울기 = (y축 증가량) / (x축 증가량)&lt;/b&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1700645229819&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    fun solution(dots: Array&amp;lt;IntArray&amp;gt;): Int {
        var answer: Int = 0
        
        var x1 = dots[0][0]
        var x2 = dots[1][0]
        var x3 = dots[2][0]
        var x4 = dots[3][0]
        
        var y1 = dots[0][1]
        var y2 = dots[1][1]
        var y3 = dots[2][1]
        var y4 = dots[3][1]
        
        var hor1 = (y2-y1) / (x2-x1)
        var hor2 = (y1-y4) / (x3-x4)
        
        var ver1 = (y1-y2) / (x3-x2)
        var ver2 = (y4-y1) / (x4-x1)
        
        if ( (hor1 == hor2) || (ver1 == ver2) ) {
            answer = 1
        } else {
            answer = 0
        }
        
        return answer
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공책에 좌표 찍어서 사각형 그린다음에 기울기를 구했다,,&lt;/p&gt;</description>
      <category>알고리즘</category>
      <author>MK_____</author>
      <guid isPermaLink="true">https://coding-mia.tistory.com/196</guid>
      <comments>https://coding-mia.tistory.com/196#entry196comment</comments>
      <pubDate>Wed, 22 Nov 2023 18:28:51 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] url &amp;gt; DownloadManager로 파일 다운로드 받기</title>
      <link>https://coding-mia.tistory.com/195</link>
      <description>&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;// 파일 다운로드
private var mDownloadManager: DownloadManager? = null
private var mDownloadQueueId: Long? = null

private val downloadCompleteReceiver: BroadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent) {
        val reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
        if (mDownloadQueueId == reference) {
            val query = Query() // 다운로드 항목 조회에 필요한 정보 포함
            query.setFilterById(reference)
            val cursor = mDownloadManager!!.query(query)
            cursor.moveToFirst()
            val columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)
            val columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON)
            val status = cursor.getInt(columnIndex)
            val reason = cursor.getInt(columnReason)
            cursor.close()
            when (status) {
                DownloadManager.STATUS_SUCCESSFUL -&amp;gt; Toast.makeText(this@MainActivity, &quot;다운로드를 완료하였습니다.&quot;, Toast.LENGTH_SHORT).show()
                DownloadManager.STATUS_PAUSED -&amp;gt; Toast.makeText(this@MainActivity, &quot;다운로드가 중단되었습니다.&quot;, Toast.LENGTH_SHORT).show()
                DownloadManager.STATUS_FAILED -&amp;gt; Toast.makeText(this@MainActivity, &quot;다운로드가 취소되었습니다.&quot;, Toast.LENGTH_SHORT).show()
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;kotlin&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;private fun downloadFile(fileUrl: String) {
    TDebugLog.i(logTag, &quot;downloadFile-()&quot;)
    TDebugLog.d(logTag, &quot;fileUrl: $fileUrl&quot;)
    val mimetype = getMimeType(fileUrl)
    val fileName = Uri.parse(fileUrl).getQueryParameter(&quot;file_nm&quot;)
    val outputFilePath = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DOWNLOADS + &quot;/$fileName&quot;)

    if (mDownloadManager == null) {
        mDownloadManager = this.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
    }

    val outputFile = File(outputFilePath.toString())
    if (!outputFile.parentFile?.exists()!!) {
        outputFile.parentFile?.mkdirs()
    }

    val downloadUri: Uri = Uri.parse(fileUrl)
    val request = DownloadManager.Request(downloadUri)
    val pathSegmentList = downloadUri.pathSegments
    request.setTitle(&quot;$fileName&quot;)
    request.setMimeType(mimetype)
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
    request.setDestinationUri(Uri.fromFile(outputFile))
    request.setAllowedOverMetered(true)

    mDownloadQueueId = mDownloadManager!!.enqueue(request)

}

private fun getMimeType(url:String): String {
    var mimetype = &quot;&quot;
    val extension = url.split(&quot;.&quot;)
    if (extension.isEmpty())
        return mimetype
    mimetype = when (extension[extension.size-1]) {
        &quot;pdf&quot;-&amp;gt; &quot;application/pdf&quot;
        &quot;doc&quot;-&amp;gt; &quot;application/msword&quot;
        &quot;xls&quot;-&amp;gt; &quot;application/vnd.ms-excel&quot;
        &quot;js&quot; -&amp;gt; &quot;application/x-javascript&quot;
        &quot;zip&quot;-&amp;gt; &quot;application/zip&quot;
        &quot;png&quot;-&amp;gt; &quot;image/png&quot;
        &quot;jpeg&quot;, &quot;jpg&quot;, &quot;jpe&quot;-&amp;gt; &quot;image/jpeg&quot;
        &quot;css&quot; -&amp;gt; &quot;text/css&quot;
        &quot;html&quot;, &quot;htm&quot;-&amp;gt; &quot;text/html&quot;
        &quot;txt&quot;-&amp;gt; &quot;text/plain&quot;
        &quot;xml&quot;-&amp;gt; &quot;text/xml&quot;
        &quot;xsl&quot;-&amp;gt; &quot;text/xsl&quot;
        else-&amp;gt; &quot;&quot;
    }
    return mimetype
}

override fun onResume() {
    TDebugLog.i(logTag, &quot;onResume-()&quot;)
    super.onResume()
    val completeFilter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
    registerReceiver(downloadCompleteReceiver, completeFilter)
}

override fun onPause() {
    TDebugLog.i(logTag, &quot;onPause-()&quot;)
    super.onPause()
    unregisterReceiver(downloadCompleteReceiver)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처: &lt;a href=&quot;https://khs613.github.io/android/download-manager/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://khs613.github.io/android/download-manager/&lt;/a&gt;&lt;/p&gt;</description>
      <author>MK_____</author>
      <guid isPermaLink="true">https://coding-mia.tistory.com/195</guid>
      <comments>https://coding-mia.tistory.com/195#entry195comment</comments>
      <pubDate>Fri, 25 Aug 2023 10:53:11 +0900</pubDate>
    </item>
    <item>
      <title>[Android] Android Debug Database</title>
      <link>https://coding-mia.tistory.com/194</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sjhp.tistory.com/3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sjhp.tistory.com/3&lt;/a&gt;&lt;/p&gt;</description>
      <category>Android/Android Studio</category>
      <author>MK_____</author>
      <guid isPermaLink="true">https://coding-mia.tistory.com/194</guid>
      <comments>https://coding-mia.tistory.com/194#entry194comment</comments>
      <pubDate>Thu, 3 Aug 2023 17:27:25 +0900</pubDate>
    </item>
    <item>
      <title>[Android] 맥북 안드로이드 미러링 scrcpy + 여러개 띄우고 싶을때</title>
      <link>https://coding-mia.tistory.com/193</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. scrcpy 설치&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f6f8fa; color: #24292f; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;brew install scrcpy&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f6f8fa; color: #24292f; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;brew install android-platform-tools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. adb 디바이스 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 실행&lt;/p&gt;
&lt;pre id=&quot;code_1689653284468&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;scrcpy&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;여러 device scrcpy 띄우고 싶을때&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 2개 띄우고 싶으면 터미널 2개를 띄워서 각각 명령어 실행&lt;/p&gt;
&lt;pre id=&quot;code_1689654986479&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;scrcpy --serial [디바이스 serialNo OR wifi IP]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. adb device 에서 나온 정보가 serial No.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-18 오후 1.37.15.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IJT5x/btsn0EUnusm/mi3DNdQADE8T72uWqVi2F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IJT5x/btsn0EUnusm/mi3DNdQADE8T72uWqVi2F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IJT5x/btsn0EUnusm/mi3DNdQADE8T72uWqVi2F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIJT5x%2Fbtsn0EUnusm%2Fmi3DNdQADE8T72uWqVi2F1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;232&quot; data-filename=&quot;스크린샷 2023-07-18 오후 1.37.15.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처: &lt;a href=&quot;https://www.downloadsource.net/how-to-use-multiple-phones-with-scrcpy-setup-two-phones-with-scrcpy/n/21115/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.downloadsource.net/how-to-use-multiple-phones-with-scrcpy-setup-two-phones-with-scrcpy/n/21115/&lt;/a&gt;&lt;/p&gt;</description>
      <category>Android</category>
      <author>MK_____</author>
      <guid isPermaLink="true">https://coding-mia.tistory.com/193</guid>
      <comments>https://coding-mia.tistory.com/193#entry193comment</comments>
      <pubDate>Tue, 18 Jul 2023 13:08:09 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] Firebase 계정생성</title>
      <link>https://coding-mia.tistory.com/192</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Project 설정, google-services.json 파일 넣기, gradle 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Tool - Firebase - Authentication&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(빠진 gradle 있을 수 있으므로 여기서도 SDK 연결해서 넣어주기)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-11 오후 4.03.53.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;1202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSvmcb/btsnhsTCWpU/svbtLlnJLnwr5K2oDiQ90K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSvmcb/btsnhsTCWpU/svbtLlnJLnwr5K2oDiQ90K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSvmcb/btsnhsTCWpU/svbtLlnJLnwr5K2oDiQ90K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSvmcb%2FbtsnhsTCWpU%2FsvbtLlnJLnwr5K2oDiQ90K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;1202&quot; data-filename=&quot;스크린샷 2023-07-11 오후 4.03.53.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;1202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. RegisterFragment.kt&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;private lateinit var auth: FirebaseAuth&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;kotlin&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_register, container, false)
    with(binding) {
        viewModel = registerViewModel
        lifecycleOwner = viewLifecycleOwner
    }
    auth = Firebase.auth
    return binding.root
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;binding.signUpBtn.setOnClickListener {
    createAccount(binding.inputEmail.text.toString(), binding.inputPw.text.toString())
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;private fun createAccount(email: String, password: String) {
    DebugLog.i(logTag, &quot;createAccount-()&quot;)
    if (email.isNotEmpty() &amp;amp;&amp;amp; password.isNotEmpty()) {
        DebugLog.d(logTag, &quot;email: $email, pw: $password&quot;)
        auth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener { task -&amp;gt;
                if (task.isSuccessful) {
                    DebugLog.d(logTag, &quot;계정 생성 Success&quot;)
                    val user = auth.currentUser
                    DebugLog.d(logTag, &quot;user: $user&quot;)
                } else {
                    DebugLog.d(logTag, &quot;계정 생성 Fail, e =&amp;gt; ${task.exception.toString()}&quot;)
                }
            }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파베 콘솔&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-11 오후 4.11.22.png&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVIstK/btsngME3RJy/oBWqjuIoNnVdYLlkCNZ6Uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVIstK/btsngME3RJy/oBWqjuIoNnVdYLlkCNZ6Uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVIstK/btsngME3RJy/oBWqjuIoNnVdYLlkCNZ6Uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVIstK%2FbtsngME3RJy%2FoBWqjuIoNnVdYLlkCNZ6Uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1520&quot; height=&quot;208&quot; data-filename=&quot;스크린샷 2023-07-11 오후 4.11.22.png&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gradle 설정이 잘못되서 Fail이 떨어지는 줄 알았는데, 비번을 1234로 해줘서 그랬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;task.exception 로그를 찍어보자..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android</category>
      <author>MK_____</author>
      <guid isPermaLink="true">https://coding-mia.tistory.com/192</guid>
      <comments>https://coding-mia.tistory.com/192#entry192comment</comments>
      <pubDate>Tue, 11 Jul 2023 16:11:58 +0900</pubDate>
    </item>
    <item>
      <title>[Android] BottomNavigation 아이콘 색상 바꾸기</title>
      <link>https://coding-mia.tistory.com/191</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. color&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;-&amp;gt;&lt;span&gt; bottom_navigation_item_selector&lt;/span&gt;&lt;/span&gt;.xml 만들기&lt;/p&gt;
&lt;pre class=&quot;xml&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;selector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&amp;gt;
    &amp;lt;item android:color=&quot;#000000&quot; android:state_checked=&quot;true&quot; /&amp;gt;
    &amp;lt;item android:color=&quot;#CCCCCC&quot; android:state_checked=&quot;false&quot; /&amp;gt;
&amp;lt;/selector&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. itemTextColor, itemIconTint 적용&lt;/p&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;&amp;lt;com.google.android.material.bottomnavigation.BottomNavigationView
    android:id=&quot;@+id/bottom_nav&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;wrap_content&quot;
    app:menu=&quot;@menu/bottom_nav_menu&quot;
    app:labelVisibilityMode=&quot;labeled&quot;
    app:itemTextColor=&quot;@color/bottom_navigation_item_selector&quot;
    app:itemIconTint=&quot;@color/bottom_navigation_item_selector&quot;
    app:layout_constraintStart_toStartOf=&quot;parent&quot;
    app:layout_constraintEnd_toEndOf=&quot;parent&quot;
    app:layout_constraintBottom_toBottomOf=&quot;parent&quot;
    app:layout_constraintTop_toBottomOf=&quot;@id/nav_host&quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Android</category>
      <author>MK_____</author>
      <guid isPermaLink="true">https://coding-mia.tistory.com/191</guid>
      <comments>https://coding-mia.tistory.com/191#entry191comment</comments>
      <pubDate>Tue, 11 Jul 2023 10:00:22 +0900</pubDate>
    </item>
    <item>
      <title>[Android] Coroutine 코루틴 예제2 - 레트로핏 수행, async 사용</title>
      <link>https://coding-mia.tistory.com/190</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;suspend 함수 순차적 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SecondFragment.kt&lt;/p&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;binding.checkBtn.setOnClickListener {
    secondViewModel.exampleSuspend()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SecondViewModel.kt&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;fun exampleSuspend() {
    viewModelScope.launch(Dispatchers.IO) {
        val time = measureTimeMillis { // 소요시간 // 비동기 실행과 콜백을 순차적으로 만들어 준다!
            val one = doSomethingUsefulOne()
            val two = doSomethingUsefulTwo()
            println(&quot;The answer is ${one + two}&quot;)
        }
        println(&quot;Completed in $time ms&quot;)
    }
}

suspend fun doSomethingUsefulOne(): Int {
    println(&quot;doSomethingUsefulOne-()&quot;)
    val product1 = repository.getOneProduct(&quot;1&quot;)
    return product1?.id ?: -1
}

suspend fun doSomethingUsefulTwo(): Int {
    println(&quot;doSomethingUsefulTwo-()&quot;)
    val product2 = repository.getOneProduct(&quot;2&quot;)
    return product2?.id ?: -1
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;doSomethingUsefulOne-()&lt;br /&gt;doSomethingUsefulTwo-()&lt;br /&gt;The&amp;nbsp;answer&amp;nbsp;is&amp;nbsp;3&lt;br /&gt;Completed&amp;nbsp;in&amp;nbsp;1651&amp;nbsp;ms&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리 연결해놓은 레트로핏으로 Api 호출하여 순차적으로 찍힌 로그를 확인해보자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-07 오후 2.45.54.png&quot; data-origin-width=&quot;1492&quot; data-origin-height=&quot;1768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfdIAd/btsmNOcLDOx/T0ECeFQtEHe1HPZkiI6AE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfdIAd/btsmNOcLDOx/T0ECeFQtEHe1HPZkiI6AE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfdIAd/btsmNOcLDOx/T0ECeFQtEHe1HPZkiI6AE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfdIAd%2FbtsmNOcLDOx%2FT0ECeFQtEHe1HPZkiI6AE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1492&quot; height=&quot;1768&quot; data-filename=&quot;스크린샷 2023-07-07 오후 2.45.54.png&quot; data-origin-width=&quot;1492&quot; data-origin-height=&quot;1768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-07 오후 2.46.42.png&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;1888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vh6rS/btsmJQvOUzd/LhXEF99TPb44ZfOaolkKy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vh6rS/btsmJQvOUzd/LhXEF99TPb44ZfOaolkKy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vh6rS/btsmJQvOUzd/LhXEF99TPb44ZfOaolkKy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVh6rS%2FbtsmJQvOUzd%2FLhXEF99TPb44ZfOaolkKy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1442&quot; height=&quot;1888&quot; data-filename=&quot;스크린샷 2023-07-07 오후 2.46.42.png&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;1888&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 api를 호출하고 정상적으로 끝날때까지 기다렸다가 두번째 api를 호출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.44em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;Suspend 함수 비동기적으로 실행&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;async 사용&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;fun exampleSuspend() {
    viewModelScope.launch(Dispatchers.IO) {
        val time = measureTimeMillis { // 서로 dependency 가 없는 함수라면, 비동기적으로 실행하여 시간을 줄일 수 있다
            val one = async { doSomethingUsefulOne() }
            val two = async { doSomethingUsefulTwo() }
            println(&quot;The answer is ${one.await() + two.await()}&quot;)
        }
        println(&quot;Completed in $time ms&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;The&amp;nbsp;answer&amp;nbsp;is&amp;nbsp;3&lt;br /&gt;Completed in 1329 ms // 시간소요 단축&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그를 확인해보면 api 호출하자마자 그 다음 api 를 호출한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-07 오후 2.41.01.png&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;1116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVYs6K/btsmIghhnCu/ocOA5xkSkSyvF9V3rv8Au1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVYs6K/btsmIghhnCu/ocOA5xkSkSyvF9V3rv8Au1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVYs6K/btsmIghhnCu/ocOA5xkSkSyvF9V3rv8Au1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVYs6K%2FbtsmIghhnCu%2FocOA5xkSkSyvF9V3rv8Au1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1472&quot; height=&quot;1116&quot; data-filename=&quot;스크린샷 2023-07-07 오후 2.41.01.png&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;1116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Android</category>
      <author>MK_____</author>
      <guid isPermaLink="true">https://coding-mia.tistory.com/190</guid>
      <comments>https://coding-mia.tistory.com/190#entry190comment</comments>
      <pubDate>Fri, 7 Jul 2023 15:33:11 +0900</pubDate>
    </item>
    <item>
      <title>[Android] Coroutine 코루틴 예제1</title>
      <link>https://coding-mia.tistory.com/189</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Basic&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SecondFragment.kt&lt;/p&gt;
&lt;pre class=&quot;stylus&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;binding.checkBtn.setOnClickListener {
    secondViewModel.exampleSuspend()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SecondViewModel.kt&lt;/p&gt;
&lt;pre class=&quot;isbl&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;fun exampleSuspend() = runBlocking {
    
    launch {
        repeat(5) { i -&amp;gt;
            println(&quot;Coroutine A, $i&quot;)
        }
    }
    
    launch {
        repeat(5) { i -&amp;gt;
            println(&quot;Coroutine B, $i&quot;)
        }
    }

    println(&quot;Coroutine Outer&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;I: Coroutine Outer &lt;br /&gt;I: Coroutine A, 0 &lt;br /&gt;I: Coroutine A, 1 &lt;br /&gt;I: Coroutine A, 2 &lt;br /&gt;I: Coroutine A, 3 &lt;br /&gt;I: Coroutine A, 4 &lt;br /&gt;I: Coroutine B, 0 &lt;br /&gt;I: Coroutine B, 1 &lt;br /&gt;I: Coroutine B, 2 &lt;br /&gt;I: Coroutine B, 3 &lt;br /&gt;I: Coroutine B, 4&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;launch 가 먼저 실행되서 Coroutine A 가 가장 먼저 찍힐 것 같았지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;&lt;b&gt;launch는 코루틴이 실행되기 위해 스케쥴링&lt;/b&gt;이 된다는 것을 예상할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;&amp;rarr; Coroutine Outer 먼저 찍히고 launch 로 생성된 코루틴이 순서대로 실행된다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;Cancellation and Timeouts&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 코루틴을 취소 되기 위해서는, 코루틴이 협조적이어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법 1. suspend 함수를 수행하는 job.cancleAndJoin()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법 2. 일반 함수 일때는 중단이 안됨 &amp;rarr; isActive 상태 체크하여 코루틴 취소하기&lt;/p&gt;
&lt;pre class=&quot;isbl&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;fun exampleSuspend() = runBlocking {

        val job = launch {
            repeat(10) { i -&amp;gt;
                println(&quot;job: I'm sleeping $i...&quot;)
                delay(1000L)
            }
        }

        delay (1500L)
        println(&quot;main: I'm tired of waiting!&quot;)
//        job.cancel() // 코루틴 종료
//        job.join() // job 수행이 끝나기를 기다린다
        job.cancelAndJoin()
        println(&quot;main: Now I can quit&quot;)
    }&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;I: job: I'm sleeping 0... &lt;br /&gt;I: job: I'm sleeping 1... &lt;br /&gt;I: main: I'm tired of waiting! &lt;br /&gt;I: main: Now I can quit&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리소스 해제 위치&lt;/h4&gt;
&lt;pre class=&quot;kotlin&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;fun exampleSuspend() = runBlocking {

        val job = launch {
            try {
                repeat(100) { i -&amp;gt;
                    println(&quot;job: I'm sleeping $i...&quot;)
                    delay(1000L) // suspend 함수이기 때문에, 이 코루틴은 취소하기에 협조적인 형태
                }
            } finally {
                // 코루틴을 취소하면, suspend 함수가 재개되면서 exception 을 던짐
                // 이곳에서 리소스 해제
                println(&quot;job: I'm running finally&quot;)
            }
        }

        delay (1500L)
        println(&quot;main: I'm tired of waiting!&quot;)
//        job.cancel() // 코루틴 종료
//        job.join() // job 수행이 끝나기를 기다린다
        job.cancelAndJoin()
    }&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;I:&amp;nbsp;job:&amp;nbsp;I'm&amp;nbsp;sleeping&amp;nbsp;0...&lt;br /&gt;I:&amp;nbsp;job:&amp;nbsp;I'm&amp;nbsp;sleeping&amp;nbsp;1...&lt;br /&gt;I:&amp;nbsp;main:&amp;nbsp;I'm&amp;nbsp;tired&amp;nbsp;of&amp;nbsp;waiting!&lt;br /&gt;I:&amp;nbsp;job:&amp;nbsp;I'm&amp;nbsp;running&amp;nbsp;finally&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Timeouts&lt;/p&gt;
&lt;pre class=&quot;isbl&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;fun exampleSuspend() = runBlocking {
    val result = withTimeoutOrNull(1300L) {
        repeat(10) { i -&amp;gt;
            println(&quot;I'm sleeping $i ...&quot;)
            delay(500L)
        }
        &quot;Done&quot;
    }
    println(&quot;Result is $result&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;I:&amp;nbsp;I'm&amp;nbsp;sleeping&amp;nbsp;0&amp;nbsp;...&lt;br /&gt;I:&amp;nbsp;I'm&amp;nbsp;sleeping&amp;nbsp;1&amp;nbsp;...&lt;br /&gt;I:&amp;nbsp;I'm&amp;nbsp;sleeping&amp;nbsp;2&amp;nbsp;...&lt;br /&gt;I:&amp;nbsp;Result&amp;nbsp;is&amp;nbsp;null&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android</category>
      <author>MK_____</author>
      <guid isPermaLink="true">https://coding-mia.tistory.com/189</guid>
      <comments>https://coding-mia.tistory.com/189#entry189comment</comments>
      <pubDate>Fri, 7 Jul 2023 14:01:50 +0900</pubDate>
    </item>
  </channel>
</rss>