분류 전체보기 (40) 썸네일형 리스트형 [Android] Custom Calendar Finut을 개발하면서 여러 종류의 캘린더를 만들어야 했다. 기존에 만든 Calendar는 단순히 RecyclerView를 활용했었는데, View가 재활용되지도 않고 성능도 별로 좋지 않아 의미가 없었다. Calendar UI가 새로 디자인 되어서 이번 기회에 새롭게 Custom 하였다. 해당 포스팅은 하단의 결과물과는 달리 스케줄을 표시하는 기능을 제외하고 기본적인 Calendar를 만드는 과정만 다루고 있습니다...!! 1️⃣ fragment_calendar.xml - linearlayout_days: 월화수목금토일을 나타내주는 레이아웃 - viewpager_calendar: 월별 날짜를 나타내주는 레이아웃 - linearlayout_days에는 동적으로 요일을 넣어주었다. - 추후에 요일을 나타내는.. MVI( Model - View - Intent ) 🛠 MVI Pattern 안드로이드 생태계에서는 대부분 MVVM을 Architecture Pattern으로 선정해왔다. MVVM을 이용하면 ViewModel은 View를 참조하지 않을뿐만 아니라, 각 컴포넌트들을 기능에 따라 분리시키며 관심사 분리에 따른 개발을 진행할 수 있다. 하지만 MVVM으로 프로덕트를 디벨롭하다보면 애플리케이션의 여러 상태를 제어하지 못해 일어나는 버그들이 많다. ✅상태문제 애플리케이션에는 무수한 상태들로 구성되어 있다. 비즈니스 로직에 따라 앱의 상태는 자주 변경되고 관리되며, 이에 따라 UI Rendering이 적절하게 이루어져야 한다. 하지만 앱이 커지고 기능이 많아질 수록 이러한 상태관리가 힘들어지고 의도한 방향으로 제어되지 않을 가능성이 매우 크다. MVI는 이러한 상태.. Architecture Patterns (MVC, MVP, MVVM) MVI에 대한 글을 작성하기에 앞서 여러 Architecture Pattern들에 대해 간단하게 정리. 1️⃣ MVC ( Model - View - Controller ) 웹 애플리케이션에서 가장 많이 쓰이는 아키텍처 패턴 중의 하나이다. ✅ Model: 애플리케이션에서 사용되는 데이터와 데이터를 처리하는 부분이며, 비즈니스 로직을 나타낸다. ✅ View: UI 컴포넌트로 사용자에게 보여지는 부분이다. ✅ Controller: 사용자의 Action을 입력받고 처리한다. 모델과 뷰 사이에서 협력자 역할을 한다. [장점] 여러 개의 뷰를 모델에 빌드할 수 있다. 변경사항이 모델 전체에 영향을 주지 않는다. 데이터를 어떠한 형태의 가공 없이 반환한다. [단점] View와 Model 사이의 의존성이 높아질 수 .. [알고리즘] 조건문(1) 문제. 시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오. 중첩 if문 대신 가독성이 좋은 when을 사용하였다. import java.util.* fun main(args: Array) { val scanner = Scanner(System.`in`) val score = scanner.nextInt() print( when(score) { in 90.. 100 -> "A" in 80 .. 89 -> "B" in 70 .. 79 -> "C" in 60 .. 69 -> "D" else -> "F" } ) } [Jetpack Compose] State 보호되어 있는 글입니다. Jetpack Compose로 마이그레이션하기 (1) 개발 스프린트를 마무리 하고 쉬엄쉬엄 재정비하는 시간을 가지면서 Jetpack Compose 로 마이그레이션해보고자 한다. 이전부터 매우 공부해보고 싶었는데 빠르게 개발 속도를 내야하다보니 어쩔 수 없이 익숙한 걸로 계속 개발하게 되었다... 조금 여유로울 때 많이 공부해놔야겠다. ✅ Jetpack Compose로 변경하는 이유 [선언형 UI] 기존의 xml로 뷰를 구성하는 방식은 명령형 UI에 해당한다. 데이터가 변경되면 UI에 접근하여 데이터가 변경되었으니 UI객체에 새로 업데이트 해라!라고 명령하는 방식이다. 이 과정에서 서로 잘못 연결되거나 누락되면 NPE등의 에러가 발생할 수 있다. 화면이 복잡해질 수록 이런 가능성이 높아진다. Jetpack Compose는 선언형 UI로 위와 같은 작업을 할 .. [Kotlin] inline, noinline 🍀 Inline Function Kotlin에서 고차함수를 사용하면 추가적인 메모리 할당 및 함수 호출로 Runtime Overhead가 발생한다. inline function은 내부적으로 함수 내용을 호출되는 위치에 복사하며, Runtime overhead를 줄여준다. inline을 사용하면 무의미한 객체 생성을 예방할 수 있다. 예시로 든 함수를 java로 decompile해보면 어떻게 될까 ? fun main(args: Array) { val result = squareFunction(a = 3, function = { print("sson peace") }) println(result) } fun squareFunction(a: Int, function: () -> Unit): Int { func.. [Coroutines] Channel, Pipeline ✅ Coroutine Channel 기본적으로 Deffered는 Coroutine간의 단일 값을 전달하는 방법을 제공하고, Channel은 Stream의 값을 전달하는 방법을 제공한다. Channel은 BlockingQueue와 비슷하다. 한가지 차이점은 BlockingQueue의 put 함수 대신 일시중단 가능한 send()함수가 존재하고, take 함수 대신 receive() 함수가 존재한다. channel은 더이상 사용하지 않을 때 close()를 이용하여 원소가 없음을 나타낼 수 있다. 이 덕분에 receiver side에서는 for loop를 사용하여 채널로부터 element를 편하게 수신할 수 있다. close()가 호출되는 순간 반복이 중단되지만, close 되기 전까지 보낸 모든 요소는 수.. 이전 1 2 3 4 5 다음