전체 글

전체 글

    [Android] Serializable과 Parcelable

    Serializable? Serializable은 표준 Java 인터페이스로 이 인터페이스를 구현한 클래스의 객체는 한 액티비티에서 다른 액티비티로 이동할 수 있다. Serializable은 해당 클래스가 직렬화 대상이라고 알려주기만 할뿐 어떤 메소드도 가지지 않는 단순한 '마커 인터페이스' 이기 때문에 사용 자들이 쉽게 접근할 수 있다. 하지만 그만큼 시스템 비용이 비싸다. Serializable은 내부에서 Reflection이 일어나며 직렬화를 처리하는데, 이 Reflection은 프로세스 동작 중에 사용되며 처리 과정 중에 많 은 추가 객체를 생성한다. 생성된 많은 추가 객체들은 가비지 컬렉터를 낭비시키고 이로 인해 성능 저하를 일으킨다. class Person : Serializable{ priv..

    [Kotlin] 리스트를 통한 명령형 방식과 함수형 방식 비교

    코틀린의 리스트는 명령형 방식과 함수형 방식을 모두 제공한다. 함수형 방식으로 작성하는 경우 고차 함수를 체이닝 하면 명령형 프로그래밍에서 for와 if문을 사용해서 작성하는 로직을 간결하게 표현할 수 있다. 예를 들면 입력 리스트의 값을 제곱하여 10보다 작은 첫 번째 값을 리턴하는 함수를 명령형으로 작성해보자. fun imperativeWay(): Int { val bigIntList = (1..10000000).toList() var firstSquare = 0 for (value in bigIntList) { val doubleValue = value * value if (doubleValue < 10) { firstSquare = doubleValue break } } return firstSq..

    [Kotlin] 커링(Currying) 함수

    여러 개의 매개 변수를 받는 함수를 분리하여, 단일 매개 변수만 받는 부분 적용 함수의 체인으로 만드는 방법이다. 함수형 프로그래밍에서 커링을 사용하는 이유는 다양한 재사용과 마지막 매개변수가 입력될 때까지 함수의 실행 타이밍을 조절할 수 있다. 아래 코드는 코틀린의 확장함수를 사용하여 multiThree 함수와 같이 매개변수가 3개인 커링 함수를 일반화 하는 과정이다. curried() 확장 함수를 사용하여 매개변수가 3개인 함수를 커링 함수로 변환할 수 있다. 반대로 커링 함수를 일반 함수로 변환하는 unCurried() 함수도 구현했다. class Currying { fun ((P1, P2, P3) -> R).curried(): (P1) -> (P2) -> (P3) -> R = { p1: P1 ->..

    [Kotlin] Tailrec

    Tailrec? Tailrec은 언어 차원에서 제공하는 기능으로 해당 키워드가 명시된 함수가 꼬리 재귀의 조건에 부합하지 않으면 IDE에서 경고 메시지를 주고, 컴파일러 최적화가 발생하지 않는다. 꼬리 재귀란? 꼬리 재귀란 어떤 함수가 직간접적으로 자기 자신을 호출하면서도 그 호출이 마지막 연산인 경우를 뜻한다. 그리고 이 마지막 연산인 호출을 '꼬리 호출'이라 한다. 여기서 주의할 점은 마지막 호출에서 재귀 함수만 호출되어야 한다는 것이다. 일반적으로 재귀 호출이 반복되면서 깊이가 깊어지면 스택 오버플로우가 발생할 수 있는데, 꼬리 호출일 때는 스택 오버플로우가 발생하지 않는다. 왜냐하면 컴파일러가 해당 문제를 일으키는 스택 프레임을 재사용하기 때문이다. 이 경우 재귀를 사용했지만, 반복문을 사용한 것..

    [Kotlin] Sealed Class

    Sealed Class의 배경 컴파일러는 여러 개의 자식 Class들이 하나의 부모 Class를 상속받을 때 부모 Class와 자식 Class들의 연관성을 알지 못한다. 예를 들어 자동차의 행위에 대해 String을 리턴하는 코드를 작성한다고 생각해보자. 행위에 대한 3가지로 가는 상태(Drive), 멈추는 상태(Stop), 대기 상태(Stay)가 있다고 해보자. abstract class Vehicle object Go: Vehicle() object Stop: Vehicle() object Stay: Vehicle() 그리고 각 행위에 알맞은 String값을 리턴한다고 가정했을 때 아래와 같은 코드를 만들게 된다. fun getAction(action: Vehicle): String { return ..

    [Android] Mac M1 Room 라이브러리 에러

    M1을 탑재한 맥북프로가 출시되고 나서 안드로이드의 Room 라이브러리로 인해 프로젝트가 빌드되지 않는 현상이 발생했다. 다행히 구글에서 해당 버그를 수정한 버전이 있어 stable 버전은 아니지만(현재는 Stable함) 해당 에러를 고칠 수 있었다. def room_version = "2.4.0-alpha03" 2.4.0-alpha03 버전 이상을 사용하면 에러를 해결할 수 있다. https://developer.android.com/jetpack/androidx/releases/room