<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>App노자</title>
    <link>https://cjh94.tistory.com/</link>
    <description>앱 개발자 일본 생활</description>
    <language>ko</language>
    <pubDate>Thu, 6 Aug 2026 14:21:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>앱의노예</managingEditor>
    <image>
      <title>App노자</title>
      <url>https://tistory1.daumcdn.net/tistory/5295473/attach/89b625e5e018457286890082e7da0c40</url>
      <link>https://cjh94.tistory.com</link>
    </image>
    <item>
      <title>[Jetpack Compose] AnimatedVisibility</title>
      <link>https://cjh94.tistory.com/156</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Animation API란?&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jetpack Compose에서 제공하는&amp;nbsp; Animation API를 이용하면 사용자 인터페이스에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면 전환, 크기 변화, 색상 변화 등 다양한 애니메이션 효과를 쉽게 추가할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Animation API는 여러 클래스와 함수로 구성되며 주요 Animation&amp;nbsp;API들은 크게&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;a href=&quot;https://developer.android.com/develop/ui/compose/animation/introduction&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/develop/ui/compose/animation/introduction&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724055554574&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;Compose의 애니메이션 &amp;nbsp;|&amp;nbsp; Jetpack Compose &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;Compose의 애니메이션은 사용하기 쉬우며 앱에서 훌륭한 상호작용을 제공합니다.&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/develop/ui/compose/animation/introduction&quot; data-og-url=&quot;https://developer.android.com/develop/ui/compose/animation/introduction?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOVJsD/hyWSc2F8LP/ia81ogDgK7rlet20uuabf0/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676&quot;&gt;&lt;a href=&quot;https://developer.android.com/develop/ui/compose/animation/introduction&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/develop/ui/compose/animation/introduction&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOVJsD/hyWSc2F8LP/ia81ogDgK7rlet20uuabf0/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676');&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;Compose의 애니메이션 &amp;nbsp;|&amp;nbsp; Jetpack Compose &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Compose의 애니메이션은 사용하기 쉬우며 앱에서 훌륭한 상호작용을 제공합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;AnimatedVisibility&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1724050480236&quot; class=&quot;nix&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;@Composable
fun AnimatedVisibilityExample() {
    var isVisible by remember { mutableStateOf(true) }

    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Button(onClick = { isVisible = !isVisible }) {
            Text(&quot;Toggle Visibility&quot;)
        }

        Spacer(modifier = Modifier.height(16.dp))

        AnimatedVisibility(
            visible = isVisible,
            enter = fadeIn(animationSpec = tween(durationMillis = 500)),
            exit = fadeOut(animationSpec = tween(durationMillis = 500))
        ) {
            Text(&quot;Hello, Jetpack Compose!&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AnimatedVisibility는&amp;nbsp;특정 UI 요소의 가시성을 컨트롤하면서 애니메이션을 적용하는 데 사용되는 API이다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컴포넌트가 갑자기 나타나거나 사라지는 대신&lt;span&gt;&amp;nbsp;&lt;/span&gt;AnimatedVisibility 컴포저블을 이용해&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;좀 더 자연스러운 UI작성이 가능하다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 사용자 인터페이스 요소가 화면에 서서히 나타나거나 화면에서 사라질 수 있으며&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;수직, 수평 위로 이동하면서 나타나거나 사라질 수도 있고 확장하거나 줄어들면서 나타나거나 사라질 수도 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AnimatedVisibility의 visible 속성을 통해 요소의 가시성을 제어하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enter와 exit 애니메이션을 사용하여 요소가 나타나고 사라질 때의 애니메이션 효과를 지정한다&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;expandHorizontally()&lt;/b&gt;: 수평으로 자르는 기법을 이용해 컴포저블을 표시한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;애니메이션을 시작하기 전 최초에 표시할 컴포저블의 정도를 옵션으로 제어할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(컴포저블이 왼쪽에서 오른쪽으로 가로 방향으로 확장되면서 나타나도록 하는 애니메이션)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;expandVertically()&lt;/b&gt;: 수직으로 자르는 기법을 이용해 컴포저블을 표시한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;애니메이션을 시작하기 전 최초에 표시할 컴포저블의 정도를 옵션으로 제어할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(컴포저블이 위에서 아래로 세로 방향으로 확장되면서 나타나도록 하는 애니메이션)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;expandIn()&lt;/b&gt;: 수직 및 수평으로 자르는 기법을 이용해 컴포저블을 표시한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;애니메이션을 시작하기 전 최초에 표시할 컴포저블의 정도를 옵션으로 제어할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;fadeIn()&lt;/b&gt;: 투명한 상태에서 불투명한 상태로 컴포저블을 뷰에 표시한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;초기 alpha값은 0에서 1.0 사이로 선언 가능하며 기본값은 0이다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;fadeOut()&lt;/b&gt;: 불투명한 상태에서 투명한 상태로 컴포저블을 뷰에서 사라지게 한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대상이 완전히 사라지기 전의 alpha값을 0에서 1.0 사이로 선언 가능하며 기본값은 0이다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;scaleIn()&lt;/b&gt;: 확대(zoom in)한 것처럼 컴포저블이 뷰로 확장된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 컴포저블은 아무것도 없는 상태에서 전체 크기로 확장되지만, 초기 비율값을 0에서 1.0 사이의&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;부동소수점 값으로 지정할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;scaleOut()&lt;/b&gt;: 컴포저블을 전체 크기에서 지정한 대상 비율까지 줄인 뒤 사라지게 한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대상 비율의 기본값은 0이며, 0에서 1.0 사이의 부동소수점 값으로 설정할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;shrinkHorizontally()&lt;/b&gt;: 컴포저블은 수평 경계선까지 축소된 후 슬라이드하며 사라진다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대상 폭과 슬라이드 방향을 설정할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;shrinkVertically()&lt;/b&gt;: 컴포저블은 수직 경계선까지 축소된 후 슬라이드하며 사라진다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대상 폭과 슬라이드 방향을 설정할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;shrinkOut()&lt;/b&gt;: 컴포저블은 수직/수평 경계선까지 축소된 뒤 슬라이드하며 사라진다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;slideInHorizontally()&lt;/b&gt;: 컴포저블은 수평축을 따라 슬라이드하며 표시된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;슬라이드 방향과 슬라이드를 시작할 오프셋을 지정할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;slideInVertically()&lt;/b&gt;: 컴포저블은 수직축을 따라 슬라이드하며 표시된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;슬라이드 방향과 슬라이드를 시작할 오프셋을 지정할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;slideIn()&lt;/b&gt;: 컴포저블이 초기 오프셋 값으로 지정한 각도에서 슬라이드하며 표시된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;slideOut()&lt;/b&gt;: 컴포저블이 대상 오프셋 값으로 지정한 각도로 슬라이드하며 사라진다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;slideOutHorizontally()&lt;/b&gt;: 컴포저블은 수평축을 따라 슬라이드하며 사라진다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;슬라이드 방향과 슬라이드를 종료할 오프셋을 지정할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;slideOutVertically()&lt;/b&gt;: 컴포저블은 수직축을 따라 슬라이드하며 사라진다 슬라이드 방향과 슬라이드를 종료할 오프셋을 지정할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/develop/ui/compose/animation/composables-modifiers&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/develop/ui/compose/animation/composables-modifiers&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724055522009&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;애니메이션 수정자 및 컴포저블 &amp;nbsp;|&amp;nbsp; Jetpack Compose &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;이 페이지는 Cloud Translation API를 통해 번역되었습니다. 애니메이션 수정자 및 컴포저블 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Compose에는 일반적인 &quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/develop/ui/compose/animation/composables-modifiers&quot; data-og-url=&quot;https://developer.android.com/develop/ui/compose/animation/composables-modifiers?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bo8aHN/hyWOse57kV/FiONvB25Qq7Fk17Fsb99R0/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676&quot;&gt;&lt;a href=&quot;https://developer.android.com/develop/ui/compose/animation/composables-modifiers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/develop/ui/compose/animation/composables-modifiers&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bo8aHN/hyWOse57kV/FiONvB25Qq7Fk17Fsb99R0/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676');&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;애니메이션 수정자 및 컴포저블 &amp;nbsp;|&amp;nbsp; Jetpack Compose &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 Cloud Translation API를 통해 번역되었습니다. 애니메이션 수정자 및 컴포저블 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Compose에는 일반적인&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3.&lt;span&gt;&lt;span&gt; &lt;/span&gt;AnimationSpec&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1724050480238&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;AnimatedVisibility(
    visible = isVisible.value,
    enter = tween(
        durationMillis = 500,
        delayMillis = 100 // 애니메이션 시작 전 지연 시간
    ),
    exit = tween(
        durationMillis = 500,
        delayMillis = 100 // 애니메이션 시작 전 지연 시간
    )
) {
    // 애니메이션 효과가 적용될 내용
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AnimationSpec을 사용하면 애니메이션의 유지 시간, 시작 지연, 스프링, 튕김 효과, 반복, 애니메이션 Easing을 포함한 여러 애니메이션 동작의 측면을 설정할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Row, Column 및 다른 컨테이너 컴포저블과 마찬가지로, AnimatedVisibility도 고유한 스코프를 갖으며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 스코프 안에서 애니메이션에 대한 추가 함수에 접근할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tween() 함수를 호출하여 AnimationSpec의 인스턴스를 생성하고, 이를 애니메이션 효과 함수의 파라미터로 전달하여 사용할 수 있다&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;durationMillis()&lt;/b&gt;: 애니메이션이 완료되는 데 걸리는 시간입니다. 밀리초(ms) 단위로 설정한다&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;delayMillis()&lt;/b&gt;: 애니메이션이 시작되기 전에 기다리는 시간입니다. 밀리초(ms) 단위로 설정한다&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;easing()&lt;/b&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;repeatable()&lt;/b&gt;: 애니메이션을 반복할 수 있도록 설정할 수 있으며, 반복 횟수와 방향을 지정할 수 있다&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4.&lt;span&gt;&lt;span&gt;&lt;span&gt; Easing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;pre id=&quot;code_1724053042634&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;val animationSpec = tween(
    durationMillis = 500,
    easing = FastOutSlowInEasing
)

AnimatedVisibility(
    visible = isVisible.value,
    enter = animationSpec,
    exit = animationSpec
) {
    // 애니메이션 효과가 적용될 내용
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애니메이션 이징(Easing)은 애니메이션의 속도가 시간에 따라 어떻게 변화하는지를 정의하는 함수이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Easing을 사용하면 애니메이션이 단순히 일정한 속도로 움직이는 것보다 더 자연스럽고 부드럽게 보이도록 만들 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Easing은 tween()를 이용해 지정하며 애니메이션의 시작, 중간, 끝 부분에서 속도를 가속하거나 감속하는 데 사용된다&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;LinearEasing(): &lt;/b&gt;애니메이션이 일정한 속도로 진행된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속도의 변화 없이 일정하게 움직이기 때문에 가장 단순한 형태의 Easing이다&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;FastOutSlowInEasing(): &lt;/b&gt;애니메이션이 빠르게 시작하고 점점 느려지며 종료된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연스러운 감속 효과를 주어, UI 요소가 부드럽게 멈추는 느낌을 준다&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;EaseInEasing(): &lt;/b&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;b&gt;EaseOutEasing(): &lt;/b&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;b&gt;EaseInOutEasing(): &lt;/b&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;b&gt;BounceEasing(): &lt;/b&gt;애니메이션이 끝날 때 튕기는 효과를 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공이 떨어졌다가 바닥에서 튕기는 것 같은 동작을 모방한 Easing이다&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;CubicBezierEasing(): &lt;/b&gt;커스텀 베지어 곡선을 이용해 Easing 곡선을 직접 정의할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네 개의 제어점을 통해 애니메이션의 속도 변화를 정밀하게 조정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 easing = CubicBezierEasing(0.42f, 0.0f, 0.58f, 1.0f)&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;LinearOutSlowInEasing(): &lt;/b&gt;애니메이션이 일정한 속도로 시작한 후 느리게 종료된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastOutSlowInEasing과 비슷하지만, 시작 부분이 일정한 속도로 진행된다는 점이 다르다&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;FastOutLinearInEasing(): &lt;/b&gt;애니메이션이 빠르게 시작하고, 그 후 일정한 속도로 종료된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EaseInOutEasing과 반대의 속도 곡선을 갖는다&lt;/p&gt;</description>
      <category>Android/Jetpack Compose</category>
      <author>앱의노예</author>
      <guid isPermaLink="true">https://cjh94.tistory.com/156</guid>
      <comments>https://cjh94.tistory.com/156#entry156comment</comments>
      <pubDate>Mon, 19 Aug 2024 22:01:49 +0900</pubDate>
    </item>
    <item>
      <title>[Jetpack Compose] ConstraintLayout</title>
      <link>https://cjh94.tistory.com/150</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. ConstraintLayout 이란?&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1722645669296&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ConstraintLayout(
    modifier = Modifier
        .size(300.dp)
        .background(Color.Gray)
) {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ConstraintLayout은 Compose에서 복잡한 레이아웃을 구성할 때 사용한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;XML 기반의 ConstraintLayout과 유사한 방식으로, 제트팩 컴포즈에서는 ConstraintLayout을 통해&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;화면 요소들을 상대적으로 배치할 수 있으며 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;다른 레이아웃 composable과 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마찬가지로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ConstraintLayout은 하나의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;modifier 파라미터를 호출할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ConstraintLayout은 컴포저블 및 컴포즈의 다른 레이아웃들과 동일한 형태로 제공되며 위와 같은 방식으로 호출한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/develop/ui/compose/layouts/constraintlayout&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/develop/ui/compose/layouts/constraintlayout&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722645858444&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;Compose의 ConstraintLayout &amp;nbsp;|&amp;nbsp; Jetpack Compose &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;이 페이지는 Cloud Translation API를 통해 번역되었습니다. Compose의 ConstraintLayout 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. ConstraintLayout은 화면에 다른 컴포&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/develop/ui/compose/layouts/constraintlayout&quot; data-og-url=&quot;https://developer.android.com/develop/ui/compose/layouts/constraintlayout?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/f2f5w/hyWKwz6rNW/xjchOPaQ5d3tNONchBEZeK/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676&quot;&gt;&lt;a href=&quot;https://developer.android.com/develop/ui/compose/layouts/constraintlayout&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/develop/ui/compose/layouts/constraintlayout&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/f2f5w/hyWKwz6rNW/xjchOPaQ5d3tNONchBEZeK/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676');&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;Compose의 ConstraintLayout &amp;nbsp;|&amp;nbsp; Jetpack Compose &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 Cloud Translation API를 통해 번역되었습니다. Compose의 ConstraintLayout 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. ConstraintLayout은 화면에 다른 컴포&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.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;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 사용 방법&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;pre id=&quot;code_1722646684118&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    implementation &quot;androidx.constraintlayout:constraintlayout-compose:1.0.1&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Jetpack Compose의 ConstraintLayout은 별도의 라이브러리로 제공된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ConstraintLayout을 사용하기 위해 가장 먼저 build.gradle 파일에 위의 의존성을 추가한다&lt;/p&gt;
&lt;pre id=&quot;code_1722645669299&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;@Composable
fun ConstraintLayoutExample() {
    ConstraintLayout(
        modifier = Modifier
            .size(300.dp)
            .background(Color.Gray)
    ) {
        //val text1 = createRef()
        val (box1, box2) = createRefs()

        Box(
            modifier = Modifier
                .size(50.dp)
                .background(Color.Red)
                .constrainAs(box1) {
                    start.linkTo(parent.start)
                    top.linkTo(parent.top)
                }
        )

        Box(
            modifier = Modifier
                .size(50.dp)
                .background(Color.Green)
                .constrainAs(box2) {
                    start.linkTo(box1.end, margin = 8.dp)
                    top.linkTo(box1.bottom, margin = 8.dp)
                }
        )
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참조를 할당해서 제약을 추가한 코드이다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제약 조건이 존재하지 않으면 ConstraintLayout의 composable 자식은 콘텐츠 영역의 왼쪽 위 모서리에 배치된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ConstraintLayout이 참조(createRef(), createRefs())를 통해 각 composable 요소를 식별하고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 기반으로 제약 조건을 설정하기 때문에 제약을 받을 composable 요소에&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제약 조건을 적용하기 전에 참조를 할당해야 한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ConstraintLayout을 사용할 때, composable의 제약 조건은 주로 부모 ConstraintLayout 또는&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다른 composable의 관계를 설정하는 형태로 정의된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제약 조건의 작성 방법은 XML 문법과 유사하며 constrainAs의 후행 람다 안에서 linkTo 함수를 호출하여 선언한다&lt;/p&gt;
&lt;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Annotation&lt;/h2&gt;
&lt;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Annotation&lt;/h2&gt;</description>
      <category>Android/Jetpack Compose</category>
      <author>앱의노예</author>
      <guid isPermaLink="true">https://cjh94.tistory.com/150</guid>
      <comments>https://cjh94.tistory.com/150#entry150comment</comments>
      <pubDate>Sat, 3 Aug 2024 09:45:43 +0900</pubDate>
    </item>
    <item>
      <title>[Jetpack Compose] DisposableEffect</title>
      <link>https://cjh94.tistory.com/147</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. DisposableEffect란?&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DisposableEffect는 Jetpack Compose에서 리소스 관리와 side effect 처리를 위해 제공되는 API이다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;주로 컴포저블이 컴포지션에 추가되거나 제거될 때 수행해야 하는 작업을 정의하는 데 사용된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컴포저블이 화면에 나타날 때 side effect를 시작하고, 화면에서 제거될 때 정리 작업을 수행되며&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DisposableEffect는 블록 내에 여러 가지 작업이 있을 때 onDispose 절을 코드 블록의 마지막에 위치시켜야 한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;끝나는 지점을 명확히 인식할 수 있도록 하기 위함이며 그러지 않으면 IDE에 빌드 시간 오류가 발생할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/develop/ui/compose/side-effects#disposableeffect&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/develop/ui/compose/side-effects#disposableeffect&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722127548424&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;Compose의 부수 효과 &amp;nbsp;|&amp;nbsp; Jetpack Compose &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;이 페이지는 Cloud Translation API를 통해 번역되었습니다. Compose의 부수 효과 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 부수 효과는 구성 가능한 함수의 범&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/develop/ui/compose/side-effects#disposableeffect&quot; data-og-url=&quot;https://developer.android.com/develop/ui/compose/side-effects?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bW1uee/hyWCBJ9S2G/3LiUWJyUdhRVx6kMQntgVk/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676&quot;&gt;&lt;a href=&quot;https://developer.android.com/develop/ui/compose/side-effects#disposableeffect&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/develop/ui/compose/side-effects#disposableeffect&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bW1uee/hyWCBJ9S2G/3LiUWJyUdhRVx6kMQntgVk/img.png?width=1201&amp;amp;height=676&amp;amp;face=0_0_1201_676');&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;Compose의 부수 효과 &amp;nbsp;|&amp;nbsp; Jetpack Compose &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 페이지는 Cloud Translation API를 통해 번역되었습니다. Compose의 부수 효과 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 부수 효과는 구성 가능한 함수의 범&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 사용 방법&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1722127530836&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;@Composable
fun testDisposableEffect() {
    DisposableEffect(Unit) {
        println(&quot;Effect started&quot;)

        onDispose {
            println(&quot;Effect disposed&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722134132110&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Composable
fun MyComposable(data: String) {
    DisposableEffect(data) {
        // data값이 변경될 때마다 이 블록이 실행됩니다.
        println(&quot;DisposableEffect: $data&quot;)

        onDispose {
            // 기존의 효과를 정리하는 블록
            println(&quot;Dispose: $data&quot;)
        }
    }

    Text(text = data)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1722130775613&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Composable
fun MyScreen() {
    Box(
        modifier = Modifier
            .size(100.dp)
            .myComposableEffect()
            .background(Color.Red)
    )
}


fun Modifier.myComposableEffect() = composed {
    DisposableEffect(Unit) {
        println(&quot;Effect started&quot;)

        onDispose {
            println(&quot;Effect disposed&quot;)
        }
    }
}&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;&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>Android/Jetpack Compose</category>
      <author>앱의노예</author>
      <guid isPermaLink="true">https://cjh94.tistory.com/147</guid>
      <comments>https://cjh94.tistory.com/147#entry147comment</comments>
      <pubDate>Sat, 27 Jul 2024 21:22:45 +0900</pubDate>
    </item>
    <item>
      <title>[Jetpack Compose] Modifier</title>
      <link>https://cjh94.tistory.com/144</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;a href=&quot;https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier?hl=ko&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier?hl=ko&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>Android/Jetpack Compose</category>
      <author>앱의노예</author>
      <guid isPermaLink="true">https://cjh94.tistory.com/144</guid>
      <comments>https://cjh94.tistory.com/144#entry144comment</comments>
      <pubDate>Sun, 7 Jan 2024 23:44:34 +0900</pubDate>
    </item>
    <item>
      <title>[Jetpack Compose] Slot API</title>
      <link>https://cjh94.tistory.com/143</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Slot API란?&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Composable 함수는 하나 이상의 Composable 함수를 호출할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jetpack Compose에서의 Slot API는 Composable 함수를 통해 사용자 정의 UI 컴포넌트에 Slot을 제공하여, 이 컴포넌트의 일부를 외부에서 정의할 수 있게 하는 패턴이다&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;하나의 Slot API는 하나 이상의 요소가 비어 있는 UI&amp;nbsp;템플릿이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Composable이 호출될 때 파라미터로 전달되며 Compose 런타임 시스템이 UI를 렌더링 할 때 포함된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Composable의 슬롯에 전달할 수 있는 람다 표현식을 이용해 작성하며&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;a href=&quot;https://developer.android.com/codelabs/jetpack-compose-layouts?hl=ko#8&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.android.com/codelabs/jetpack-compose-layouts?hl=ko#8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704535411491&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;Compose의 기본 레이아웃 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;이 Codelab에서는 Compose에서 즉시 제공되는 컴포저블과 수정자를 통해 실제 디자인을 구현하는 방법을 알아봅니다.&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/codelabs/jetpack-compose-layouts?hl=ko#8&quot; data-og-url=&quot;https://developer.android.com/codelabs/jetpack-compose-layouts?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QyuSy/hyU2s0nKsc/j4mX34ewkN64T1WcQKJJK0/img.png?width=1999&amp;amp;height=949&amp;amp;face=0_0_1999_949,https://scrap.kakaocdn.net/dn/vE74g/hyUXMTL6kw/mEiTvglzV6rIuTbTcScByK/img.png?width=949&amp;amp;height=1999&amp;amp;face=0_0_949_1999,https://scrap.kakaocdn.net/dn/cRzuMf/hyUXKVX3dV/s8g6SffkCbhTzRnMGbID7k/img.png?width=934&amp;amp;height=1184&amp;amp;face=0_0_934_1184&quot;&gt;&lt;a href=&quot;https://developer.android.com/codelabs/jetpack-compose-layouts?hl=ko#8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/codelabs/jetpack-compose-layouts?hl=ko#8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QyuSy/hyU2s0nKsc/j4mX34ewkN64T1WcQKJJK0/img.png?width=1999&amp;amp;height=949&amp;amp;face=0_0_1999_949,https://scrap.kakaocdn.net/dn/vE74g/hyUXMTL6kw/mEiTvglzV6rIuTbTcScByK/img.png?width=949&amp;amp;height=1999&amp;amp;face=0_0_949_1999,https://scrap.kakaocdn.net/dn/cRzuMf/hyUXKVX3dV/s8g6SffkCbhTzRnMGbID7k/img.png?width=934&amp;amp;height=1184&amp;amp;face=0_0_934_1184');&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;Compose의 기본 레이아웃 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 Codelab에서는 Compose에서 즉시 제공되는 컴포저블과 수정자를 통해 실제 디자인을 구현하는 방법을 알아봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.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;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 사용 방법&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;pre id=&quot;code_1704537930843&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Composable
fun CustomSlot(content: @Composable () -&amp;gt; Unit) {
    Card(modifier = Modifier.padding(16.dp)) {
        Box(modifier = Modifier.padding(16.dp)) {
            content() // 여기에 배치된다
        }
    }
}

@Composable
fun TestSlot() {
    CustomSlot {
        Text(&quot;Hello!&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;@Composable () -&amp;gt; Unit 람다를 통해 카드의 내용을 사용하는 측에서 정의 할수 있게 한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 방식으로 Slot API를 사용하면 UI 컴포넌트의 재사용성과 유연성을 높일 수 있으며, 사용자 정의 요구에 쉽게 대응할 수 있는 이점이 있다&lt;/p&gt;</description>
      <category>Android/Jetpack Compose</category>
      <author>앱의노예</author>
      <guid isPermaLink="true">https://cjh94.tistory.com/143</guid>
      <comments>https://cjh94.tistory.com/143#entry143comment</comments>
      <pubDate>Sat, 6 Jan 2024 19:46:06 +0900</pubDate>
    </item>
    <item>
      <title>[Jetpack Compose] CompositionLocal</title>
      <link>https://cjh94.tistory.com/138</link>
      <description></description>
      <category>Android/Jetpack Compose</category>
      <author>앱의노예</author>
      <guid isPermaLink="true">https://cjh94.tistory.com/138</guid>
      <comments>https://cjh94.tistory.com/138#entry138comment</comments>
      <pubDate>Fri, 5 Jan 2024 12:27:19 +0900</pubDate>
    </item>
    <item>
      <title>[Jetpack Compose] MutableState</title>
      <link>https://cjh94.tistory.com/142</link>
      <description></description>
      <category>Android/Jetpack Compose</category>
      <author>앱의노예</author>
      <guid isPermaLink="true">https://cjh94.tistory.com/142</guid>
      <comments>https://cjh94.tistory.com/142#entry142comment</comments>
      <pubDate>Thu, 4 Jan 2024 21:26:36 +0900</pubDate>
    </item>
    <item>
      <title>[Jetpack Compose] Composable 함수</title>
      <link>https://cjh94.tistory.com/139</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Composable 함수란?&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;pre id=&quot;code_1704248961074&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;@Composable
fun Greeting(name: String) {
    Text(text = &quot;Hello $name&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Composable 함수는 Jetpack Compose로 사용자 인터페이스를 만들기 위해 사용하는 특수한 코틀린 함수이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;@Composable Annotation을 이용하여 선언하며 Composable이 호출되면 앱 안에서&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 영역이 이미지로 변환될 때 사용자에게 표시되고 동작되는 방식을 정의하는 데이터와 프로퍼티의 집합을 전달한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;코틀린의 일반 함수와 같은 방식으로 결괏값은 반환하지 않으며, 런타임으로 사용자 인터페이스 요소를 전달하면&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컴포즈 런타임 통해 렌더링 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;선언적 UI구성, 재사용성, 리엑티브 프로그래밍 등의 특징을 가지고 있으며 Stateful와 Stateless로 분류된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/codelabs/jetpack-compose-basics#0&quot;&gt;https://developer.android.com/codelabs/jetpack-compose-basics#0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704248961076&quot; style=&quot;color: #333333; text-align: start;&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gYfun/hyUTE9lzFt/JTFeUCzHBci9HVSoMUr5X1/img.png?width=2024&amp;amp;height=1582&amp;amp;face=0_0_2024_1582,https://scrap.kakaocdn.net/dn/41L05/hyUXWUNlL9/K0JTNINEzJPgmkEc9tZGxk/img.png?width=908&amp;amp;height=472&amp;amp;face=0_0_908_472,https://scrap.kakaocdn.net/dn/eatxw0/hyUXSEQtDC/hjzW307QW1o72X6msHwhxK/img.png?width=744&amp;amp;height=344&amp;amp;face=0_0_744_344&quot; data-og-url=&quot;https://developer.android.com/codelabs/jetpack-compose-basics?hl=ko&quot; data-og-source-url=&quot;https://developer.android.com/codelabs/jetpack-compose-basics#0&quot; data-og-host=&quot;developer.android.com&quot; data-og-description=&quot;이 Codelab에서는 Compose의 기본사항을 알아봅니다.&quot; data-og-title=&quot;Jetpack Compose 기초 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.android.com/codelabs/jetpack-compose-basics#0&quot; data-source-url=&quot;https://developer.android.com/codelabs/jetpack-compose-basics#0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gYfun/hyUTE9lzFt/JTFeUCzHBci9HVSoMUr5X1/img.png?width=2024&amp;amp;height=1582&amp;amp;face=0_0_2024_1582,https://scrap.kakaocdn.net/dn/41L05/hyUXWUNlL9/K0JTNINEzJPgmkEc9tZGxk/img.png?width=908&amp;amp;height=472&amp;amp;face=0_0_908_472,https://scrap.kakaocdn.net/dn/eatxw0/hyUXSEQtDC/hjzW307QW1o72X6msHwhxK/img.png?width=744&amp;amp;height=344&amp;amp;face=0_0_744_344');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Jetpack Compose 기초 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;이 Codelab에서는 Compose의 기본사항을 알아봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Stateful Composable과 Stateless&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Composable&lt;/b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Composable 함수는 Stateful&amp;nbsp;Composable과&amp;nbsp;Stateless&amp;nbsp;Composable로 분류된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Stateful Composable은 내부적&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Stateful은 앱 실행 중 변경할 수 있는 모든 값(텍스트 필드 문자열, 체크박스 상태 등)으로 정의된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;Stateful Composable&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704250604517&quot; class=&quot;reasonml&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Composable
fun Counter() {
    val count = remember { mutableStateOf(0) }

    Button(onClick = { count.value++ }) {
        Text(&quot;Clicked ${count.value} times&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Stateful Composable은 자체적으로 하나 이상의 상태를 관리하는 컴포저블 함수이다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하나의 컴포저블 함수는 해당 컴포저블 함수 또는 컴포저블 함수가 호출한 컴포저블의 형태나 동작을 정의하는 상탯값을 저장할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;상탯값을 저장하려면 remember 키쿼드를 이용하고 mutableStateOf 함수를 호출한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;UI의 동적인 부분을 반영하고 자신의 상태에 대한 전체적인 제어권을 가지고 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;상태가 내부적으로 캡슐화되어 있어 상태 관리 로직과 UI 렌더링이 같은 곳에 위치한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #7e98b1;&quot;&gt;Stateless&amp;nbsp;Composable&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704250598309&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;@Composable
fun Greeting(name: String) {
    Text(text = &quot;Hello, $name!&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;정의:&amp;nbsp;Stateless&amp;nbsp;Composable은&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;UI를&amp;nbsp;렌더링합니다.&amp;nbsp;특징:&amp;nbsp;재사용성:&amp;nbsp;상태가&amp;nbsp;외부에서&amp;nbsp;관리되기&amp;nbsp;때문에,&amp;nbsp;Stateless&amp;nbsp;Composable은&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;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Annotation&lt;/h2&gt;
&lt;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Annotation&lt;/h2&gt;</description>
      <category>Android/Jetpack Compose</category>
      <author>앱의노예</author>
      <guid isPermaLink="true">https://cjh94.tistory.com/139</guid>
      <comments>https://cjh94.tistory.com/139#entry139comment</comments>
      <pubDate>Wed, 3 Jan 2024 20:27:59 +0900</pubDate>
    </item>
    <item>
      <title>[일본 생활] 일본에서 혼인 신고하기 (번역본 첨부)</title>
      <link>https://cjh94.tistory.com/137</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 일본에 혼인 신고 (일본)&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1704106029141&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 기본증명서 (상세) + 번역본
2. 혼인관계증명서 (상세) + 번역본
3. 재류카드

아래는 지역에 따라 필요할 수도 있음
가족관계증명서, 여권, 도장&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;1,2,3만 필요했지만 인터넷에 여러 가지 글을 본 결과 조금씩 차이가 있었다&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;후쿠오카 이외의 지역에서는 요구하는 곳도 있는 것 같고&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;작성할 때 혼인 보증인 2명이 필요하며 혼인 신고일은 서류가 통과한 날이기 때문에 원하는 날이 있으면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그전에 한번 문의를 해서 확실하게 준비하는 것이 좋을 거 같다&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 한국에 혼인 신고 (일본)&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;pre id=&quot;code_1704106495616&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;1. 수리증명서 + 번역본
2. 혼인신고서, 가족관계증명서, 혼인관계증명서 (영사관에서 받을 수 있음)
3. 한국인, 일본인 여권 사본
4. 도장&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국인은 해외에서 결혼 후에 3개월 이내에 국내에 신고하지 않으면 과태료가 발생한다고 한다&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/xYM30/btsC54jeGX4/9zlwDLibxwTVMj5LsNkOJ0/%EA%B0%80%EC%A1%B1%EA%B4%80%EA%B3%84%EC%A6%9D%EB%AA%85%EC%84%9C%28%E5%AE%B6%E6%97%8F%E9%96%A2%E4%BF%82%E8%A8%BC%E6%98%8E%E6%9B%B8%29.docx?attach=1&amp;amp;knm=tfile.docx&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;가족관계증명서(家族関係証明書).docx&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>일본생활/취업, 생활</category>
      <author>앱의노예</author>
      <guid isPermaLink="true">https://cjh94.tistory.com/137</guid>
      <comments>https://cjh94.tistory.com/137#entry137comment</comments>
      <pubDate>Tue, 2 Jan 2024 21:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[Android] mutableState</title>
      <link>https://cjh94.tistory.com/136</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. mutableState란?&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1704104505657&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var sLiderPosition by remember {
    mutableStateOf(20f)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MutableState는 상태 관리를 위한 핵심 개념 중 하나이다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;상태 관리는 UI의 데이터가 시간에 따라 어떻게 변하는지, 그리고 이 데이터 변화가 UI에 어떻게 반영되는지를 처리하는 과정입니다. Compose는 리액티브 프로그래밍 모델을 사용하여, 데이터의 상태가 변경될 때 UI를 자동으로 업데이트합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/codelabs/jetpack-compose-basics#0&quot;&gt;https://developer.android.com/codelabs/jetpack-compose-basics#0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1704104505660&quot; style=&quot;color: #333333; text-align: start;&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 기초 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;이 Codelab에서는 Compose의 기본사항을 알아봅니다.&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/codelabs/jetpack-compose-basics#0&quot; data-og-url=&quot;https://developer.android.com/codelabs/jetpack-compose-basics?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gYfun/hyUTE9lzFt/JTFeUCzHBci9HVSoMUr5X1/img.png?width=2024&amp;amp;height=1582&amp;amp;face=0_0_2024_1582,https://scrap.kakaocdn.net/dn/41L05/hyUXWUNlL9/K0JTNINEzJPgmkEc9tZGxk/img.png?width=908&amp;amp;height=472&amp;amp;face=0_0_908_472,https://scrap.kakaocdn.net/dn/eatxw0/hyUXSEQtDC/hjzW307QW1o72X6msHwhxK/img.png?width=744&amp;amp;height=344&amp;amp;face=0_0_744_344&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://developer.android.com/codelabs/jetpack-compose-basics#0&quot; data-source-url=&quot;https://developer.android.com/codelabs/jetpack-compose-basics#0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gYfun/hyUTE9lzFt/JTFeUCzHBci9HVSoMUr5X1/img.png?width=2024&amp;amp;height=1582&amp;amp;face=0_0_2024_1582,https://scrap.kakaocdn.net/dn/41L05/hyUXWUNlL9/K0JTNINEzJPgmkEc9tZGxk/img.png?width=908&amp;amp;height=472&amp;amp;face=0_0_908_472,https://scrap.kakaocdn.net/dn/eatxw0/hyUXSEQtDC/hjzW307QW1o72X6msHwhxK/img.png?width=744&amp;amp;height=344&amp;amp;face=0_0_744_344');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Jetpack Compose 기초 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;이 Codelab에서는 Compose의 기본사항을 알아봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Stateful Composable과 Stateless&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Composable&lt;/b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Composable 함수는 Stateful&amp;nbsp;Composable과&amp;nbsp;Stateless&amp;nbsp;Composable로 분류된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Stateful은 앱 실행 중 변경할 수 있는 모든 값(텍스트 필드 문자열, 체크박스 상태 등)으로 정의된다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Annotation&lt;/h2&gt;
&lt;h2 style=&quot;color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Annotation&lt;/h2&gt;</description>
      <category>Android/Jetpack Compose</category>
      <author>앱의노예</author>
      <guid isPermaLink="true">https://cjh94.tistory.com/136</guid>
      <comments>https://cjh94.tistory.com/136#entry136comment</comments>
      <pubDate>Mon, 1 Jan 2024 19:22:33 +0900</pubDate>
    </item>
  </channel>
</rss>