<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발 노트</title>
    <link>https://nomg92.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 16:46:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>노명규</managingEditor>
    <item>
      <title>함수를 호출한 부모 함수명 가져오기</title>
      <link>https://nomg92.tistory.com/85</link>
      <description>&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;Thread.currentThread().getStackTrace()[3].getMethodName()&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~4가 될수도 있을 것 같다,&amp;nbsp;&lt;/p&gt;</description>
      <author>노명규</author>
      <guid isPermaLink="true">https://nomg92.tistory.com/85</guid>
      <comments>https://nomg92.tistory.com/85#entry85comment</comments>
      <pubDate>Mon, 11 Sep 2023 10:48:50 +0900</pubDate>
    </item>
    <item>
      <title>앱에서 사용중인 퍼미션 가져오기</title>
      <link>https://nomg92.tistory.com/84</link>
      <description>&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;String packageName = getPackageName();

try {
    // 패키지 정보 가져오기
    PackageManager packageManager = getPackageManager();
    // 패키지의 사용 퍼미션 목록 가져오기
    String[] permissions = packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS).requestedPermissions;

    if (permissions != null) {
        // 사용 중인 퍼미션 목록 출력 또는 다루기
        for (String permission : permissions) {
            System.out.println(&quot;사용 중인 퍼미션: &quot; + permission);
        }
    }
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}&lt;/code&gt;&lt;/pre&gt;</description>
      <author>노명규</author>
      <guid isPermaLink="true">https://nomg92.tistory.com/84</guid>
      <comments>https://nomg92.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 6 Sep 2023 10:17:25 +0900</pubDate>
    </item>
    <item>
      <title>di 패턴, dagger, hilt</title>
      <link>https://nomg92.tistory.com/78</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Dependency injection이란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정의 : 의존성 주입의 줄임말&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약 : &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;필요로 하는 의존성을 외부(생성자, 파라미터 등)에서 전달받는것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안하면 안좋은 점 : 코드의 유연성과 확장성이 떨어짐 또한 기능 및 코드 변경 할 때 많은 코드를 수정해야 함&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dagger 예제&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. @Component interface정의&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.22.09.png&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct2oLD/btr753gES3z/mlLaC857xTj2aSLEryn4q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct2oLD/btr753gES3z/mlLaC857xTj2aSLEryn4q0/img.png&quot; data-alt=&quot;@Component&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct2oLD/btr753gES3z/mlLaC857xTj2aSLEryn4q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct2oLD%2Fbtr753gES3z%2FmlLaC857xTj2aSLEryn4q0%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;339&quot; height=&quot;131&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.22.09.png&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;@Component&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. 의존성 주입할 module 정의&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.23.46.png&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EBm99/btr75tGy1Sh/4KZOYuB8n88wvHEqs0tm3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EBm99/btr75tGy1Sh/4KZOYuB8n88wvHEqs0tm3k/img.png&quot; data-alt=&quot;@module&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EBm99/btr75tGy1Sh/4KZOYuB8n88wvHEqs0tm3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEBm99%2Fbtr75tGy1Sh%2F4KZOYuB8n88wvHEqs0tm3k%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;468&quot; height=&quot;197&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.23.46.png&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;@module&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. 데이터 가져올 ApiService 정의&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.24.16.png&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQjYu4/btr74uTesYo/Cx9jQPE4NB3UgH0Zma5jd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQjYu4/btr74uTesYo/Cx9jQPE4NB3UgH0Zma5jd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQjYu4/btr74uTesYo/Cx9jQPE4NB3UgH0Zma5jd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQjYu4%2Fbtr74uTesYo%2FCx9jQPE4NB3UgH0Zma5jd1%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;318&quot; height=&quot;147&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.24.16.png&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;4. 의존성 주입&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-04-04 오후 5.25.15.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqrL8W/btr74fIF5TU/kvIMf7x00hLxyk1r1CUR9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqrL8W/btr74fIF5TU/kvIMf7x00hLxyk1r1CUR9K/img.png&quot; data-alt=&quot;@Inject&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqrL8W/btr74fIF5TU/kvIMf7x00hLxyk1r1CUR9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqrL8W%2Fbtr74fIF5TU%2FkvIMf7x00hLxyk1r1CUR9K%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;484&quot; height=&quot;413&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.25.15.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;@Inject&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;* DaggerAppComponent는 Dagger lib에서 자동으로 생성되며, 이름 규칙은 &quot;{Dagger$@ComponentInterfaceName}&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;------------------------------------------------------------------------------------------------------&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt; &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;hilt 예제&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1. @Component + @Singleton Interface 정의,&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-04-04 오후 5.59.10.png&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q2VLd/btr72ZmtFeO/qmHsFHzMkQlzpUkkLSn8pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q2VLd/btr72ZmtFeO/qmHsFHzMkQlzpUkkLSn8pK/img.png&quot; data-alt=&quot;@Component, @Singleton&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q2VLd/btr72ZmtFeO/qmHsFHzMkQlzpUkkLSn8pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq2VLd%2Fbtr72ZmtFeO%2FqmHsFHzMkQlzpUkkLSn8pK%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;353&quot; height=&quot;151&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.59.10.png&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;@Component, @Singleton&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2. 데이터 가져올 ApiService 정의&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.46.21.png&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tvQf6/btr72aIwho8/xc9a5HaOnnRQfepDnnUjsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tvQf6/btr72aIwho8/xc9a5HaOnnRQfepDnnUjsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tvQf6/btr72aIwho8/xc9a5HaOnnRQfepDnnUjsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtvQf6%2Fbtr72aIwho8%2Fxc9a5HaOnnRQfepDnnUjsK%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;326&quot; height=&quot;148&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.46.21.png&quot; data-origin-width=&quot;326&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. 모듈 정의&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.59.39.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m4iMN/btr73x392K7/KMUK78W7ijkO32SfvYatzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m4iMN/btr73x392K7/KMUK78W7ijkO32SfvYatzk/img.png&quot; data-alt=&quot;@module, @installIn, @Provides, @Singleton&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m4iMN/btr73x392K7/KMUK78W7ijkO32SfvYatzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm4iMN%2Fbtr73x392K7%2FKMUK78W7ijkO32SfvYatzk%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;362&quot; height=&quot;244&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.59.39.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;244&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;@module, @installIn, @Provides, @Singleton&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3. 의존성 주입&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.46.36.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r7Mdy/btr76y8KWJe/qrKSFhtT7mpADhl3K65OK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r7Mdy/btr76y8KWJe/qrKSFhtT7mpADhl3K65OK0/img.png&quot; data-alt=&quot;@AndroidEntryPoint, @Inject&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r7Mdy/btr76y8KWJe/qrKSFhtT7mpADhl3K65OK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr7Mdy%2Fbtr76y8KWJe%2FqrKSFhtT7mpADhl3K65OK0%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;484&quot; height=&quot;364&quot; data-filename=&quot;스크린샷 2023-04-04 오후 5.46.36.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;@AndroidEntryPoint, @Inject&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힐트는 대거를 좀 더 편하게 사용하고자 탄생한 lib,&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주입부분에 Dagger-.inject(this) 코드만 @AndroidEntryPoint 으로 바뀐 느낌?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;di_1.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s8lIl/btr75tT7OkL/JtRDZG0l2Mu2sTqbUY0Va1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s8lIl/btr75tT7OkL/JtRDZG0l2Mu2sTqbUY0Va1/img.png&quot; data-alt=&quot;대거와 힐트의 요약&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s8lIl/btr75tT7OkL/JtRDZG0l2Mu2sTqbUY0Va1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs8lIl%2Fbtr75tT7OkL%2FJtRDZG0l2Mu2sTqbUY0Va1%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;678&quot; height=&quot;187&quot; data-filename=&quot;di_1.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대거와 힐트의 요약&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>android</category>
      <author>노명규</author>
      <guid isPermaLink="true">https://nomg92.tistory.com/78</guid>
      <comments>https://nomg92.tistory.com/78#entry78comment</comments>
      <pubDate>Tue, 4 Apr 2023 18:06:22 +0900</pubDate>
    </item>
    <item>
      <title>system screen rotate click listener</title>
      <link>https://nomg92.tistory.com/77</link>
      <description>&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;private val autoRotateObserver = AutoRotateObserver(this, listener)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;contentResolver.registerContentObserver(
    Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION),
    true, autoRotateObserver
)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;override fun onDestroy() {
    super.onDestroy()
    contentResolver.unregisterContentObserver(autoRotateObserver)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;class AutoRotateObserver(context: Context, listener: RotateConfigEventListener) : ContentObserver(null) {

    private val mContext: Context = context
    private val listener = listener

    override fun onChange(selfChange: Boolean) {
        super.onChange(selfChange)
        // 설정값이 변경되면 호출됨
        val autoRotateEnabled = Settings.System.getInt( mContext.contentResolver, Settings.System.ACCELEROMETER_ROTATION, 0) == 1

//        Log.d(LOGTAG,&quot;AutoRotateObserver onChange selfChange : ${selfChange} / ${autoRotateEnabled}&quot;)
        listener.onChangeRotate(autoRotateEnabled)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autoRoateEnabled이 true면 회전 on, false면 off&lt;/p&gt;</description>
      <category>android</category>
      <author>노명규</author>
      <guid isPermaLink="true">https://nomg92.tistory.com/77</guid>
      <comments>https://nomg92.tistory.com/77#entry77comment</comments>
      <pubDate>Tue, 7 Mar 2023 18:09:27 +0900</pubDate>
    </item>
    <item>
      <title>retrofit으로, rx and coroutine</title>
      <link>https://nomg92.tistory.com/74</link>
      <description>&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;class MainViewModel(val app: Application) : AndroidViewModel(app) {
    val tagtag = &quot;tag@&quot;

    val retrofit: RetrofitApi = RetrofitBuilder.getApiService(&quot;https://api.bithumb.com/&quot;)

    init {
        initCoinRx()
        initCoinCoroutine()
    }

    @SuppressLint(&quot;CheckResult&quot;)
    fun initCoinRx() {
        retrofit.getCoinInfoRx(&quot;BTC&quot;)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe { coin -&amp;gt;
                Log.d(tagtag, &quot;coin rx : ${coin.data.openingPrice}&quot;)
            }
    }

    var job: Job? = null

    @SuppressLint(&quot;CheckResult&quot;)
    fun initCoinCoroutine() {
        job = CoroutineScope(Dispatchers.IO).launch {
            val response = retrofit.getCoinInfoCoroutine(&quot;BTC&quot;)
            withContext(Dispatchers.Main) {
                if (response.isSuccessful) {
                    Log.d(tagtag, &quot;coin coroutine : &quot; + response.body()?.data?.openingPrice)
                    job?.cancel()
                }
            }
        }
    }
}&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;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;import io.reactivex.Single
import retrofit2.Response
import retrofit2.http.*

interface RetrofitApi {

    @GET(&quot;public/ticker/{path}&quot;)
    fun getCoinInfoRx(
        @Path(&quot;path&quot;) path:String?
    ):Single&amp;lt;CoinModel&amp;gt;

    @GET(&quot;public/ticker/{path}&quot;)
    suspend fun getCoinInfoCoroutine(
        @Path(&quot;path&quot;) path:String?
    ): Response&amp;lt;CoinModel&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory

object RetrofitBuilder {
    private fun getRetrofit(url: String?):Retrofit {
        val httpLoggingInterceptor = HttpLoggingInterceptor()
        httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY

        val client = OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).build()

        val retrofit = Retrofit.Builder().
                        baseUrl(url).
                        addConverterFactory(GsonConverterFactory.create()).
                        addCallAdapterFactory(RxJava2CallAdapterFactory.create()).
                        client(client).build()

        return retrofit;
    }
    
    fun getApiService(url:String?) : RetrofitApi {
        return getRetrofit(url).create(RetrofitApi::class.java)
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>android</category>
      <author>노명규</author>
      <guid isPermaLink="true">https://nomg92.tistory.com/74</guid>
      <comments>https://nomg92.tistory.com/74#entry74comment</comments>
      <pubDate>Fri, 3 Feb 2023 15:23:12 +0900</pubDate>
    </item>
    <item>
      <title>android mvvm 예제</title>
      <link>https://nomg92.tistory.com/73</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;본 예제에 model 부분은 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data 관련 핸들링은 모두 model에서 해야하고, viewmodel에선 view에 로직만 담당합니다.&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;databinding, kotlin을 사용합니다.&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;* AActivity.kt&lt;br /&gt;* A1Viewmodel.kt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* A2Viewmodel.kt&lt;br /&gt;* a_activity.xml&lt;br /&gt;* a1_viewmodel.xml&lt;br /&gt;* a2_viewmodel.xml&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;1. AActivity.kt&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;class AActivity :AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        DataBindingUtil.setContentView&amp;lt;AActivityBinding&amp;gt;(this, R.layout.a_activity).apply {
            lifecycleOwner = this@AActivity
            a1ViewModel = ViewModelProvider(this@AActivity).get(A1ViewModel::class.java);
            a2ViewModel = ViewModelProvider(this@AActivity).get(A2ViewModel::class.java);
        }
    }
}&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. A1ViewModel.kt&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;class A1ViewModel(val app: Application) : AndroidViewModel(app) {
    init {
        Toast.makeText(app,&quot;A1ViewModel &quot;, Toast.LENGTH_LONG).show()
    }
}&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;3. A2ViewModel.kt&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;class A2ViewModel(val app: Application) : AndroidViewModel(app) {
    init {
        Toast.makeText(app,&quot;A2ViewModel&quot;, Toast.LENGTH_LONG).show()
    }
}&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;4. a_activity.xml&lt;/p&gt;
&lt;pre class=&quot;dust&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;layout xmlns:tools=&quot;http://schemas.android.com/tools&quot;&amp;gt;

    &amp;lt;data&amp;gt;
        &amp;lt;variable
            name=&quot;a1ViewModel&quot;
            type=&quot;com.example.A1ViewModel&quot; /&amp;gt;
        &amp;lt;variable
            name=&quot;a2ViewModel&quot;
            type=&quot;com.example.A2ViewModel&quot; /&amp;gt;
    &amp;lt;/data&amp;gt;

    &amp;lt;LinearLayout
        xmlns:bind=&quot;http://schemas.android.com/apk/res-auto&quot;
        xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;match_parent&quot;
        android:orientation=&quot;vertical&quot;&amp;gt;

        &amp;lt;include
            android:id=&quot;@+id/a1&quot;
            layout=&quot;@layout/a1_viewmodel&quot;
            bind:a1vm=&quot;@{a1ViewModel}&quot; /&amp;gt;

        &amp;lt;include
            android:id=&quot;@+id/a2&quot;
            layout=&quot;@layout/a2_viewmodel&quot;
            bind:a2vm=&quot;@{a2ViewModel}&quot; /&amp;gt;

    &amp;lt;/LinearLayout&amp;gt;

&amp;lt;/layout&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;5. a1_viewmodel.xml&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;

&amp;lt;layout&amp;gt;
    &amp;lt;data&amp;gt;
        &amp;lt;variable
            name=&quot;a1vm&quot;
            type=&quot;com.example.A1ViewModel&quot; /&amp;gt;
    &amp;lt;/data&amp;gt;

    &amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
        xmlns:tools=&quot;http://schemas.android.com/tools&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;&amp;gt;

        &amp;lt;TextView
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:text=&quot;a1_vm&quot;
            tools:ignore=&quot;MissingConstraints&quot; /&amp;gt;

    &amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;

&amp;lt;/layout&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. a2_viewmodel.xml&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;

&amp;lt;layout&amp;gt;
    &amp;lt;data&amp;gt;
        &amp;lt;variable
            name=&quot;a2vm&quot;
            type=&quot;com.example.A2ViewModel&quot; /&amp;gt;
    &amp;lt;/data&amp;gt;

    &amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
        xmlns:tools=&quot;http://schemas.android.com/tools&quot;
        android:layout_width=&quot;wrap_content&quot;
        android:layout_height=&quot;wrap_content&quot;&amp;gt;

        &amp;lt;TextView
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:text=&quot;a2_vm&quot;
            tools:ignore=&quot;MissingConstraints&quot; /&amp;gt;

    &amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;

&amp;lt;/layout&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;&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;// onCreate에서 항상 vm을 초기화해버리면, ui에 state가 바뀌면 vm의 데이터가 날라가지 않을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴 경우에&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;class AActivity :AppCompatActivity() {
    private lateinit var binding: AActivityBinding

    private val a1ViewModel: A1ViewModel by viewModels()
    private val a2ViewModel: A2ViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.setContentView&amp;lt;AActivityBinding&amp;gt;(this, R.layout.a_activity).apply {
            lifecycleOwner = this@AActivity
            aViewModel = ViewModelProvider(this@AActivity).get(AViewModel::class.java);
            a1ViewModel = this@AActivity.a1ViewModel
            a2ViewModel = this@AActivity.a2ViewModel
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 사용하면 될 것 같음,&amp;nbsp;&lt;/p&gt;</description>
      <category>android</category>
      <author>노명규</author>
      <guid isPermaLink="true">https://nomg92.tistory.com/73</guid>
      <comments>https://nomg92.tistory.com/73#entry73comment</comments>
      <pubDate>Mon, 30 Jan 2023 10:17:45 +0900</pubDate>
    </item>
    <item>
      <title>groupBy, Pair, collection.sort, reduce, fold</title>
      <link>https://nomg92.tistory.com/70</link>
      <description>&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;val group = intArrayOf(1,1,1,2,2,3).groupBy { it }
group.apply {
    println(&quot;this : $this&quot;) // {1=[1, 1, 1], 2=[2, 2], 3=[3]}
    println(&quot;group.keys : $keys&quot;) // [1, 2, 3]
    println(&quot;group.values : $values&quot;) // [[1, 1, 1], [2, 2], [3]]
    println(&quot;group.values.sort 1 : ${values.sortedByDescending { it.size }}&quot;) // [[1, 1, 1], [2, 2], [3]]
    println(&quot;group.values.sort 2 : ${values.sortedBy { it.size }}&quot;) // [[3], [2, 2], [1, 1, 1]]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;groupBy를 이용한 이것저것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;val pair = arrayOf(&quot;a&quot;,&quot;b&quot;,&quot;c&quot;).mapIndexed { i, d -&amp;gt; Pair(i,d) }
println(&quot;Pair : ${pair}&quot;) // [(0, a), (1, b), (2, c)]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key value를 만들때 Pair활용,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;val numbers = listOf(10000, 1000, 100)
val sum = numbers.reduce { total, num -&amp;gt; total + num }
println(&quot;reduced: $sum&quot;) // reduced: 11100
val sum2 = numbers.fold(10) { total, num -&amp;gt; total + num }
println(&quot;folded: $sum2&quot;) // folded: 11110

val strings = listOf(&quot;a&quot;,&quot;b&quot;,&quot;c&quot;)
val string = strings.reduce { total, peace -&amp;gt; total + peace }
println(&quot;string reduced: $string&quot;) // reduced: abc
val string2 = strings.fold(&quot;d&quot;) { total, peace -&amp;gt; total + peace}
println(&quot;string fold: $string2&quot;) // reduced: dabc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reduce는 배열의 첫번째 값이 최초 첫번째 파라미터로 전달,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fold는 첫번째 파라미터에 값 지정 가능,&amp;nbsp;&lt;/p&gt;</description>
      <category>kotlin</category>
      <author>노명규</author>
      <guid isPermaLink="true">https://nomg92.tistory.com/70</guid>
      <comments>https://nomg92.tistory.com/70#entry70comment</comments>
      <pubDate>Tue, 29 Nov 2022 17:45:01 +0900</pubDate>
    </item>
    <item>
      <title>Codility MissingInteger</title>
      <link>https://nomg92.tistory.com/69</link>
      <description>&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;fun MissingInteger(A: IntArray):Int {
    val set = HashSet&amp;lt;Int&amp;gt;()
    set.addAll(A.toList())

    var value = 1

    for (i in 1 .. 1000000) {
        if (!set.contains(i)) {
            value = i
            break;
        }
    }
    return value
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;100%성공함ㅋㅋㅋㅋㅋㅋ&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;이게왜성공..PNG&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;1246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dckZnz/btrQasL3Cn9/uTqJX1JCeWSp8aVANDqr31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dckZnz/btrQasL3Cn9/uTqJX1JCeWSp8aVANDqr31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dckZnz/btrQasL3Cn9/uTqJX1JCeWSp8aVANDqr31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdckZnz%2FbtrQasL3Cn9%2FuTqJX1JCeWSp8aVANDqr31%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;1246&quot; data-filename=&quot;이게왜성공..PNG&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;1246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>kotlin</category>
      <author>노명규</author>
      <guid isPermaLink="true">https://nomg92.tistory.com/69</guid>
      <comments>https://nomg92.tistory.com/69#entry69comment</comments>
      <pubDate>Tue, 1 Nov 2022 20:56:14 +0900</pubDate>
    </item>
    <item>
      <title>kotlin with, also, apply, let, run</title>
      <link>https://nomg92.tistory.com/67</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;with &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;규칙&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Non-nullable (Null &lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;될수&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;없는&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;수신&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;객체&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;이고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;결과가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;필요하지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;않은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경우에만&lt;/span&gt;&lt;span&gt; with &lt;/span&gt;&lt;span&gt;를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용합니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;gt; &lt;/span&gt;&lt;span&gt;리턴이 없을때 사용&lt;/span&gt;&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&gt;&lt;b&gt;also &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;규칙&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;수신&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;객체&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;람다가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;전달된&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수신&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;객체를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;전혀&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;않거나&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수신&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;객체의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;속성을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;변경하지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;않고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경우&lt;/span&gt;&lt;span&gt; also &lt;/span&gt;&lt;span&gt;를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용합니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;gt; &lt;/span&gt;&lt;span&gt;객체&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;내부&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;값을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;바꾸기&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;싫을 때&lt;/span&gt;&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&gt;&lt;b&gt;apply &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;규칙&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;수신&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;객체&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;람다&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;내부에서&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수신&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;객체의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;함수를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용하지&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;않고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;수신&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;객체&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;자신을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;다시&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;반환&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하려는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경우에&lt;/span&gt;&lt;span&gt; apply &lt;/span&gt;&lt;span&gt;를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용합니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;gt; 객체의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;내부&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;값을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;바꾸고&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;싶을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;때&lt;/span&gt;&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&gt;&lt;b&gt;let &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;규칙&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다음과&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;같은&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경우에&lt;/span&gt;&lt;span&gt; let &lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용합니다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;지정된&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;값이&lt;/span&gt;&lt;span&gt; null &lt;/span&gt;&lt;span&gt;이&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;아닌&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경우에&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;코드를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실행해야&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경우&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Nullable &lt;/span&gt;&lt;span&gt;객체를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;다른&lt;/span&gt;&lt;span&gt; Nullable &lt;/span&gt;&lt;span&gt;객체로&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;변환하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경우&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;단일&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;지역&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;변수의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;범위를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;제한&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;하는&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;경우&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;gt; 널체크&lt;/span&gt;&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&gt;&lt;b&gt;run &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;규칙&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;어떤&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;값을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;계산할&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;필요가&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;있거나&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;여러개의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;지역&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;변수의&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;범위를&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;제한하려면&lt;/span&gt;&lt;span&gt; run &lt;/span&gt;&lt;span&gt;을&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용합니다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&amp;gt; 함수처럼&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;쓴다&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&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;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>kotlin</category>
      <category>https://medium.com/@limgyumin/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%9D%98-apply-with-let-also-run-%EC%9D%80-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80-4a517292df29</category>
      <author>노명규</author>
      <guid isPermaLink="true">https://nomg92.tistory.com/67</guid>
      <comments>https://nomg92.tistory.com/67#entry67comment</comments>
      <pubDate>Thu, 29 Sep 2022 10:30:47 +0900</pubDate>
    </item>
    <item>
      <title>kotlin 배열 선언 및 반복문 문법</title>
      <link>https://nomg92.tistory.com/66</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;배열 선언 하는 법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;var intArr:Array&amp;lt;Int&amp;gt; = arrayOf(1, 2, 3, 4)
var intArr2 = arrayOfNulls&amp;lt;Int&amp;gt;(5)
var anyArr : Array&amp;lt;Any&amp;gt; = arrayOf(1, &quot;awd&quot;, 3.2, 4)&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;for(i: Int in 1..10)
    print(&quot;$i &quot;)    //output : 1, 2, 3, 4, 5 ... 10

val len: Int = 5
for(i in 1..len)
    print(&quot;$i &quot;)    //output : 1, 2, 3, 4, 5

for(i in 1 until len)
    print(&quot;$i &quot;)    //output : 1, 2, 3, 4

for(i: Int in 1..10 step(2))
    print(&quot;$i &quot;)    //output : 1, 3, 5, 7, 9

for(i in 10 downTo 1)    //output : 10, 9, 8, 7 ... 1
    print(&quot;$i &quot;)

for(i in 10 downTo 1 step(2))    //output : 10, 8, 6, 4, 2
    print(&quot;$i &quot;)

val arr: IntArray = intArrayOf(10, 20, 30, 40, 50)

for(i in arr)
    print(&quot;$i &quot;)    //output : 10, 20, 30, 40, 50

for(i in arr.reversed())
    print(&quot;$i &quot;)    //output : 50, 40, 30, 20, 10

val list = listOf&amp;lt;String&amp;gt;(&quot;korea&quot;, &quot;salmon&quot;, &quot;T_T&quot;)
for(i in list)
    print(&quot;$i &quot;)    //output : korea, salmon, T_T

for(i in 0 until list.count())
    print(&quot;${list[i]} &quot;)    //output : korea, salmon, T_T
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;for (i in tl2.indices) {
    // i는 0이고, size는 보통 1부터 시작하니 항상 끝에가 1개가 많은 이슈를 알아서 해결해줌,
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>kotlin</category>
      <category>https://hwan-shell.tistory.com/244</category>
      <author>노명규</author>
      <guid isPermaLink="true">https://nomg92.tistory.com/66</guid>
      <comments>https://nomg92.tistory.com/66#entry66comment</comments>
      <pubDate>Thu, 29 Sep 2022 10:25:55 +0900</pubDate>
    </item>
  </channel>
</rss>