<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>&amp;amp;</title>
    <link>https://srandroid.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 8 May 2026 17:55:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>sryang</managingEditor>
    <item>
      <title>[독서] 팡세</title>
      <link>https://srandroid.tistory.com/829</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;수학자 파스칼이 자신의 생각을 적어 놓은 짧은 글들의 모음이다.&lt;/p&gt;
&lt;p data-end=&quot;80&quot; data-start=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;읽었던 책 중에 이해하기 어려운 책이었다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(30페이지도 못 읽은 것 같다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;102&quot; data-start=&quot;82&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;102&quot; data-start=&quot;82&quot; data-ke-size=&quot;size16&quot;&gt;두 가지 내용 정도가 기억에 남는다.&lt;/p&gt;
&lt;p data-end=&quot;239&quot; data-start=&quot;104&quot; data-ke-size=&quot;size16&quot;&gt;하나는 무엇인가를? 내 전문성을 증명하기 위해서는&lt;br /&gt;반복적으로 노력하여 몸으로 익혀야 한다는 것이었다.&lt;br /&gt;300년 전에도 자기 계발에 대한 조언은 지금과 다르지 않다.&lt;br /&gt;AI가 인간을 뛰어넘으려고 하는 미래에도 지금과 같을지 궁금해진다.&lt;/p&gt;
&lt;p data-end=&quot;385&quot; data-start=&quot;241&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;385&quot; data-start=&quot;241&quot; data-ke-size=&quot;size16&quot;&gt;두 번째는 종교와 사후에 대한 생각이다.&lt;br /&gt;처음에 종교에 대한 공박을 얘기하길래 종교를 믿지 않는다고 생각했다.&lt;br /&gt;그 정반대였다. 사후 영생에 대해 생각하지 않고 눈에 보이지 않는다는 등&lt;br /&gt;여러 단순한 논리로 종교에 대해 반박하는 사람들을 거침없이 까내린다.&lt;/p&gt;
&lt;p data-end=&quot;444&quot; data-start=&quot;387&quot; data-ke-size=&quot;size16&quot;&gt;내가 가져왔던 생각들을 나열하고 비판해 마치 내 얼굴에 대고 하는 얘기 같아&lt;br /&gt;기억에 남는 것 같다.&lt;/p&gt;
&lt;p data-end=&quot;444&quot; data-start=&quot;387&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;513&quot; data-start=&quot;446&quot; data-ke-size=&quot;size16&quot;&gt;난 내가 믿지 않을 뿐 종교에 대한 부정적인 생각은 없다. 지금도 믿지는 않지만&lt;br /&gt;약간의 변화가 생긴 것 같다.&lt;/p&gt;</description>
      <category>독서</category>
      <author>sryang</author>
      <guid isPermaLink="true">https://srandroid.tistory.com/829</guid>
      <comments>https://srandroid.tistory.com/829#entry829comment</comments>
      <pubDate>Sun, 11 Jan 2026 18:29:44 +0900</pubDate>
    </item>
    <item>
      <title>[영어] 현재 완료와 과거 시제 구분 Tip</title>
      <link>https://srandroid.tistory.com/828</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;p data-ke-size=&quot;size16&quot;&gt;동사를 &lt;b&gt;과거 상태&lt;/b&gt;와 &lt;b&gt;현재 상태를&lt;/b&gt; 둘로 나눠 생각해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(+ 과거상태는 둘다 동일하고 &lt;b&gt;현재 상태&lt;/b&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 style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;지금도 그러한가?&lt;/b&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;Q. 나는 키를 잃어버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I &lt;b&gt;lost&lt;/b&gt; key. vs I &lt;b&gt;have lost&lt;/b&gt; key.&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: #ee2323;&quot;&gt;&lt;b&gt;지금도&lt;/b&gt; 키를 잃어버린 상태이다.&lt;/span&gt;&amp;nbsp; &amp;nbsp;(과거 상태 = 현재 상태 : 현재완료)&amp;nbsp; -&amp;gt; I &lt;b&gt;have lost&lt;/b&gt; key.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 키를 잃어 버렸고, 지금은 찾았다. or 지금은 모른다. (과거 상태 &amp;ne; 현재 상태 : 과거)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; I &lt;b&gt;lost&lt;/b&gt; key.&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;Q. 내 차가 고장났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;My car &lt;b&gt;broken&lt;/b&gt;. vs My car &lt;b&gt;has broken&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내차는 고장났고, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;지금도&lt;/b&gt; 고장난 상태이다.&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(과거 상태 = 현재 상태 : 현재완료) -&amp;gt; My car &lt;b&gt;has broken&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내차는 고장났고, &lt;b&gt;지금도&lt;/b&gt; 고쳤다. or 지금은 모른다.&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(과거 상태&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;ne; 현재 상태 : 과거)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; My car &lt;b&gt;broken&lt;/b&gt;.&lt;/p&gt;</description>
      <category>영어</category>
      <author>sryang</author>
      <guid isPermaLink="true">https://srandroid.tistory.com/828</guid>
      <comments>https://srandroid.tistory.com/828#entry828comment</comments>
      <pubDate>Sat, 13 Dec 2025 09:24:44 +0900</pubDate>
    </item>
    <item>
      <title>[독서] 아메리칸</title>
      <link>https://srandroid.tistory.com/827</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1800년대 35살 나보다 젊은 미국인이 사업에 성공하여 유럽 여행을 하며 지내는 이야기.&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;대충 알아왔던 단어들도 문맥 안에서 어떤 의미로 사용되는지 이해가 잘 되지 않았다.&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;꾸준히 공부해야함을 느꼇다.&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;돈좀 있는 노인이라고 생각했는데 35세 젊은 미국인이 박물관에서 한가롭게 거닐며 복제 작가의 작품을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그들 생활비 6개월치에 만먹는 가격을 주고 구매한다.&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;군인으로 전역했다길래 아 옛날 참전 군인들은 일찍 전역해서 연금으로 먹고사나보다 했는데&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;/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;유럽의 귀족앞에서도 당당한 모습으로 그려지는데 '난 이런 미국 사람 이야.' 라고 직간접 적으로 서술하는 것 같아&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: #9d9d9d;&quot;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;당당함과 겸손함의 경계를 잘 지켜야 한다는 것을 배운 것 같다.&lt;/p&gt;</description>
      <category>독서</category>
      <author>sryang</author>
      <guid isPermaLink="true">https://srandroid.tistory.com/827</guid>
      <comments>https://srandroid.tistory.com/827#entry827comment</comments>
      <pubDate>Mon, 1 Dec 2025 13:05:49 +0900</pubDate>
    </item>
    <item>
      <title>The following classes could not be found: - androidx.compose.ui.tooling.preview.ComposeViewAdapter (Fix Build Path, Edit XML, Create Class)</title>
      <link>https://srandroid.tistory.com/826</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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #3b4045; text-align: left;&quot;&gt;The following classes could not be found: -&amp;nbsp;androidx.compose.ui.tooling.preview.ComposeViewAdapter (Fix Build Path, Edit XML, Create Class)&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 style=&quot;background-color: #ffffff; color: #3b4045; text-align: left;&quot;&gt;오류가 발생했다.&amp;nbsp;&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 style=&quot;background-color: #ffffff; color: #3b4045; text-align: left;&quot;&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 style=&quot;background-color: #ffffff; color: #3b4045; text-align: left;&quot;&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 style=&quot;background-color: #ffffff; color: #3b4045; text-align: left;&quot;&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 style=&quot;background-color: #ffffff; color: #3b4045; text-align: left;&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/68224361/jetpack-compose-cant-preview-after-updating-to-1-0-0-rc01&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://stackoverflow.com/questions/68224361/jetpack-compose-cant-preview-after-updating-to-1-0-0-rc01&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1758264677945&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Jetpack compose can't preview after updating to 1.0.0-rc01&quot; data-og-description=&quot;this happened to me only when I updated to 1.0.0-rc01. it says: The following classes could not be found: -&amp;nbsp;androidx.compose.ui.tooling.preview.ComposeViewAdapter (Fix Build Path, Edit XML, Create...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/68224361/jetpack-compose-cant-preview-after-updating-to-1-0-0-rc01&quot; data-og-url=&quot;https://stackoverflow.com/questions/68224361/jetpack-compose-cant-preview-after-updating-to-1-0-0-rc01&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uv6a3/hyZJmCaTzh/LgTNI31ckw33OqcQA5Buyk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/n4nJw/hyZI52gfBi/1OinDeRmUA8W4mJKG9aVd1/img.png?width=349&amp;amp;height=497&amp;amp;face=0_0_349_497&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/68224361/jetpack-compose-cant-preview-after-updating-to-1-0-0-rc01&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/68224361/jetpack-compose-cant-preview-after-updating-to-1-0-0-rc01&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uv6a3/hyZJmCaTzh/LgTNI31ckw33OqcQA5Buyk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/n4nJw/hyZI52gfBi/1OinDeRmUA8W4mJKG9aVd1/img.png?width=349&amp;amp;height=497&amp;amp;face=0_0_349_497');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Jetpack compose can't preview after updating to 1.0.0-rc01&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;this happened to me only when I updated to 1.0.0-rc01. it says: The following classes could not be found: -&amp;nbsp;androidx.compose.ui.tooling.preview.ComposeViewAdapter (Fix Build Path, Edit XML, Create...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;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;build variant를 release 모드로 바꿨는데&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;컴포즈 프리뷰는 develop 모드에서만 동작하는 것 같아 보인다.&lt;/p&gt;</description>
      <category>Android/오류</category>
      <author>sryang</author>
      <guid isPermaLink="true">https://srandroid.tistory.com/826</guid>
      <comments>https://srandroid.tistory.com/826#entry826comment</comments>
      <pubDate>Fri, 19 Sep 2025 15:53:06 +0900</pubDate>
    </item>
    <item>
      <title>[독서] 고도를 기다리며</title>
      <link>https://srandroid.tistory.com/825</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;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;아무 생각없이 처음 읽었을 때. 10살 정도의 두 소년이 대화하는 거라고 생각했다.&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;무슨일로 구두를 벗는데 온몸에 진이 빠지도록 고생을 하지? 심하게 다쳤나? 그렇다기엔 둘의 대화가 너무 가벼운데..&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;/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;좀 있다가 '포조'와 '럭키'가 등장하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포조가 둘의 나이를 물어보는데 60~70대는 되어 보인다고 한 것이다.&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;위의 이야기가 조금은 이해되기 시작했다.&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시간 전 정도?) 블라디미르 에스트라공 등장 간단한 대화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 포조(주인)와 럭키(노예) 등장 포조와 두 노인의 대화 및 포조가 럭키를 막 대함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 해가 질무렵 포조와 럭키 퇴장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 소년 등장 고도는 내일 온다고 알림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;가진게 하나 없어이 티격태격 하지만, 함께인 친구를 하나라도 두고 있어 외롭거나 불행해보이지 않는 노인들의 이야기였다.&lt;/p&gt;</description>
      <category>독서</category>
      <author>sryang</author>
      <guid isPermaLink="true">https://srandroid.tistory.com/825</guid>
      <comments>https://srandroid.tistory.com/825#entry825comment</comments>
      <pubDate>Tue, 2 Sep 2025 12:11:00 +0900</pubDate>
    </item>
    <item>
      <title>[Kotlin] lateinit</title>
      <link>https://srandroid.tistory.com/824</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;lateinit은 2가지 경우에 사용하고 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전역변수인데 nullable을 허용하면 null 처리를 해줘야 하는 불편함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- hilt를 통해 components(activiry, fragment..)에 주입이 필요할 경우.&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;lateinit 단어만 봐도 나중에 초기화 하겠다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(그러니 non-null로 선언하게 해줘. null 처리 하기 싫음.)&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;/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;b&gt;불편&lt;/b&gt;할 때가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;di&lt;/b&gt;나 &lt;b&gt;test&lt;/b&gt; 에서 &lt;b&gt;초기화&lt;/b&gt; 하는데 사용하기도 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1)&lt;b&gt;최상단&lt;/b&gt;(전역 변수), 2)&lt;b&gt;클래스 안&lt;/b&gt;, 3)&lt;b&gt;로컬 변수&lt;/b&gt;(private?) 로 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;isInitialized&lt;/b&gt;로 &lt;b&gt;초기화&lt;/b&gt; 되어있는지 &lt;b&gt;확인 가능&lt;/b&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kotlinlang.org/docs/properties.html#late-initialized-properties-and-variables&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://kotlinlang.org/docs/properties.html#late-initialized-properties-and-variables&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1756685902412&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Properties | Kotlin&quot; data-og-description=&quot; &quot; data-og-host=&quot;kotlinlang.org&quot; data-og-source-url=&quot;https://kotlinlang.org/docs/properties.html#late-initialized-properties-and-variables&quot; data-og-url=&quot;https://kotlinlang.org/docs/properties.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ba06iN/hyZGkYbLiL/cEHbrLakaT5t78Gm4quKcK/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800&quot;&gt;&lt;a href=&quot;https://kotlinlang.org/docs/properties.html#late-initialized-properties-and-variables&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kotlinlang.org/docs/properties.html#late-initialized-properties-and-variables&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ba06iN/hyZGkYbLiL/cEHbrLakaT5t78Gm4quKcK/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Properties | Kotlin&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kotlinlang.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;이게 때론 불편함. di를 통해 초기화 하기도 하고,&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;이런 상황을 위해, lateinit을 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1756686296765&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class OrderServiceTest {
    lateinit var orderService: OrderService

    @SetUp fun setup() {
        orderService = OrderService()
    }

    @Test fun processesOrderSuccessfully() {
        // Calls orderService directly without checking for null
        // or initialization
        orderService.processOrder()
    }
}&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;lateinit modifier은 var 에 다음에 선언하여 사용 가능.&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;/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;클래스 속성을 위해선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- primary 생성자에 선언하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- custom getter setter을 하지 않는다.&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;non-nullable 여야 하며, primitive 타입일 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기화 전에 접근한다면 exception 발생.&lt;/p&gt;
&lt;pre id=&quot;code_1756686926126&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ReportGenerator {
    lateinit var report: String

    fun printReport() {
        // Throws an exception as it's accessed before
        // initialization
        println(report)
    }
}

fun main() {
    val generator = ReportGenerator()
    generator.printReport()
    // Exception in thread &quot;main&quot; kotlin.UninitializedPropertyAccessException: lateinit property report has not been initialized
}&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;isInitialized로 초기화 되어있는지 확인 가능.&lt;/p&gt;
&lt;pre id=&quot;code_1756686985807&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class WeatherStation {
    lateinit var latestReading: String

    fun printReading() {
        // Checks whether the property is initialized
        if (this::latestReading.isInitialized) {
            println(&quot;Latest reading: $latestReading&quot;)
        } else {
            println(&quot;No reading available&quot;)
        }
    }
}

fun main() {
    val station = WeatherStation()

    station.printReading()
    // No reading available
    station.latestReading = &quot;22&amp;deg;C, sunny&quot;
    station.printReading()
    // Latest reading: 22&amp;deg;C, sunny
}&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;isInitialized는 이미 접근이 가능할 때만 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일 클래스 안, outer class 또는 같은 파일의 최상단에서 선언해야 한다.&lt;/p&gt;</description>
      <author>sryang</author>
      <guid isPermaLink="true">https://srandroid.tistory.com/824</guid>
      <comments>https://srandroid.tistory.com/824#entry824comment</comments>
      <pubDate>Tue, 2 Sep 2025 09:20:57 +0900</pubDate>
    </item>
    <item>
      <title>[독서] 폴란드 풍차</title>
      <link>https://srandroid.tistory.com/823</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;p data-ke-size=&quot;size16&quot;&gt;저주 받은 가문으로 5대에 걸쳐서 구성원 모두가 순탄치 않은 운명으로 단명하는 비극적인 이야기 이다.&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;&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;상류층 에서 하위에 속하고, 자신의 외적인 모습에 대해 만족하지 못하는 '열등감'을 함께 갖고 산다.&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;폴란드 풍차의 새로운 주인이 된 '조제프' 이야기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코스트가 3대에 걸친 비극적인 죽음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코스트 4대 마리의 불행과 조제프와의 만남으로 잠시 멈춘 저주.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조제프의 죽음과 마지막 5대 ?? 의 비극&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;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(현실적으로)마리는 굉장히 안타깝고 불행한 삶을 살지만, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;가문에 걸쳐 재산을 잃어왔음에도 연 2억 정도(chat gpt로 환산)의&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&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;/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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>독서</category>
      <author>sryang</author>
      <guid isPermaLink="true">https://srandroid.tistory.com/823</guid>
      <comments>https://srandroid.tistory.com/823#entry823comment</comments>
      <pubDate>Mon, 1 Sep 2025 11:18:14 +0900</pubDate>
    </item>
    <item>
      <title>[독서] 백년의 고독</title>
      <link>https://srandroid.tistory.com/822</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;어렸을 때 어딘가에서 '&lt;b&gt;마꼰도&lt;/b&gt;'라는 명칭을 들어본 것 같은 기억이 난다. TV였던 것 같았는데.&lt;/p&gt;
&lt;p data-end=&quot;196&quot; data-start=&quot;110&quot; data-ke-size=&quot;size16&quot;&gt;『백년의 고독』 이 책에서 마꼰도가 등장한다. 식민지 시대에 원주민들을 주인공으로 한다. 부엔디아라는 가문이 친구 가족들과 독립해 만든 나라가 마꼰도이다.&lt;/p&gt;
&lt;p data-end=&quot;196&quot; data-start=&quot;110&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;325&quot; data-start=&quot;198&quot; data-ke-size=&quot;size16&quot;&gt;30여 가구에서 시작한, 죽은 사람 하나 없는 평화로운 부족이다. 책은 반도 읽지 못하였지만, 나중에 300여 명이 넘는 커다란 부족으로 발전하지만 마꼰도를 지배하려는 도시 세력과 싸우다 전쟁에 패배해 부엔디아 가문이 몰락한다.&lt;/p&gt;
&lt;p data-end=&quot;370&quot; data-start=&quot;327&quot; data-ke-size=&quot;size16&quot;&gt;호세 아르까디오 부엔디아와 그의 부인 우르술라에 대한 이야기로 먼저 시작된다.&lt;/p&gt;
&lt;p data-end=&quot;370&quot; data-start=&quot;327&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;576&quot; data-start=&quot;372&quot; data-ke-size=&quot;size16&quot;&gt;마꼰도를 창립하는 과정과 초대 족장인 부엔디아의 과학과 문명에 대한 호기심, 대표답게 부족에 헌신하며 이끌어가는 내용이 나온다. 매년 새로운 문물들을 가져오는 집시들과 거래를 하며, 그 문물들을 활용하여 대단한 발명품을 만들기 시도하는 모습이 인상적이었다. 하지만 힘들게 모은 재산을 아내의 반대에도 불구하고 과감하게 탕진하는 것을 볼 때는 아내가 불쌍하기도 했다.&lt;/p&gt;
&lt;p data-end=&quot;670&quot; data-start=&quot;578&quot; data-ke-size=&quot;size16&quot;&gt;그다음 장에서는 두 아들에 대한 이야기가 나오는데, 첫째 아들하고 족장하고 이름이 비슷하여 나중에는 아빠와 두 아들이 누가 누군지 헷갈려 읽는 데 좀 짜증이 났었다.&lt;/p&gt;
&lt;p data-end=&quot;670&quot; data-start=&quot;578&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;919&quot; data-start=&quot;672&quot; data-ke-size=&quot;size16&quot;&gt;두 번째 장부터 성적인 이야기가 좀 많이 나온 걸로 기억한다. 첫째 아들은 아버지를 닮아서 엄청난 거구에 힘도 장사이다. 첫 번째 여자가 임신을 하자 집시들과 함께 떠나버린다. 전 세계를 몇 바퀴 돌며 17명의 자녀를 만들었고, 오랜 기간(10년?) 후 온몸에 문신을 하고 부족에 다시 돌아와 술집들을 드나들며 매일 여자들과 놀아난다. 그럼에도 마초 같은 매력에 반해 부엔디아 가족에 입양된 레베카와 결혼하는 등 막장스러운 이야기들이 나온다.&lt;/p&gt;
&lt;p data-end=&quot;919&quot; data-start=&quot;672&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1049&quot; data-start=&quot;921&quot; data-ke-size=&quot;size16&quot;&gt;부족 사회라 근친혼이 일반적이었고, 이에 따른 기형아 출산에 대한 인식도 가지고 있었다. 문명 사회와 교류하며 피아노도 사고 이탈리아인을 사위로 삼을 능력도 있는 것을 보면 내가 생각하는 원주민 같은 부족은 아닌 것 같기도 하다.&lt;/p&gt;
&lt;p data-end=&quot;1099&quot; data-start=&quot;1051&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1099&quot; data-start=&quot;1051&quot; data-ke-size=&quot;size16&quot;&gt;그 후 이야기들은 내 머릿속에는 대부분 이상한 내용들만 남아 있어 여기까지만 써야겠다.&lt;/p&gt;</description>
      <category>독서</category>
      <author>sryang</author>
      <guid isPermaLink="true">https://srandroid.tistory.com/822</guid>
      <comments>https://srandroid.tistory.com/822#entry822comment</comments>
      <pubDate>Mon, 30 Jun 2025 11:51:21 +0900</pubDate>
    </item>
    <item>
      <title>org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering</title>
      <link>https://srandroid.tistory.com/821</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오류 메시지를 분석하긴 어려워 코드를 한 줄씩 주석하며 빌드해 원인을 찾았다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.kotlin.compose) &amp;lt;-- 라이브러리 생성되었는데 이게 추가 안되어 발생
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <author>sryang</author>
      <guid isPermaLink="true">https://srandroid.tistory.com/821</guid>
      <comments>https://srandroid.tistory.com/821#entry821comment</comments>
      <pubDate>Mon, 2 Jun 2025 15:55:18 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 권한 샘플 코드 PermissionBox  분석</title>
      <link>https://srandroid.tistory.com/820</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드에서 권한 요청&amp;nbsp;&lt;a href=&quot;https://github.com/android/platform-samples/blob/main/shared/src/main/java/com/example/platform/shared/PermissionBox.kt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;샘플&amp;nbsp;코드&lt;/a&gt;를&amp;nbsp;제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;하나의&amp;nbsp;권한&amp;nbsp;요청&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순하게 하나의 권한만 요청하는 기능과 여러 권한을 요청하는 기능을 제공한다.&lt;br /&gt;여러 권한을 요청할 때는 요청 권한 리스트와, 필수 권한 리스트를 따로 받아 처리한다.  &lt;br /&gt;파라미터를&amp;nbsp;여러가&amp;nbsp;받지만&amp;nbsp;중요한&amp;nbsp;건&amp;nbsp;permission&amp;nbsp;파라미터.&amp;nbsp;이것만&amp;nbsp;요청해도&amp;nbsp;동작한다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;/**
 * The PermissionBox uses a [Box] to show a simple permission request UI when the provided [permission]
 * is revoked or the provided [onGranted] content if the permission is granted.
 *
 * This composable follows the permission request flow but for a complete example check the samples
 * under privacy/permissions
 *
 * 하나의 권한만 요청
 * @param permission 요청 권한
 */
@Composable
fun PermissionBox(modifier: Modifier = Modifier, permission: String, description: String? = null, contentAlignment: Alignment = Alignment.TopStart, onGranted: @Composable BoxScope.() -&amp;gt; Unit, ) {
    PermissionBox(modifier, permissions = listOf(permission), requiredPermissions = listOf(permission), description, contentAlignment,) { onGranted() }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;권한&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;처리는&amp;nbsp;'여러&amp;nbsp;권한'을&amp;nbsp;받는&amp;nbsp;함수에서&amp;nbsp;처리.&amp;nbsp;위에&amp;nbsp;'하나의&amp;nbsp;권한'&amp;nbsp;요청은&amp;nbsp;요청&amp;nbsp;권한과&amp;nbsp;필수&amp;nbsp;권한을&amp;nbsp;동일하게&amp;nbsp;해서&amp;nbsp;'여러&amp;nbsp;권한'&amp;nbsp;처리&amp;nbsp;하는&amp;nbsp;함수를&amp;nbsp;다시&amp;nbsp;호출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;여러&amp;nbsp;권한과&amp;nbsp;필수&amp;nbsp;권한&amp;nbsp;요청&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rememberMultiplePermissionsState 이 객체가 핵심 정보를 모두 담고있다.&lt;br /&gt;구글에서 accompanist.permissions 라는 compose용 권한을 편리하게 처리 할 수 있는 라이브러리를 제공한다.&lt;br /&gt;&lt;a href=&quot;https://google.github.io/accompanist/permissions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://google.github.io/accompanist/permissions/&lt;/a&gt;&lt;br /&gt;compose 개발을 돕는 라이브러리로, androidX에 포함 될 수 없는 아직 실험 상태인 라이브러리 이다.&lt;br /&gt;다른 코드로 작성한 권한 &lt;a href=&quot;https://github.com/android/platform-samples/blob/main/samples/privacy/permissions/src/main/java/com/example/platform/privacy/permissions/ComposePermissions.kt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;샘플 코드&lt;/a&gt;도&amp;nbsp;있어&amp;nbsp;나중에&amp;nbsp;분석해&amp;nbsp;봐야겠다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와&amp;nbsp;같이&amp;nbsp;권한을&amp;nbsp;체크하는데&amp;nbsp;필요한&amp;nbsp;유용한&amp;nbsp;정보를&amp;nbsp;모아서&amp;nbsp;제공해준다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;@ExperimentalPermissionsApi
@Stable
interface MultiplePermissionsState {
    val permissions: List&amp;lt;PermissionState&amp;gt;
    val revokedPermissions: List&amp;lt;PermissionState&amp;gt;
    val allPermissionsGranted: Boolean
    val shouldShowRationale: Boolean
    fun launchMultiplePermissionRequest(): Unit
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;거부한&amp;nbsp;권한&amp;nbsp;정보&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권한 허용/거부에 대한 결과를 아래 함수에서 콜백 받도록 제공해준다.&lt;br /&gt;아래 한 줄로 거부 권한에 대한 정보를 필터 한다.&lt;br /&gt;Map에서 값에 대한 타입이 Boolean 일 경우 filterValues를 사용해서 true/false를 필터 할 수 있다.  &lt;br /&gt;샘플&amp;nbsp;코드에서&amp;nbsp;아래&amp;nbsp;부분은&amp;nbsp;권한을&amp;nbsp;거부&amp;nbsp;했을&amp;nbsp;때&amp;nbsp;에러&amp;nbsp;메세지를&amp;nbsp;표시하는&amp;nbsp;용도로&amp;nbsp;사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;erlang-repl&quot;&gt;&lt;code&gt;onPermissionsResult = { permissionResultMap -&amp;gt;
            val rejectedPermissions = permissionResultMap.filterValues { !it }.keys
        }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필수&amp;nbsp;권한&amp;nbsp;허용&amp;nbsp;여부&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회수된 권한(권한 허용을 안한 권한들?) 중에 필수 권한이 있는지 체크하는 코드이다. 매우 간결하다&lt;br /&gt;none라는&amp;nbsp;함수를&amp;nbsp;사용한다.&amp;nbsp;두개의&amp;nbsp;리스트를&amp;nbsp;비교해&amp;nbsp;같은&amp;nbsp;값이&amp;nbsp;없어야&amp;nbsp;하는&amp;nbsp;경우&amp;nbsp;유용하게&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;것&amp;nbsp;같다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;val allRequiredPermissionsGranted = permissionState.revokedPermissions.none { it.permission in requiredPermissions }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로직&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필수&amp;nbsp;권한을&amp;nbsp;허용했다면&amp;nbsp;-&amp;gt;&amp;nbsp;종료&lt;br /&gt;&lt;br /&gt;필수&amp;nbsp;권한을&amp;nbsp;설정하지&amp;nbsp;않았다면&amp;nbsp;-&amp;gt;&amp;nbsp;'권한&amp;nbsp;허용이&amp;nbsp;안된&amp;nbsp;경우'&amp;nbsp;로직&amp;nbsp;이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;권한&amp;nbsp;허용이&amp;nbsp;안된&amp;nbsp;경우&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필수&amp;nbsp;권한에&amp;nbsp;대한&amp;nbsp;정보를&amp;nbsp;알리고&amp;nbsp;요청&amp;nbsp;버튼이&amp;nbsp;나온다.&lt;br /&gt;&lt;br /&gt;버튼&amp;nbsp;클릭&amp;nbsp;시&amp;nbsp;해야할&amp;nbsp;작업이&amp;nbsp;있다.&lt;br /&gt;&lt;br /&gt;shouldShowRationale&amp;nbsp;여부&amp;nbsp;확인&lt;br /&gt;&lt;br /&gt;권한을&amp;nbsp;1회&amp;nbsp;거부&amp;nbsp;시&amp;nbsp;shouldShowRationale&amp;nbsp;상태가&amp;nbsp;true가&amp;nbsp;된다.&lt;br /&gt;한번&amp;nbsp;더&amp;nbsp;거부&amp;nbsp;시&amp;nbsp;영구&amp;nbsp;거부상태가&amp;nbsp;되므로,&amp;nbsp;권한을&amp;nbsp;다시&amp;nbsp;요청할&amp;nbsp;때&amp;nbsp;이&amp;nbsp;값이&amp;nbsp;true라면&amp;nbsp;다이얼로그로&amp;nbsp;사용자에게&amp;nbsp;권한이&amp;nbsp;필요한&amp;nbsp;이유에&amp;nbsp;대해&lt;br /&gt;좀&amp;nbsp;더&amp;nbsp;상세하게&amp;nbsp;설명해줘야&amp;nbsp;한다.&lt;br /&gt;&lt;br /&gt;최초&amp;nbsp;요청&amp;nbsp;시&amp;nbsp;showRationale&amp;nbsp;=&amp;nbsp;false&amp;nbsp;상태&amp;nbsp;-&amp;gt;&amp;nbsp;바로&amp;nbsp;시스템&amp;nbsp;권한&amp;nbsp;팝업&amp;lt;br&amp;gt;&lt;br /&gt;1회 거부 시 showRationale = true 상태 -&amp;gt; 다이얼로그 띄움 -&amp;gt; 사용자 확인 -&amp;gt; 시스템 권한 팝업&lt;br /&gt;2회 거부 시 showRationale = false -&amp;gt; 바로 시스템 권한 팝업 but 팝업이 뜨지도 않고 거부 처리 됨.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #080808;&quot;&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;if (state.shouldShowRationale) { showRationale = true }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;필수&amp;nbsp;권한을&amp;nbsp;모두&amp;nbsp;허용&amp;nbsp;했다면,&amp;nbsp;화면&amp;nbsp;진행.&lt;br /&gt;-&amp;nbsp;필수&amp;nbsp;권한&amp;nbsp;미&amp;nbsp;허용&amp;nbsp;시,&amp;nbsp;필수&amp;nbsp;권한&amp;nbsp;표시와&amp;nbsp;요청&amp;nbsp;버튼&amp;nbsp;표시&lt;br /&gt;-&amp;nbsp;권한&amp;nbsp;요청&amp;nbsp;시&amp;nbsp;showRationale&amp;nbsp;=&amp;nbsp;true&amp;nbsp;라면&amp;nbsp;다이얼로그&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;a href=&quot;https://github.com/android/platform-samples/blob/main/shared/src/main/java/com/example/platform/shared/PermissionBox.kt&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/android/platform-samples/blob/main/shared/src/main/java/com/example/platform/shared/PermissionBox.kt&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1748762771259&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;platform-samples/shared/src/main/java/com/example/platform/shared/PermissionBox.kt at main &amp;middot; android/platform-samples&quot; data-og-description=&quot;A collection of samples of different Android OS platform APIs. - android/platform-samples&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/android/platform-samples/blob/main/shared/src/main/java/com/example/platform/shared/PermissionBox.kt&quot; data-og-url=&quot;https://github.com/android/platform-samples/blob/main/shared/src/main/java/com/example/platform/shared/PermissionBox.kt&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yMpAG/hyY4a2hj8h/kcnEBkqSINDH0c2MnY76Dk/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/ceKbyv/hyY0xEO2wl/L1gHDyVO7g2lCDCKF14PP1/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900&quot;&gt;&lt;a href=&quot;https://github.com/android/platform-samples/blob/main/shared/src/main/java/com/example/platform/shared/PermissionBox.kt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/android/platform-samples/blob/main/shared/src/main/java/com/example/platform/shared/PermissionBox.kt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yMpAG/hyY4a2hj8h/kcnEBkqSINDH0c2MnY76Dk/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900,https://scrap.kakaocdn.net/dn/ceKbyv/hyY0xEO2wl/L1gHDyVO7g2lCDCKF14PP1/img.png?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;platform-samples/shared/src/main/java/com/example/platform/shared/PermissionBox.kt at main &amp;middot; android/platform-samples&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A collection of samples of different Android OS platform APIs. - android/platform-samples&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Android/권한(permissions)</category>
      <author>sryang</author>
      <guid isPermaLink="true">https://srandroid.tistory.com/820</guid>
      <comments>https://srandroid.tistory.com/820#entry820comment</comments>
      <pubDate>Sun, 1 Jun 2025 16:26:18 +0900</pubDate>
    </item>
  </channel>
</rss>