Kotlin

스레드와 코루틴 스레드 Thread 클래스의 인스턴스는 프로그램이 실행될 때 운영체제의 네이티브 스레드를 나타낸다. 스레드(Thread)의 각 인스턴스는 해당 스택에 대한 메모리를 사용하고 초기화하기 위한 시간이 필요하다. 스레드의 컨텍스트 전환은 꽤 비싼 작업이기 때문에 별도의 스레드에서 짧은 작업을 호출하는 것은 좋은 결과를 가져오기 어렵다. 코루틴 (CoRoutine) 코루틴은 힙 메모리의 객체를 의미하며 코루틴 간의 전환은 운영체제 커널 작업이 아니다. 코루틴은 프로세스에 할당된 힙 메모리 영역을 공유해서 사용한다. 즉, 스레드에 비해 빠르고 적은 비용으로 생성할 수 있으며 자원도 적게 사용된다. 간단 사용법 코루틴은 CoroutineContext 인터페이스로 표시되는 컨텍스트에서 실행된다. El..
[Effective Kotlin. 49] 하나 이상의 처리 단계를 가진 경우에는 시퀀스를 사용하라 Iterable vs Sequence Sequence 지연(lazy) 연산 따라서 시퀀스 처리함수들은 데코레이터 패턴으로 꾸며진 새로운 시퀀스가 리턴 됨 최종 계산은 toList 또는 count 등의 최종 연산이 이루어질 때 수행됨 Iterable 즉시(eagerly) 연산 처리 함수를 사용할 때마다 연산이 이루어져 List가 만들어짐 public inline fun Sequence.filter( predicate: (T) -> Boolean ): Sequence { return FilteringSequence(ths, true, predicate) } public inline fun Iterable.fil..
재사용(reusability)성은 프로그래밍 언어의 핵심이라고 할 수 있음 System.out.println, 각종 정렬 함수, http client 구현이 안되어 있다면? T_T 재사용성은 힘이 있는 만큼 굉장히 위험하기도 함 A, B의 공통 부분을 추출한다면, 이후 공통 부분을 수정할 일이 있을 경우 한꺼번에 수정 가능 그러나, 세상일은 우리가 원하는대로 일어나지 않음 A를 대상으로 수정한 것이 B에서 문제가될 수 있고, B를 대상으로 수정한 것이 A에서 문제가될 수 있음 따라서 재사용성을 고려하는 일은 생각보다 어렵고, 다양한 오류를 발생시킬 수 있음 [Effective Kotlin. 19] knowledge를 반복하여 사용하지 말라 프로젝트에서 이미 있던 코드를 복사해서 붙여넣고 있다면, 무언가가..
코틀린의 프로퍼티는 자바의 필드와 비슷해보이지만 완전히 다른 개념 // kotlin val name: String? = null // java String name = null; 공통점 : 데이터를 저장 프로퍼티는 더 많은 기능이 존재 기본적으로 프로퍼티는 사용자 정의 세터/게터를 가질 수 있음 var name: String? = null get() = field?.toUpperCase() set(value) { if (!value.isNullOrBlank()) { field = value } } field 식별자 : 프로퍼티의 데이터를 저장해 두는 백킹 필드(backing field)에 대한 레퍼런스 백킹 필드는 세터와 게터의 디폴트 구현에 사용되며 따로 만들지 않아도 디폴트로 생성 됨 val을 사용해..
개발자가 코드를 작성하는 데는 1분 걸리지만, 이를 읽는 데는 10분이 걸린다 - 로버트 마틴 프로그래밍은 쓰기보다 읽기가 중요 항상 가독성을 생각하며 코드릴 작성할 필요가 있음 인식 부하 감소 kotlin을 처음 접하게 되면 코드가 간결해지는 몇 가지 마법들을 만나게 된다. 이 몇가지 마법들을 알게되면 활용을 하고 싶어지고, 코드를 계속 간결하게 만들고 싶은 욕망에 사로잡히게 되는데 가독성 측면에서 생각해볼 필요가 있음 무엇이 더 좋을까? // 구현 A if (person != null && person.isAdult) { view.showPerson(person) } else { view.showError() } // 구현 B person?.takeIf { it.isAdult } ?.let(view:..
setup dependency 추가 tasks.withType().configureEach { useJUnitPlatform() } // Test Framework testImplementation('io.kotest:kotest-runner-junit5:5.5.4') // Assertions Library testImplementation('io.kotest:kotest-assertions-core:5.5.4') Kotest intellij plugin 설치 Testing Style kotest는 10개의 레이아웃을 제공하며, 이 중 하나를 상속받아서 사용 가능 여러 테스트 프레임워크에서 영감을 받아 작성된 레이아웃도 존재 사용하면 편할 것 같은 레이아웃을 몇 개 살펴보면 Should Spec Beha..
상속은 굉장히 강력한 기능인 만큼 여러 가지 문제를 발생시킬 수 있다. 따라서 단순하게 코드 추출 또는 재사용을 위해 상속을 한다면 신중하게 생각해봐야 한다. 간단한 행위 재사용 슈퍼 클래스를 만들어서 공통 행위를 추출한 경우 abstract class LoaderWithProgess { fun load() { // 프로그레스 바 보여줌 innerLoad() // 프로그레스 바 숨김 } abstract fun innerLoad() } class ProfileLoader: LoaderWithProgress() { override fun innerLoad() { // 프로파일 읽어 들임 } } class ImageLoader: LoaderWithProgress() { override fun innerLoad..
고차함수? 다른 함수를 인자로 받거나 함수를 반환하는 함수(파라미터 혹은 반환 값으로 람다 사용) 함수 타입이란? 함수 타입은 아래와 같이 선언 // 타입 추론 val sum = { x: Int, y: Int -> x + y } // 구체적인 타입 선언 val sum: (Int, Int) -> Int = { x, y -> x + y } 인자로 받은 함수 호출 간단한 고차 함수 정의 fun twoAndThree(operation: (Int, Int) -> Int) { val result operation(2, 3) println("The result is $result") } 함수 타입 파라미터에 디폴트 값 지정 fun Collection.joinString( separator: String = ", ",..
kotlin 데이터 클래스는 구조 분해 선언(Destructuring Declaration)이라는 특성을 갖고 있다. 구조 분해를 사용하면 복합적인 값을 분해해서 여러 다른 변수를 한꺼번에 초기화할 수 있다. val p = Point(10, 20) val (x, y) = p // x => 10 // y => 20 구조 분해 선언의 각 변수를 초기화하기 위해 componentN이라는 함수를 호출한다. data 클래스의 주 생성자에 들어있는 프로퍼티에 대해서는 컴파일러가 자동으로 componentN함수를 만들어준다. val (x, y) = p // 위 코드 컴파일 후 val x = p.component1() val y = p.component2() // data 타입이 아닌 클래스에서 구현하는 방법 clas..
인덱스로 원소에 접근 - Map 원소 접근시 괄호([]) 사용 코틀린에서는 맵의 원소에 접근할 때 자바에서 배열 원소에 접근하는 각 괄호([])를 사용할 수 있다. 인덱스 연산자는 get/set 관례를 따르며, Map과 MutableMap 인터페이스에는 이미 두 메서드가 들어가 있다. val value = map[key] mutableMap[key] = newValue 구현 예시 operator fun Point.get(index: Int): Int { return when(index) { 0 -> x 1 -> y else -> throw IndexOutOfBoundsException("Invalid coordinate $index") } } val p = Point(10, 20) println(p[1]..
깡냉쓰
'Kotlin' 태그의 글 목록