목록

    [Kotlin] CoroutineBuilder

    코루틴은 일시 중단이 가능한 작업 객체로 동시성을 지원하는 관점에선 스레드와 유사한점이 많다. 하지만 코루틴은 분명 스레드에서 동작하지만 그 어떤 스레드에 종속되진 않는다. 하나의 코루틴 작업을 스레드 이곳저곳을 돌아다니며 실행시킬 수 있기 때문이다. 이러한 코루틴을 만드는 방법은 CoroutineBuilder를 활용하는 것이다. CoroutineBuilder는 말그대로 코루틴을 만드는 코루틴 객체 생성자이다. CoroutineBuilder는 launch, async 이렇게 두 개로 볼 수 있다. launch, async를 알아보기에 앞서 Dispatchers에 대해 잠깐 알고 넘어가자. Dispatchers는 코루틴의 실행을 관리해주는 CoroutineContext로 스레드에 코루틴의 실행을 분배하거나..

    [Android] Android Architecture Components(AAC)

    구글에서 권장하는 아키텍처의 원칙은 '관심사 분리'와 '데이터 모델에서 UI 도출'이다. Activity나 Fragment와 같은 UI 기반의 클래스는 UI 및 운영체제 상호작용을 처리하는 로직만 포함되어야 한다. 위와 같은 클래스들은 최대한 가벼운 상태로 유지하여 수명 주기와 관련된 문제들을 피하고 테스트가 쉽도록 고려되어야 한다. 또한 OS가 언제든지 사용자에 의해 메모리 부족과 같은 시스템적인 조건으로 UI클래스들을 제거할 수 있기 때문에 로직의 성격에 따라 분리하여 UI클래스에 대한 의존성을 최소화하는 것이 좋다. 또한 UI는 데이터를 처리하는 모델에 의해 도출되어야 한다. 모델은 네트워크에 문제가 있거나 OS가 리소스를 확보하기 위해 앱을 제거해도 사용자의 데이터 또는 앱의 동작은 문제없이 지속..

    [Android] Retrofit2

    안드로이드에서 API 서버와 통신을 하기 위한 라이브러리로 Retrofit2, Volley, HttpUrlConnection, OKHttp 등이 있다. 그중에서 가장 많이 사용되고 있는 라이브러리는 'Retrofit2'이고 이 라이브러리에 대해 자세히 알아보자. Retrofit2는? - Android에서 REST API 통신을 지원하기 위해 만들어진 라이브러리. - 전달받는 데이터를 Client가 필요한 형태로 가공하여 전달받는 Type-Safe 한 HTTP 클라이언트 라이브러리. - AsyncTask 없이 Background에서 작업을 수행하고 Callback을 통해 메인 스레드에서 동작. - OkHttp 라이브러리의 상위 구현체. Retrofit2의 장점 빨라진 성능 복잡하지 않은 구현 반복되는 작업..

    [Android] Shape에 margin 속성 추가하기

    외부 라이브러리를 사용하는 과정에서 화면에서 보일 TextView를 인자로 넘겨주는 경우가 생겼다. 설상가상으로 TextView 자체의 디자인도 복잡하고 margin 값 적용이 필요한 경우였는데, WindowManager.LayoutParams만 layoutparams로만 정의해야 하는 제약까지 있었다. 만약 LinearLayout이나 RelativeLayout으로도 layoutParams 정의가 가능하면 아래처럼 쉽게 끝낼 수 있다. layoutParams = LinearLayout.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT ).apply { setMargins(1,2,3,4)..

    [Android] 디바이스 화면 해상도 구하기

    fun getDeviceMetric(): ScreenSizeInfo = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { val displaySize = Point() context.getSystemService(WindowManager::class.java).defaultDisplay?.getRealSize(displaySize) ScreenSizeInfo( screenWidth = displaySize.x, screenHeight = displaySize.y ) } else { val metrics = context.getSystemService(WindowManager::class.java).maximumWindowMetrics ScreenSizeInfo..

    [Kotlin] Object

    때때로 새로운 클래스를 명시적으로 선언하지 않고 클래스를 조금 변경된 객체를 만들 필요가 있다. Kotlin은 이런 케이스를 해결하기 위해 Object 식(expression)과 Object선언(declaration)을 지원한다. Object 식 특정 타입을 상속받는 inner 클래스 객체를 만들 때는 다음과 같이 작성한다. window.addMouserListener(object: MouseAdapter()){ override fun mouseClicked(e: MouseEvent){ //... } overrid fun mouseEntered(e: MouseEvent){ //... } }) 상위 타입이 복수라면 콜론 뒤에 콤마로 구분한다. open class A(x: Int) { public open ..