[24.06.20] TIL - 015

0. 오늘은 무엇을 했는가

오늘 아침에는 더워서 일찍 깼습니다.

다행히 크게 졸리지는 않았습니다.

오늘은 코드 카타를 풀고, 개인 과제 Lv. 2를 진행했습니다.

내일은 아마 Lv.3와 추가적인 옵션까지 진행해서, 끝낼 것 같습니다.

그리고, 오늘은 밍글 데이라는 걸 했습니다.

다 같이 친해지기 위해 약 2시간 정도를 놀았습니다.

그리고는 어제 공부했던, 위임, 컴포저블과 상태를 다시 공부했습니다.

1. 코드 카타

[ 09:00 ~ 10:00, 11:00 ~ 12:00 ]

오늘의 코드 카타는 행렬의 곱셈 이었습니다.

문제를 처음 보고 '그냥 곱하면 되는 거 아닌가?' 생각했는데, 그렇게 쉬운 문제일리 없죠.

아무리 해도, 곱하는 방식을 몰라, 행렬의 곱셈에 대해 찾아보기 시작했습니다.

행렬 곱셈 관련 설명

결론부터 말하자면, 행렬은 행렬 A의 열의 개수와 B의 행의 개수가 같을 때만 곱할 수 있습니다.

예를 들어, 곱 AB[m][n] = A[m][k] * B[k][n] 가 됩니다.

그래서, 해당 식을 그대로 돌려줬습니다.

class Solution {
    fun solution(arr1: Array<IntArray>, arr2: Array<IntArray>): Array<IntArray> {
        var answer = Array<IntArray>(arr1.size) { IntArray(arr2[0].size) { 0 } }
        for(i in 0 until arr1.size) {
            for(j in 0 until arr2[0].size) {
                for(k in 0 until arr2.size) {
                    answer[i][j] += arr1[i][k] * arr2[k][j]
                }
            }
        }
        return answer
    }
}

3중 for문과 해당 식으로 이루어져 있습니다.

사실 이전에 약간의 고난이 있었습니다.

var answer = arr1

이런 식으로, 사이즈 넣는 걸 대신해서 했는데, 물론, 사이즈 자체도 틀리긴 했지만, 위처럼 사용하면 문제가 있습니다.

그건 바로, 배열을 넣으면 그걸 참조해서 사용한다는 것입니다.

더군다나, arr1은 다차원배열이라 참조의 참조를 진행한다는 부분이 문제입니다.

이 부분은 실패한 것도 있어서 따로 적지는 않겠습니다.

하지만, 만약 배열의 값만 가져오려면, copyOf()를 사용해야 한다는 걸 기억해야 하겠습니다.

2. 개인 과제 - Lv. 2

[ 12:00 ~ 13:00 ]

오늘 개인 과제는 회원가입 창이었습니다.

또 너무 크네요. 어쨌든 이렇게 회원가입을 만들었습니다.

기능 자체는 아직까지는 별 내용 없습니다.

3. 밍글 데이

[ 15:00 ~ 17:00 ]

'밍글 데이? 이게 뭐지?' 이 생각으로 찾아보니까, 내일배움캠프 참가하시는 분들이랑 친해지는 행사인 것 같더라고요.

되게 재밌었습니다. 다른 분들이랑 직접 얘기를 하진 않았지만, 다 같이 게임하고, 서로의 정보로 O/X 퀴즈도 했습니다.

다양한 분들과 내적 친밀감이 생겼습니다...

사진을 찍어뒀으면 좋았을 텐데 그건 아쉽네요.

다음에도 한 번 더 진행했으면 좋겠습니다!

4. 안드로이드, 코틀린 공부

[ 17:00 ~ 18:00, 19:00 ~ 20:00 ]

먼저, 코틀린에서 위임과 프로퍼티 위임에 대해 공부했습니다.

위임은 이전 TIL에서도 말했듯, 자신이 할 일을 다른 사람에게 대신 시키는 것입니다.

그래서 합성과 비슷한 부분도 있고, 상속과 비슷한 부분도 있습니다.

기존의 위임은 합성처럼 직접 넣어두고, 인터페이스를 구현하고, override해서 그 객체의 함수를 사용합니다.

대신 코틀린에서는 by를 사용합니다. 단순히, by로 위임하고자 하는 객체만 지정해주면, 위임할 수 있습니다.

위임은 프로퍼티에도 적용할 수 있습니다.

val property by 위임객체

이렇게 만들면, 해당 위임 객체에는 getValue(), setValue() 연산자 오버로딩된 함수가 들어가야 합니다.

다음과 같이 추가해야 합니다.

operator fun getValue(thisRef: T, property: KProperty<*>): V
operator fun setValue(thisRef: T, property: KProperty<*>, value: V)

getValue는 프로퍼티 타입과 같은 타입의 값을 반환하고, setValue는 프로퍼티 값을 설정합니다.

thisRef에는 위임 객체가 들어갑니다.

property는 KProperty<*> 타입인데, 이 부분은 나중에 공부해보겠습니다.

함수나 파일에서 사용할 때는 thisRef가 Any? 타입으로 지정할 수 있습니다.

4-1. 컴포저블의 상태

컴포저블에서 상태는 일반 변수와 2가지가 다릅니다.

첫째로, 상태 변수에 할당된 값은 기억됩니다. 그래서, 컴포저블 함수를 호출할 때마다 지난 상태값을 기억합니다.

둘째로, 상태 변수 변경은 컴포저블 함수 계층 트리 전체에 영향을 미칩니다.

이렇듯, 컴포저블에서는 상태를 사용해야 제대로 사용할 수 있습니다.

이런 상태가 있는 컴포저블이 자식 컴포저블에 상태를 전달해 사용하고 싶다면, 직접 전달해줘서는 안 됩니다.

이벤트 핸들러와 함께 전달해, 상태를 직접 변경하는 걸 방지해줘야 합니다.

이를 단방향 데이터 흐름을 유지한다고 합니다.

상위 컴포저블은 하위 컴포저블로 상태와 이벤트 핸들러를 제공하고,

하위 컴포저블은 상위 컴포저블의 이벤트 핸들러를 호출해 값을 변경하는 걸 알립니다.

또한, 컴포저블의 상태는 상태 호이스팅돼야 합니다.

상태 호이스팅은 자식 컴포저블의 상태를 부모 컴포저블로 옮기는 것을 뜻합니다.

자식 컴포저블에서 상태를 다루게 되면, 재사용성이 떨어지고, 유연하지 못합니다.

그러므로, 부모 컴포저블에서 이를 다루고, 상태와 이벤트 핸들러를 제공해, 재사용성과 유연성을 높여줘야 합니다.

5. 끝

오늘은 적당히 쉬워가는 날이었던 것 같습니다.

다른 분들과 내적 친밀감을 쌓을 수 있어, 좋았습니다.

내일은 아마 Lv. 3과 나머지 옵션 부분을 구현하고,

안드로이드 젯팩 컴포즈, 코틀린을 공부할 듯싶습니다.

끝.

profile
여기는 공부 기록용 블로그

0개의 댓글