3월, 2020의 게시물 표시

코틀린 (Kotlin) 유용한 도구 및 확장함수, 확장 프로퍼티

sealed class 사용 sealed class Result< out T : Any> { data class Success< out T : Any>( val data : T ) : Result< T >() sealed class Error( val exception : Exception) : Result<Nothing>() { class RecoverableError(exception: Exception) : Error(exception) class NonRecoverableError(exception: Exception) : Error(exception) } object InProgress : Result<Nothing>() } sealed class 는 동일한 파일 또는 중첩 클래스로 정의해야 한다. sealed class 인 Result 클래스는 private 생성자로 생성된다. sealed class 인 Error 클래스는 private 생성자로 접근할 수 없다. val r : Result<Int> = Result.Error(Exception("error")) //컴파일 에러 발생 컴파일러만이 사용할 수 있는 생성자를 생성한다. InProgress 는 저장할 상태가 없기때문에 불필요한 할당을 피하기위해서 싱글톤으로 생성했다.(object) val result = when (result) { is Result.Success -> TODO () is Result.Error.RecoverableError -> TODO () is Result.Error.NonRecoverableError -> TODO () is Result.InProgress -> TODO () } when 구문을 사용했을 때 sealed clas

코틀린 (Kotlin) 컬렉션

코틀린 컬렉션 fun functionalFilter(numList : List<Int>) : List<Int> = numList.filter { it % 2 == 0 } 코드 간결성/가독성 향상 결과값을 저장하기 위한 별도의 리스트를 생성할 필요가 없다 비즈니스 로직에 집중 버그가 발생할 확률이 적다 테스트가 용이 유지보수가 용이 fun functionalMap(numList: List<Int>) : List<Int> {     return numList.map { it + 2 } } map 함수는 내부적으로 새로운 리스트를 만들어서 반환 -> 부수효과 없음 tailrec fun<T, R> FunList<T>.map(acc: FunList<R> = FunList.Nil, f: (T) -> R): FunList<R> = when (this) {     FunList.Nil -> acc.reverse()     is FunList.Cons -> tail.map(acc.addHead(f(head)), f) } 제네릭과 고차함수를 활용해서 일반화된 함수를 만들고, 재사용성을 높이는 것이 함수적 접근 방식 명령형과 함수형의 차이 fun func(intList: List<Int>) =     intList         .map { n ->             println("map=$n")             n*n }         .filter { n ->             println("filter=$n")             n < 10 }         .first() println(func(listOf(1,2,3,4,5))) //"1"출력 map 5번 실행