---
# System prepended metadata

title: Compose Internals(6주차)
tags: [Compose, Android]

---

## 지난주 궁금사항
- Kotlin에서 원시타입(primitive type)이란???
    - 원시타입은 `스택메모리` 영역에 실제값이 존재하고 참조타입은 `힙메모리` 영역에 값이 존재한다 `스택메모리`영역에는 참조값만 존재함
    - 참조타입은 Nullable 가능, Collection,Generic에서 사용가능
    - 코틀린은 Java와 달리 Int, Integer 처럼 primitive type과 wrapper type을 구분하지 않는다.
    - 컴파일시 자동으로 wrapper, primitive 로 변환되어 사용된다.
    - 디컴파일 테스트 예시
    ![](https://hackmd.io/_uploads/ryK0hvqFn.png)
    
- @Stable 에서 Stable 정의를 다시 생각
    - 값이 변경된경우 컴포저블에게 변경상태 전파(리컴포지션 유도)
    - 같은 값을 가진 두 인스턴스가 equals로 비교될때 항상 같은 결과를 반환
    - 해당클래스의 필드들도 모두 Stable한 상태


## Enabling live literals
`liveLiteral` 이란
컴파일러의 전달할수있는 플래그중 하나로 Compose 개발시 컴파일러가 코드의 변경사항을 실시간으로 프리뷰에 반영하는것을 말함 이기능을 수행하기 위해서 컴파일러가 자동으로 코드를 생성함으로 릴리즈 빌드시에 활성화 하면 성능의 좋지않음 (기본적으로 릴리스빌드시에는 Disable 됨)

아래 처럼 전반적으로 비활성화하는법도 있고
```kotlin=
kotlinOptions {
        jvmTarget = '1.8'
        freeCompilerArgs = freeCompilerArgs + [
                "-P",
                "plugin:androidx.compose.compiler.plugins.kotlin:liveLiteralsEnabled=false",
        ]
    }
```
파일 상위에 `@file:NoLiveLiteral` 를 작성하여 비활성화하는법도 있습니다.

## Compose lambda memoization
Composable 함수에서 람다 실행을 최적화 하는 방식에대해 설명합니다.
Composable 함수에서 람다는 Composable람다와 Non-Composable람다로 구분됩니다.

### Non-Composable 람다
예시로는 Android개발에 많이 사용되는 `onClick: ()->Unit` 가 있다.

이때 람다가 람다 외부 값을 캡쳐하는 경우 컴파일러가 캡쳐한 값을 보존하기위해서 `remember` 콜로 랩핑하여 슬롯테이블에 저장

람다 캡쳐값이 없는 경우 Kotlin의 기본 최적화 방법으로 Singleton 으로 변환되어 슬롯테이블에 저장

아래는 두가지 람다 예시코드

```kotlin=
 @Composable
fun NonComposableLamda() {
    val captureVal = "CAPTURE VALUE"
    //값을 캡쳐하는 람다 -> remember로 래핑됨
    val captureLamda: (String) -> Boolean = { s ->
        s != captureVal
    }
    //값을 캡쳐하지않는 람다 -> Singleton 으로 사용
    val nonCaptureLamda: (String) -> Boolean = { s ->
        s.isEmpty()
    }
    NamePlate(name = "captureLamda", captureLamda)
    NamePlate(name = "nonCaptureLamda", nonCaptureLamda)
}

@Composable
fun NamePlate(name: String, lamda: (String) -> Boolean) {
    //..//
    lamda(name)
}
```


* 슬롯테이블 : 컴포지션에 대한 정보들(예: 컴포지션동안 발생한 일, 사용된 인자, CompositionLocal, 호출된 다른 함수 등등)이 저장되는 공간 추후 책에 자세히 나올 예정

### Composable 람다
`composable factory function(컴포저블 팩토리함수)` 에 의해서 저장함 위와 마찬가지로 슬롯테이블에 저장됨
Composable 람다는 정규화된이름(?)에서 얻은 해시코드와 파일 내부 의 `expression start offset`(? 요건 그냥 람다의 라인정보???) 의 조합으로 얻은 키를
팩토리 함수에 넣어 저장함 아래의 꼴로 변환됨
```kotlin=
composableLambda($composer, $key, $shouldBeTracked, $arity, ...)

```

