뷰 바인딩 xml에 있는 뷰들을 코드 상에서 바로 가져올 수 있는 기능이다. 코드가 지저분해질 수 있는 큰 원인인 findViewById()를 제거할 수 있다. 또한 findViewById()를 사용하면 관리해야 할 변수가 많아지고, 다른 액티비티의 xml을 가져오면 null값이 대입되어 NullPointerException이 발생할 위험이 있다. 뷰 바인딩을 사용하면 이러한 단점이 해결된다! 변수를 생성할 필요없이 xml의 id를 바로 사용할 수 있기 때문이다. 또한 다른 액티비티의 xml을 가져오면 컴파일 에러가 나기 때문에 비교적 안전하다. 그럼 뷰 바인딩을 적용하는 방법을 알아보자. 1. build.gradle (Module) android { ... viewBinding { enabled = t..
1. 기존에 있던 툴바를 사용하지 않기. 경로 -> /res/values/themes/themes.xml 2. res/menu/menu_toolbar.xml res 폴더 안에 menu 폴더 생성 후 menu_toolbar.xml 생성. (폴더명, 파일명 무관) 안에 자신이 툴바 안에 생성하고 싶은 항목들을 추가한다. id -> 다른 곳에서 항목을 참조할 때, 항목을 구분할 수 있는 아이디 (항목 이름) title -> 항목의 제목 icon -> 항목 아이콘. drawable 폴더 안에 아이콘을 넣어서 참조한다. app:showAsAction="always" : 항상 보이게 표시 app:showAsAction="ifRoom" : 액션바에 공간이 있을 경우에만 표시 3. toolbar layout 생성 (l..
앱 시작 상태 cold start 앱이 처음부터 시작. 앱의 프로세스를 만들지 않는다. 기기가 부팅되거나 시스템에서 앱이 종료되고 난 후 앱이 처음으로 시작되는 경우 등에서 발생한다. 다른 시작 상태보다 더 많은 작업을 실행해야 하므로 시작 시간이 길어질 수 있다. warm start 프로세스가 존재하지만 메모리에 올라오지 않은 경우. 사용자가 앱을 종료한 다음 다시 시작하거나, 시스템이 메모리에서 앱을 제거한 다음 사용자가 앱을 다시 시작하는 경우 등에서 발생한다. hot start 프로세스가 존재하고 메모리에 올라온 경우. 백그라운드에서 실행되고 있다가, 포그라운드로 올라온다. 스플래시 작동 방식 사용자가 스플래시를 직접 지정해주는 경우에는, 메모리에 이미 앱이 존재하는 hot start이어도 스플래..
동시성 통신 채널 fun main() { runBlocking { val streamSize = 5 val channel = Channel(3) launch { for (n in 1..streamSize) { delay(Random.nextLong(100)) println("Sending: $n") channel.send(n) } } launch { for (i in 1..streamSize) { delay(Random.nextLong(100)) val n = channel.receive() println("Receiving: $n") } } } } Thread-safe하게 임의의 데이터 스트림을 코루틴 사이에 공유할 수 있게 해준다. 채널의 용량을 지정하는 정수값을 인자로 받는 Channel() 함수를..
코루틴 흐름 제어 Job 동시성 작업의 생명 주기를 표현하는 객체 작업 상태를 추적하고, 작업을 취소할 수 있다. 잡은 생성되자마자 시작되므로 Active 상태가 된다. isActive, isCompleted, isCancelled 프로퍼티를 통해 상태를 추적할 수 있다. Cancelled, Completed 상태일 때 isComplete의 프로퍼티 값이 모두 true다. isCancelled을 통해 두 상태를 구분한다. launch(), async()에서 잡의 초기 상태를 지정할 수 있다. CoroutineStart.DEFAULT: 잡을 즉시 시작한다. (default) CoroutineStart.LAZY: 잡을 자동으로 시작하지 않는다. New 상태에서 시작을 기다린다. start() fun main..
코루틴 suspend 함수 suspend fun sum(val1: Int, val2: Int): Int { delay(1000) return val1 + val2 } 함수 실행을 중단한 다음, 나중에 필요할 때 다시 실행을 계속 진행할 수 있는 함수 함수에 suspend라는 키워드를 붙인다. 스레드를 block 시키지 않고 일시 중단하며, 그동안 스레드가 다른 작업을 수행할 수 있다. sum(val1: Int, val2: Int, val3: Continuation) 컴파일 시 마지막 파라미터로 Continuation 객체를 추가한다. Continuation을 통해 중단(suspend) 시점의 실행 정보들을 저장하고, 실행이 다시 재개(resume)되면 저장한 정보를 기반으로 실행을 다시 이어나간다. su..
위임 프로퍼티 1. 표준 위임 lazy() LazyThreadSafeyMode 이넘 상수 값 SYNCHRONIZED: 항상 하나의 스레드에 의해서만 초기화되도록 보장한다. (default) PUBLICATION: 초기화 함수가 여러번 호출될 수 있지만 가장 처음 도착하는 결과가 프로퍼티 값이 된다. NONE: 프로퍼티 접근을 동기화하지 않는다. (가장 빠르며 한 스레드에서만 불린다고 확신할 수 있는 경우) val value1 by lazy { println("Initializing value") 123 } val value2 by lazy(LazyThreadSafeyMode.PUBLICATION) { println("Initializing value") 123 } value1은 default로 SYNCH..
연산자 오버로딩 - +, -, *, / 등 코틀린 내장 연산자에 대해 새로운 의미를 부여할 수 있게 해준다. operator fun String.times(n: Int) = repeat(n) fun main() { println("abc" * 3) // abcabcabc println("abc".times(3)) // abcabcabc } 연산자를 구현하기 위해 함수 앞에 operator 키워드를 붙인다. 1. 단항 연산 enum class Color { BLACK, WHITE, BLUE, YELLOW; operator fun not() = when(this) { BLACK -> WHITE WHITE -> BLACK BLUE -> YELLOW YELLOW -> BLUE } } fun main() { pr..