[KOTLIN] 변수의 스코프 최소화 (이펙티브코틀린)
·
KOTLIN
이펙티브 코틀린 변수의 스코프 최소화 최대한 좁은 스코프를 갖게 변수를 사용하는 것이 좋음 반복문 내부에서만 변수가 사용된다면 변수를 반복문 내부에 작성하는 것이 좋음 스코프를 최소화하는 것이 좋은 이유 디버깅하기 수월 mutable 프로퍼티는 좁은 스코프에 걸쳐 있을수록 디버깅이 용이함 변수의 범위가 넓으면, 다른 개발자에 의해서 변수가 잘못 사용될 수 있음 변수는 읽기 전용 또는 읽고 쓰기 전용 여부와 상관 없이, 변수를 정의할 때 초기화되는 것이 좋음 if, when, try-catch, Elvis 표현식 등을 활용하면, 변수를 정의할 때 초기화할 수 있음 스코프 최소화 예시 // 나쁜 예 var user: User for (i in users.indices) { user = users[i] pri..
[KOTLIN] CONTEXT / DISPATCHER
·
KOTLIN
코루틴은 항상 Kotlin 표준 라이브러리에 정의된 CoroutineContext로 대표되는 어떤 context에서 실행되고 코루틴의 context는 여러 요소의 set으로 구성됨 Context 어떤 쓰레드에서 코루틴을 실행할지에 대한 Dispatcher의 정보를 담고 있는 그룹임, 스레드 풀을 전환하고, 지정하고, 예외를 잡는데 사용 Job, Deferred, Dispatcher, CoroutineName, CoroutineExceptionHandler는 모두 CorountineContext 인터페이스에 간접적으로 상속됨 Dispatcher 코루틴을 생성하여 해당 코루틴을 Dispatcher에 전송시, Dispatcher는 자신이 관리하는 스레드풀 내의 스레드 부하 상황에 맞춰서 코루틴을 분배함 결론적..
[KOTLIN] CANCELLATION (취소)
·
KOTLIN
Cancellation fun main() = runBlocking { // 시작 val job = launch { repeat(1000) { i -> println("job: I'm sleeping $i ...") delay(500L) } } delay(1300L) // 약간 딜레이 println("main: I'm tired of waiting!") job.cancel() // job 취소 job.join() // job의 완료를 기다림. println("main: Now I can quit.") // 끝 } 코루틴을 사용할 경우 더이상 코루틴 동작이 필요하지 않은 경우 취소를 해줘야함 (자원 낭비가 발생) main()에서 job.cancel을 호출하면 다른 코루틴이 취소 되기 때문에 출력 금지됨 C..
[KOTLIN] SUSPEND 함수
·
KOTLIN
Suspend 비동기 실행을 위한 중단 지점 잠시 중단하고, 언젠가 다시 시작 즉 일시중단이 가능하도록 하게 하는 키워드 코루틴 Suspend 함수는 구성 및 접근법이 다양함 순차적 실행 fun main() = runBlocking { val time = measureTimeMillis { val one = doOne(); val two = doTwo(); println("결과 : ${one + two}") } println("완료 ${time}") } suspend fun doOne(): Int { println("첫번째 함수 시작") delay(1000L) return 1; } suspend fun doTwo(): Int { println("두번째 함수 시작") delay(1000L) return 2..
[KOTLIN] 코루틴
·
KOTLIN
Coroutines 비선점 멀티태스킹의 서브루틴 형태 (메인과 서브의 개념이 없다고함) 지연과 재개가 가능함 협력형 태스크와 비슷하게 동작 코루틴을 사용해서 특정 루틴의 블로킹을 분리하고 비동기적으로 협력형 멀티태스크를 구현 Kotlin Coroutines 기본옵션은 협력형이며 병행형으로 동작하지 않음 (옵션은 조절이 가능함) 스케쥴러 실행시점을 설정하는 것이 아닌 프로그래머 이벤트에 의해 실행 및 지연(Suspend), 재개(Resume) 시점이 결정 비선점형 태스크, 동시성 제공 Coroutines 요소 CoroutineScope : 코루틴문맥을 실행하기 위한 제한 범위를 지정, 특정한 목적의 Dispatcher를 지정하여 제어 및 동작 가능한 범위 CoroutineContext : 코루틴을 실행하는..
[KOTLIN] NULL SAFTY / NULL 처리방법
·
KOTLIN
Kotlin의 타입시스템은 null references 위험을 제거하는 것을 목표로 함 Safe Call 연산자 fun main() { val name : String? = null val len = name?.length val upperName = name?.uppercase() println("${upperName}이고 이름자리는 ${len}자리입니다.") } ?.로 표현되며 nullable한 변수를 검사하여 null일 경우 NullPointException을 발생시키지 않고 그대로 null을 반환함 엘비스 연산자 fun main() { val name : String? = null val len = name?.length?:0 val upperName = name?.uppercase()?:"no ..
[KOTLIN] LATEINIT / LAZY
·
KOTLIN
LateInit 변수에 객체를 할당하는 것을 선언과 동시에 하지 않고 할당하는 작업을 뒤로 미루게 해줌 Nullabled 하지 않는 변수를 선언하면서 할당하는 작업을 뒤로 미루고 싶을 때 사용 LateInit은 mutable 변수만 가능하기 때문에 var키워드 가진 변수에만 사용이 가능함 LateInit 예제 fun main() { val lateInit = LateInitSample() println(lateInit.getLateInitText()) lateInit.text = "할당완료" println(lateInit.getLateInitText()) } class LateInitSample { lateinit var text: String fun getLateInitText(): String { /..
[KOTLIN] 시퀀스 (SEQUENCES)
·
KOTLIN
시퀀스 (Sequences) Collections과 같은 Iterable한 자료구조임 Collections와 연산방식에 차이점이 있음 Collections은 기본적으로 Eager evaluation이고, Sequences은 Lazy evaluation임 Lazy evaluation / Eager evaluation 종류 방식 Kotlin Collections Eager evaluation Kotline Sequences Lazy evaluation Java Streams Lazy evaluation Lazy evaluation : 지금 하지 않아도 되는 연산을 최대한 미루고, 필요한 순간에 연산을 수행하는 방식 Eager evalutation : 수행해야 할 연산이 있으면 미루지 않고 바로 처리하는 방식..
[KOTLIN] 확장함수
·
KOTLIN
확장함수 클래스에 상속하거나 디자인 패턴을 사용하지 않고 새로운 기능으로 클래스를 확장 할 수 있는 기능을 제공하게 해줌 마치 기존 클래스의 멤버 함수인 것처럼 사용할 수 있게 해주는 함수 확장함수 구조 fun 클래스이름.함수이름(인자타입): 리턴타입 { 구현부 } 클래스이름은 확장이 정의될 클래스를 명시해주고 수신객체 타입임 (수신객체는 클래스에 속한 인스턴스 객체) 클래스뒤에 . 찍고 함수이름을 정의하여, 함수내부에서는 this키워드로 수신객체멤버를 사용 확장함수 예시 fun main() { val order = Order(listOf(Item("Bread", 25), Item("Wine", 30), Item("Water", 12))) //가장 비싼 아이템 이름 : Wine println("가장 비싼..