목록전체 글 (99)
안드로이드 개발자 노트
읽기, 쓰기가 가능한 프로퍼티나 mutable 객체는 상태를 가집니다. 상태를 갖게 한다는 것은 변한다는 것이고, 변하는 요소를 관리하는 것은 어렵습니다. 프로그램을 이해하고 디버그하기 힘들어진다. 코드의 실행을 추론하기 어려워진다. 멀티스레드 프로그램일 경우 충돌이 발생할 수 있다. 테스트하기 어렵다. 정렬되어 있는 리스트의 경우 가변 요소를 추가한다면, 요소의 변경이 일어날 때마다 리스트 전체를 다시 정렬해야한다. 가변성을 제한할 수 있는 방법은 immutable 객체를 만들거나, 프로퍼티를 변경할 수 없게(read only) 막는 것이 가장 쉽습니다. 이 중에서 많이 사용되고 중요한 것들을 정리해 보면 다음과 같습니다. 읽기 전용 프로퍼티(val) 가변 컬렉션과 읽기 전용 컬렉션 구분하기(immut..
안녕하세요. 오늘은 KotlinConf'23 Global in Songdo에 대해 리뷰해보도록 하겠습니다. KotlinConf'23은 4월 12일 - 14일간 Jetbrains이 네덜란드에서 개최하는 코틀린 컨퍼런스로, Google Korea, Jetbrains, Mondrian AI, MoBeran의 지원을 받아 이번 송도에서 5월 13일. 오프라인으로 행사를 진행하게 되었다고 합니다. 컨퍼런스 비용은 일반티켓 20,000원이고, 학생티켓은 10,000원이었습니다. 위치는 인천 송도의 인천 스타트업 파크였으며, 인천대입구역 4번출구 도보 3분거리라 접근성이 좋습니다. Agenda 및 Time Table은 다음과 같이 이루어져 있었습니다. 특이하게 뒷풀이가 있습니다. 사전에 참석여부를 조사하며, 음주가 ..
안녕하세요. 이번 포스팅에서는 Android KTX에 대해서 알아보도록 하겠습니다. Android KTX는 Android Jetpack과 기타 Android 라이브러리에 포함된 Kotlin 확장 프로그램 세트입니다. KTX 확장 프로그램은 간결하고 직관적인 Kotlin을 Jetpack, Android 플랫폼, 기타 API에 제공합니다. 예를 들어 SharedPreferences로 작업할 때는, sharedPreferences .edit() .putBoolean("key", value) .apply() 위의 코드를 다음과 같이 간결하게 사용할 수 있게 해줍니다. sharedPreferences.edit(commit = true) { putBoolean("key", value) } Android KTX는 다..
안녕하세요. 이번 포스팅에서는 ViewModel에 대해서 알아보도록 하겠습니다. ViewModel 개념 ViewModel 은 비즈니스 로직 또는 화면 수준 상태(State) 홀더 클래스입니다. UI에 상태를 노출하고 관련 비즈니스 로직을 캡슐화합니다. 주요 이점은 상태를 캐시하여 구성 변경에도 이를 유지한다는 것입니다. 즉, 액티비티 간에 이동하거나 구성 변경(화면 회전 등)을 따를 때 UI가 데이터를 다시 가져올 필요가 없습니다. ViewModel의 이점 UI에 표시되는 데이터를 저장하는 일반 클래스를 사용하면 액티비티 또는 프래그먼트 사이를 이동할 때 문제가 될 수 있습니다. 예를 들어, 화면 회전이 이루어지게 될 때, Activity가 파괴(onDestroy)된 다음 다시 화면이 만들어지면서(onS..
안녕하세요. 이번 포스팅에서는 LiveData에 대해서 알아보도록 하겠습니다. LiveData의 개념 1. LiveData는 기본적으로 Observer Pattern을 활용하며, 말 그대로 실시간 데이터를 나타냅니다. 2. LiveData는 Observable한 데이터 홀더 클래스입니다. 3. 일반적인 Observable 클래스와 달리 LiveData는 수명 주기를 인식합니다. 즉, 액티비티, 프래그먼트, 서비스 등 다른 앱 구성요소의 수명 주기를 고려합니다. 4. 수명 주기 인식을 통해 LiveData는 활동 수명 주기 상태에 있는 앱 구성요소 Observer(관찰자)만 업데이트합니다. 5. Observer의 수명 주기가 STARTED 또는 RESUMED 상태이면 LiveData는 Observer를 활..
1. 코테스트 명세 1. 코테스트 시작하기 코테스트 io.kotest:kotest-runner-junit5-jvm:4.5.0 을 사용한다. 2. 명세 스타일 코테스트는 여러 명세 스타일을 지원한다. 프로젝트에서 여러 스타일을 섞어 쓰거나 AbstractSpec 클래스 또는 AbstractSpec 클래스의 하위 클래스 중 하나인 AbstractStringSpec과 같은 클래스를 구현함으로써 명세 스타일을 커스텀할 수 있다. 테스트 케이스를 정의하려면 명세 클래스 중 하나를 상속해야 한다. 그 후 클래스 생성자에 테스트를 추가하거나 상위 클래스 생성자에게 전달하는 람다 안에 테스트를 추가한다. 테스트 자체를 정의하는 방법은 스타일에 따라 달라지며, 대부분의 경우 DSL과 비슷한 API를 통해 테스트를 정의한..
1. 코루틴 1. 코루틴과 일시 중단 함수 코루틴 라이브러리의 기본 요소는 일시 중단 함수(suspend function) 이다. 이 함수는 원하는 지점에서 함수의 실행을 중단하거나 다시 실행을 계속 진행하게 할 수 있다. suspend fun foo() { println("Task started") delay(100) println("Task finished") } delay() 함수는 일시 중단 함수다. 이 함수는 현재 스레드를 블럭시키지 않고 자신을 호출한 함수를 일시 중단시키며 스레드를 다른 작업을 수행할 수 있게 풀어준다. 일시 중단 함수가 아닌 일반 함수에서는 사용할 수 없다. 동시성 코드의 동작을 제어할 때 공통적인 생명 주기와 문맥이 정해진 몇몇 작업이 정의된 구체적인 영역 안에서만 동시성..
1. 연산자 오버로딩 연산자 오버로딩은 +, -, *, / 등 코틀린 내장 연산자에 대해 새로운 의미를 부여할 수 있게 해주는 언어 기능이다. 1. 단항 연산 단항 연산은 피연산자가 한 개인 연산으로 오버로딩할 수 있는 단항 연산자로는 전위+나 -,! 연산자가 있다. 컴파일러는 이런 연산자를 적절한 함수 호출로 펼쳐준다. 식 의미 +e e.unaryPlus() -e e.unaryMinus() !e e.not() 예를 들어 색을 표현하는 이넘 클래스가 있다고 생각해보면, enum class Color { BLACK, RED, GREEN, BLUE, YELLOW, CYAN, MAGENTA, WHITE; operator fun not() = when (this) { BLACK -> WHITE RED -> CY..
1. 애너테이션 애너테이션은 커스텀 메타데이터를 정의하고 이 메타데이터를 소스코드 상의 선언, 식, 전체 파일 등의 요소에 엮을 수 있는 수단이다. 1. 애너테이션 클래스 정의하고 사용하기 애너테이션은 선언의 앞쪽 변경자 위치에 @이 붙은 애너테이션의 이름을 놓는다. import org.junit.Test class MyTestCase { @Test fun testOnePlusOne() { assert(1 + 1 == 2) } } 코틀린은 애너테이션을 식에 적용할 수 있으며, 애너테이션을 여럿 붙이고 싶다면 각괄호([ ])로 애너테이션들을 감쌀 수 있다. val s = @Suppress("UNCHECKED_CAST") object as List // 식에 적용 @[Synchronized Strictfp]..
1. 타입 파라미터 1. 제네릭 선언 선언을 사용할 때는 파라미터 실제 타입을 지정해줘야한다. val map = HashMap() val list = arrayListOf() 인자 타입을 추론할 수 있으면 생략할 수 있다. val map: Map = HashMap() // 타입을 명시했기 때문에 추론 가능 val list = arrayListOf("abc", "def") // 전달된 인자 타입으로 추론 가능 다음은 주어진 타입의 값을 저장할 수 있는 트리를 표현하는 클래스이다. class TreeNode(val data: T) { private val _children = arrayListOf() var parent: TreeNode? = null val children: List get() = _chi..