목록분류 전체보기 (152)
시배's Android
중단 코루틴은 중단되었을 때 Continuation 객체를 반환합니다. Continuation을 이용하면 멈췄던 곳에서 다시 코루틴을 실행할 수 있습니다. 스레드는 저장이 불가능하고 멈추는 것만 가능합니다. 코루틴은 다른 스레드에서 시작할 수 있고, 컨티뉴에이션 객체는 (이론상) 직렬화와 역직렬화가 가능하며 다시 실행될 수 있습니다. 재개 중단 함수는 말 그대로 코루틴을 중단할 수 있는 함수입니다. 이는 중단 함수가 반드시 코루틴(또는 다른 중단 함수)에 의해 호출되어야 함을 의미합니다. ScheduledExecutorService를 통해 특정 시간 이후에 중단을 멈추고 재개할 수 있도록 할 수 있습니다. private val executor = Executors.newSingleThreadSchedu..
코틀린의 시퀀스는 List나 Set과 같은 컬렉션이랑 비슷한 개념이지만, 필요할 때마다 값을 하나씩 계산하는 지연 처리를 합니다. 요구되는 연산을 최소한으로 수행합니다. 무한정이 될 수 있습니다. 메모리 사용이 효율적입니다. val seq = sequence { yield(1) yield(2) yield(3) } fun main() { for (num in seq) { print(num) } } 인자는 수신 객체 지정 람다 함수입니다 (suspend SequenceScope() -> Unit) 람다 내부에서 수신 객체인 this는 SequenceScope를 가리킵니다. 중단을 지원하는 스레드로 처리하려면 유지하고 관리하는데 막대한 비용이 듭니다. val fibonacci : Sequence = sequ..
fun onCreate() { val new = getNewsFromApi() val sortedNews = news .sortedByDescending { it.publishedAt } view.showNews( sortedNews ) } 안드로이드에서는 하나의 앱에서 뷰를 다루는 스레드가 단 하나만 존재합니다. 이 스레드는 앱에서 가장 중요한 스레드라 블로킹되면 안 되기 때문에, 이런 방법으로 구현할 수 없습니다. 스레드 전환 : 블로킹이 가능한 스레드를 먼저 사용하고, 이후에 메인 스레드로 전환하면 된다. 스레드가 실행되었을 때 멈출 수 있는 방법이 없어 메모리 누수로 이어질 수 있습니다. 스레드를 많이 생성하면 비용이 많이 듭니다. 스레드를 자주 전환하면 복잡도를 증가시키며 관리하기도 어렵습니다...
개념 관점에서 설계는 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현한다. 도메인이란 사용자들이 관심을 가지고 있는 특정 분야나 주제를 말하며 소프트웨어는 도메인에 존재하는 문제를 해결하기 위해 개발된다. 명세 관점에 이르면 사용자의 영역인 도메인을 벗어나 개발자의 영역인 소프트웨어로 초점이 옮겨진다. 구현 관점은 프로그래머인 우리에게 가장 익숙한 관점으로, 실제 작업을 수행하는 코드와 연관돼 있다. 훌륭한 객체는 훌륭한 협력을 설계할 때만 얻을 수 있다. 협력을 설계할 때는 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 해야 한다. 구현하지 않고 머릿속으로만 구상한 설계는 코드로 구현하는 단계에서 대부분 변경된다. 협력을 구상하는 단계에 너무 오랜 시간을 쏟지 말고 최대한 빨리 ..
Mavericks 라이브러리를 사용하여 MVI 아키텍처의 안드로이드 앱 개발 시, MavericksState의 UiState 초기값을 동적으로 어떻게 설정하는지에 대해 알아보려고 합니다. data class TestUiState( val test: Test ) : MavericksState data class Test( val abc: String = "" ) 간단하게 UI에서 TestUiState를 구독하여 Test 데이터 클래스의 초기값을 동적으로 설정하고자 합니다. data class TestUiState( val test: Test ) : MavericksState { constructor(args: Bundle) : this( test = if (Build.VERSION.SDK_INT >= Bu..
모든 소프트웨어 제품의 설계에는 두 가지 측면이 존재한다. 하나는 기능 측면의 설계이고, 다른 하나는 구조 측면의 설계다. 객체지향 접근방법은 자주 변경되지 않는 안정적인 객체 구조를 바탕으로 시스템 기능을 객체 간의 책임으로 분배한다. 구조는 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들 간의 관계로 표현한다. 기능은 사용자의 목표를 만족시키기 위해 책임을 수행하는 시스템의 행위로 표현한다. 도메인 모델의 핵심은 사용자가 도메인을 바라보는 관점을 반영해 소프트웨어를 설계하고 구현하는 것이다. 사용자 모델에 포함된 개념과 규칙은 비교적 변경될 확률이 적기 때문에 사용자 모델을 기반으로 설계와 코드를 만들면 변경에 쉽게 대처할 수 있을 가능성이 커진다. 유스케이스는 시스템의 이해관계자들 간의..
객체지향의 세계는 명확하게 정의된 역할과 책임을 지닌 객체들이 상호 협력하는 세계다. 객체지향 세계는 자율적인 객체들의 공동체라는 점을 명시하라. 객체가 자율적이기 위해서는 객체에게 할당되는 책임의 수준 역시 자율적이어야 한다. 자율적인 책임의 특징은 객체가 어떻게 해야 하는가가 아니라 무엇을 해야 하는가를 설명한다는 것이다. 메시지의 개념은 책임의 개념과 연결된다. 객체가 수신할 수 있는 메시지와 메시지를 처리하기 위해 선택할 수 있는 방법이라는 두 가지 개념이 존재한다. 메시지를 처리하기 위해 내부적으로 선택하는 방법을 메서드라고 한다. 다형성이란 서로 다른 유형의 객체가 동일한 메시지에 대해 서로 다르게 반응하는 것을 의미한다. 서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다..
요청에 대해 적절한 방식으로 응답하는 데 필요한 지식과 행동 방식을 가지고 있기 때문이다. 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다. 객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것이다. 객체의 책임은 객체가 무엇을 알고 있는가와 무엇을 할 수 있는가로 구성된다. 책임은 객체의 외부에 제공해 줄 수 있는 정보와 외부에 제공해 줄 수 있는 서비스의 목록이다. 책임은 객체의 공용 인터페이스를 구성한다. 두 객체 간의 협력은 메시지를 통해 이뤄진다. 설계를 시작하는 초반에는 어떤 객체가 어떤 책임을 가지고 어떤 방식으로 서로 협력해야 하는지에 대한 개요를 아는 것만으로도 충분하다. 어떤 객체가 수행하는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암..