Abstract class vs interface in Kotlin
·
KOTLIN
서론우아한테크코스의 미션을 진행하며 abstract class와 interface의 차이에 대해서 많은 고민을 하게 되었습니다. 추상 클래스와 인터페이스의 공통점은 추상화입니다. 추상화를 통해 의존성 역전 원칙(DIP)을 적용할 수 있게 되며, 구현체를 사용하는 곳에서 추상화에 의존함으로써 다형성을 통해 구현체를 자유롭게 교체할 수 있습니다.  또한 반대로 클래스를 재활용 할 수 있다는 점에서 클래스 간의 결합도를 느슨하게 만들어 유지보수성을 향상시킬 수 있습니다. 그렇다면 인터페이스와 추상 클래스는 각각 어떤 차이점이 있을까요? 근간에 말하는 상속을 지양하라는 말엔 어떤 이유가 있을까요 ? 이에 대해 알아보겠습니다.📌  상태를 가질 수 있는가 ?인터페이스는 상태를 가질 수 없다. 그러나, 추상 클래스..
우아한 테크코스 레벨 1회고록
·
카테고리 없음
우테코를 시작한 지 바로 어제 같은데 벌써 레벨 1의 마지막을 달려가고 있다. 레벨 1의 기간 동안 나는 어땠을까? 우테코와 처음 만나다 두 달 동안 느낀 우테코에 대한 감정은 내가 기대한 것 그 이상이다. 함께 끊임없이 토론할 수 있는 동료들, 넘처나는 주제거리 등으로 매일매일이 힘들면서도 너무나 행복한 날의 연속이었다. 우테코를 시작하고 이틀 차부터 며칠을 제외하곤 거의 캠퍼스 마감 시간까지 야근을 하는데 이를 할 수 있음에 너무나 감사했다. 덕분에 크루들에게 대단하단 말도 많이 들었는데 나는 오히려 이렇게 할 수 있는 환경이 주어졌음에 감사할 뿐이다. 이렇게 하고 싶어도 못하는 사람들이 훨씬 많을 테니까. 초기엔 캠퍼스에 혼자 남아있는 날이 많아서 꽤나 무서웠는데 최근엔 함께 남아있는 크루들이 많아..
다시 읽는 Effective Kotlin - Item39. 태그 클래스보다는 클래스 계층을 사용하라
·
KOTLIN
최근 우아한 테크코스의 미션들을 진행하면서 크루들 사이에 sealed Class의 사용법에 대한 많은 토론이 있었습니다. 필자는 안드로이드를 개발하면서 sealed Class, sealed Interface를 적극 사용해 왔기에 이 경험을 토대로 저만의 사용 기준을 새워왔습니다. 오늘은 이펙티브 코틀린의 Item39 태그 클래스보다는 클래스 계층을 사용하라에서 주장하는 내용과 개인적인 경험을 녹여 sealed class를 사용하는 기준에 대해서 이야기하고 우아한 테크코스에서 진행한 미션에서 에러 처리 파트를 sealed class 사용한 부분을 소개해 보겠습니다.Enum vs SealedEnum과 sealed class는 모두 "행동"과 "상태"를 가질 수 있습니다. 즉, 독립적인 하나의 객체로 존중받을..
다시 읽는 Effective Kotlin - Item33. 생성자 대신 팩토리 함수를 사용하라
·
KOTLIN
서론 필자는 그동안 앱을 개발하면서 팩토리 패턴을 굉장히 많이 사용해 왔습니다. 예컨대 다음같이 Hilt를 사용하지 않고 앱을 개발하던 시절 Retrofit -> DataSource -> Repository까지의 필요한 인스턴스들을 Repository Interface에서 팩토리 패턴을 사용함으로써 View에서 Data Layer 방향으로의 직접적인 의존성을 끊을 수 있었습니다.interface PlaceRepository { companion object{ fun create(): PlaceRepository{ return PlaceRepositoryImpl( PlaceDataSource( Retrofit..
Compose LocalCollectAsStateCoroutineContext
·
Android
Dove Letter의 25년 2월 3일 아카이빙 된 내용 중 흥미로운 글을 발견했다. compose에서 상태를 UI에 바인딩할 때 사용되는 API 중 하나인 CollectAsState( )가 Dispatchers.Main를 사용하고 있다. 이로 인해 상태를 상태를 디스패치하는 과정에서 UI에 도달할 때마다 비동기적으로 상태를 전달하기 때문에 새로 업데이트된 상태와 UI의 동기화 문제가 발생할 수 있다. 이 문제는 context 인자에 Dispatcers.Main.immediate를 전달함으로써 해결할 수 있다. 하지만 2025년 2월 5일 기준으로 이 문제를 위해 추가된 API가 있다 하니 간단하게 알아보자.val uiState = viewModel.uiState.collectAsState(Dispa..
ViewModel의 One Time Event를 다루는 다양한 솔루션
·
Android
서론ViewModel에서 발생하는 이벤트를 소비하는 방법엔 Channel, SharedFlow, State 등 다양한 방법이 있습니다. 프로젝트를 Compose로 Migration 하는 과정에서 이에 대한 솔루션이 필요해 여러 자료를 통해 프로젝트에 채택한 방법을 소개하겠습니다. 해당 글은 Youtuber Phillipp Lackner님의 영상을 번역한 자료로 필자는 영어를 잘 못하기 때문에... 유튜브 영상의 스크립트를 해석한 내용으로 잘못된 내용이 있을 수 있습니다.0. 필요 조건One Time Event를 위한 API는 다음 조건이 필요합니다.Event 발생 후 앱이 백그라운드로 내려갈 시 UI에선 구독을 중지해야 한다.동일한 Event를 중복해서 발생시키지 않아야 한다.(Ex. 같은 화면을 두 ..
Channel 내부 동작 분석을 분석해보자
·
KOTLIN
서론프로젝트에서 API 호출 시 발생하는 네트워크 에러처리에 대한 클래스를 StateFlow에서 Channel에서 변경하게 되었습니다. 기존에 사용하던 StateFlow는 중복된 에러를 방출하지 않는다는 문제가 있었습니다. 단순히 API 호출 실패로 인해 화면 이동이 안된다거나, 특정 동작이 반복될 가능성이 매우 희박한 곳에선 해당 문제를 발견하지 못했지만 이후 북마크 버튼을 클릭같이 단발적으로 반복해서 발생하는 이벤트에 대해선 문제가 발생했습니다.Channel 뜯어보기public fun Channel( capacity: Int = RENDEZVOUS, onBufferOverflow: BufferOverflow = BufferOverflow.SUSPEND, onUndeliveredEle..
[우아한 테크코스] 최종 테스트 0점 안드로이드 7기 최종 합격 후기
·
카테고리 없음
연말 마지막 선물로 우테코란 선물을 받게 되었습니다. 어떻게 최종 코테를 0점을 받았는데 합격을 하냐 어그로 아니냐 하실 수 있겠지만 시험 종료 전까지 제대로 구현도 못해 정확히는 테스트를 돌려보지도 못했습니다. 그래서 문제 조건에서 로컬 테스트를 통과하지 못한다면 0점으로 처리할 것을 명시했기 때문에 0점이라고 생각했습니다.  또한 프리코스 과정에서 2주 차 PR을 날려먹는 대참사가 났습니다. 그럼에도 불구하고 제가 어떻게 합격할 수 있었는지는 알 수 없지만 지난 2달간의 여정을 되돌아 돌아보려 합니다. 또한 다음 기수에 우테코에 도전하는 분들이 저처럼 큰 실수를 한다고 해서 좌절하거나 포기하지 않도록 조금이나마 도움이 되기 위해 작성합니다. 왜 우테코였을까?사실 우테코에 처음 지원할 때 그렇게 간절..