상태관리
Remember & MutableStateOf

remember는 원래 컴포서블이 재구성되면 변수들은 초기화 되는데 그 값이 초기화되지 않게 유지시키고 mutableStateOf는 값이 변경될때마다 변화된것이 화면에 적용되개끔하는 상태 객체를 만든다 따라서 코틀린에서 이 두개를 같이 사용하여 상태관리를 해줄수있다 또한 remember를 등호와 같이 쓰면 val키워드로 불변객체에 넣어 value를 바꿔 쓰는 느낌이라면 by키워드로 사용하게 되면 객체에 직접접근하여 변화시키므로 var 키워드로 선언해야한다
remember: 컴포저블이 재구성되더라도 값을 기억하여 유지시킵니다.mutableStateOf: 값이 변경될 때마다 Compose가 UI를 자동으로 다시 그리도록 하는 상태 객체를 만듭니다.by키워드를 사용하면mutableStateOf의 값을 직접적으로 다룰 수 있게 됩니다.
코틀린에서 주의할점(이게 맞나?)

보면 함수에 인자가 하나도 안적혀있는데, 전부 함수 스코프 외부의 변수를 끌어다 사용하는것을 알수 있다. 지금까지 불변객체, 순수함수 이야기를 너무 많이 들어서 이게 무조건 정답이다. 하는 생각을 가지고 있었는데 udemy에서 이렇게 함수를 작성해서 실행시키는것을 보니 그것만이 정답은 아닐거같다는 생각이 든다. 하지만 누가봐도 가독성이 떨어지는 방법이기 때문에, 그냥 함수 인자를 넣는 방향으로 코드를 작성해도 문제가 없을것 같다
좌우 정렬

코틀린에서는 버튼만 중앙 정렬하게 하고 싶으면, 버튼 속성만 중앙에 오게끔해서 옮길수 있다.
원래 HTML이나 다른 프레임워크에서는 Column자체를 중앙 정렬시키는 식으로 큰 틀의 박스에 정렬 속성을 넣는 식인데 코틀린은 두 방법다 유효한듯 하다

이 방법 대로 해도 비슷하게 출력되지만 이 경우에는 Column 자체가 중앙에 정렬되게 만든것이다
람다함수
코틀린에서 느낀 가장큰 혼동은 람다함수를 사용하는 방법이다
분명 함수의 인자로 선언할때는 다른 언어(자바스크립트, 자바) 와 비슷하게 사용하면서 정작 람다함수 구현부는 다르게 사용했다
fun ShoppingItemEditor(
item: ShoppingItem,
onEditComplete: (String, Int) -> Unit,
)함수에서 파라미터로 사용될때는 위와 같이 익숙한 방식으로 시그니쳐를 정해줄수 있다
참고) 코틀린에서 Unit은 Void랑 비슷한 개념임 (리턴 타입이 없다는뜻)
하지만 구현할때에는

위와 같이
title: 람다표현식
```kotlin
{
변수1, 변수2 ->
// 구현
}
```
중괄호 내부에서 파라미터를 넣고 -> 이후 부분에서 구현을 한다
너무 어색한 표현이었다또한 find함수 또한 람다함수를 인자로 가지는 함수인데 find({it.name item.name}) 으로 소괄호 내부에 적을수도 있지만, find {it.name item.name} 과 같이 함수이름을 적고 오른편에 바로 람다함수를 적는것이 더 일반적이라고 한다
// 일반적인 람다식 전달
listOf(1, 2, 3).map({ it * 2 }) // 출력: [2, 4, 6]
// 람다식 축약 문법을 사용한 경우
listOf(1, 2, 3).map { it * 2 } // 출력: [2, 4, 6]
// 여러 매개변수를 가진 함수
fun example(a: Int, b: Int, callback: (Int, Int) -> Unit) {
callback(a, b)
}
// 람다식을 소괄호 내부에 작성
example(1, 2, { x, y -> println("x: $x, y: $y") })
// 람다식 축약 문법을 사용하여 소괄호 외부에 작성
example(1, 2) { x, y -> println("x: $x, y: $y") }
위와 같이 람다식은 소괄호 외부에 작성할수 있다 람다식에 매개변수를 사용하지 않으면 ({it.name == item.name}처럼..) 자동으로 it이 매개변수로 할당되어 사용된다고 한다
상태관리 알아낸거
remember 를 통해 상태관리를 하는 것까지는 알고있었는데 사소한것 하나라도 변하면 Composable함수들을 재호출한다는 것을 처음 알았다.
따라서 LIST의 어느 한인덱스의 property가 조금이라도 변한다면 상태변화를 감지하고 컴포저블 함수를 재호출한다

위사진에서 초기 상태는 모두 isEditing이 false인 상태인데 클릭을 함으로써 하나의 요소가 true가 되어 Composable함수를 모두 재호출하여 하나의 요소가 if문을 통해 ShoppingListEditor함수를 호출하게 된다
Remember, MutableStateOf
내가 조금씩 잘못알고 있는게 있었는데 Remeber는 오로지 변수가 함수를 재호출하더라도 화면상에서 초기화되지 않게 도와주는 함수이고 MutableStateOf 는 오로지 변수의 변화를 감지하고 Composable을 재호출하여 UI를 재구성하는 함수이다.
그러므로 instance 즉 객체와 같이 메모리에 기록되는 것들은 따로 remember를 사용해줄 필요없다
