전체 글 171

림시 flow

목차Flow 란?Flow 의 장점LiveData 의 한계LiveData -> Flow 마이그레이션4.1 마이그레이션의 필요성4.2 마이그레이션 과정4.3 마이그레이션 중 발생할 수 있는 이슈 및 해결책Flow 활용 고급 패턴5.1 StateFlow vs SharedFlow5.2 Channel 을 활용한 복잡한 데이터 흐름 관리참고자료1. Flow 란?Flow는 Kotlin에서 제공하는 비동기 데이터 스트림 처리 도구로써 비동기적으로 계산해야 할 값의 스트림입니다.suspend 함수는 단일 값만 반환합니다. 하지만 Flow 는 suspend 함수와 달리 여러 값을 순차적으로 내보낼 수 있습니다.Sequence 와 비슷하지만, 비동기 처리를 지원하고, 데이터를 비동기적으로 생성할 수 있습니다.예를 들어서 F..

Kotlin 2024.10.30

ListView 는 ViewHolder 재사용을 못하는 거 아니었나요??? (아님) feat 우테코

우테코에서는 "과속, 과식하지 말것" 이라는 권장 목표가 있다.즉, 수업에서 다루는 것부터 공부하고 미션에 적용해보고 나서, 그 다음 기술을 사용하는 것이다. 이번 미션은 '영화 티켓 예매'이다. 오른쪽과 같은 화면을 `RecyelrView`가 아니라 `ListView`로 구현해야 한다. 나는 리스트뷰를 사용해본 적이 없다. 그렇다고, 이 미션에서 리사이클러뷰를 사용할 수는 없다.그래서 진행 전부터 난관이 예상되었다. 이번 글에서는 리스트뷰를 통해 화면을 구성하고뷰홀더 패턴을 적용, 뷰홀더를 뷰의 tag 에 캐싱하도록 리팩토링.뷰의 tag 에 캐싱하는 게 아닌, 다른 객체에 캐싱하도록 리팩토링.참고로 MVVM 이 아닌, MVP 패턴을 적용했고,viewBidning, dataBinding 을 사용하지 않고..

[Kotlin] 리플렉션(Reflection) -2 (애노테이션을 리플렉션으로 처리 feat.JKid)

이전 글에서 이어진다. 이전 글 ([Kotlin] 애노테이션 - 1 (적용과 사용 지점 대상)) ([Kotlin] 애노테이션 -2 (JKid 라이브러리를 통해 알아보기)) ([Kotlin] 리플렉션(Reflection) -1 (KClass, KCallable, KFunction, KProperty)) 리플렉션을 사용한 객체 직렬화 구현 JKid 의 직렬화 함수는 아래와 같다. fun serialize(obj: Any): String = buildString { serializeObject(obj) } 객체를 받아서 그 객체에 대한 JSON 표현을 문자열로 돌려준다. 객체의 프로퍼티와 값을 직렬화하면서 `StringBuilder`객체 뒤에 직렬화한 문자열을 추가한다. 이를 편하게 하기 위해 `buildSt..

Kotlin 2024.04.11

[Kotlin] 리플렉션(Reflection) -1 (KClass, KCallable, KFunction, KProperty)

리플렉션(reflection)을 사용하면 런타임에 컴파일러 내부 구조를 분석할 수 있다. 이전 글과 마찬가지로, 이번 글에서는 JKid 에서 리플렉션 API 를 사용하는 방법을 직렬화, JSON 파싱, 역직렬화 순으로 살펴본다. 이전 글: 애노테이션-1(적용과 사용 지점 대상) , 애노테이션-2(JKid 라이브러리를 통해 알아보기) 리플렉션 소개 간단히 말해 리플렉션은 런타임에(동적으로) 객체의 프로퍼티와 메서드에 접근할 수 있게 해주는 방법이다. 보통 객체의 메서드나 프로퍼티에 접근할 때는 소스 코드 안에 구체적인 선언이 있는 메서드나 프로퍼티 이름을 사용한다. 그리고 컴파일러는 그런 이름이 실제로 가리키는 선언을 컴파일 타임에(정적으로) 찾아내서 해당하는 선언이 실제 존재함을 보장한다. 만약 정적으로..

Kotlin 2024.04.11

[Kotlin] 애노테이션 -2 (JKid 라이브러리를 통해 알아보기)

이전 글([Kotlin] 애노테이션 - 1 (적용과 사용 지점 대상))에서 이어집니다. 애노테이션을 활용한 JSON 직렬화 제어 직렬화(serialization)는 객체를 저장장치에 저장하거나 네트워크를 통해 전송하기 위해 텍스트나 이진 형식으로 변환하는 것이다. 반대로 역직렬화(deserialization)는 텍스트나 이진 형식으로 저장된 데이터로부터 원래의 객체를 만들어낸다. (직렬화/역직렬화 설명이 포함된 글 을 참고) 직렬화에는 JSON 형식이 자주 쓰인다. 자바와 JSON 을 변환할 때 Jackson(잭슨)라이브러리와 GSON(지슨) 라이브러리가 자주 쓰인다. 이들도 코틀린과 완전히 호환된다. JSON 직렬화를 위한 JKid 라는 순수 코틀린 라이브러리를 통해 공부해보자. (https://git..

Kotlin 2024.04.10

[Kotlin] 애노테이션 - 1 (적용과 사용 지점 대상)

오랜만에 Kotlin in Action 책을 다시 부수기로 했다. 우테코 첫 방학이기 때문! 이제 kotlin in action 의 10장 애노테이션과 리플렉션, 11장 DSL 만들기를 보면, Kotlin in Action 의 1, 2부를 모두 보게 된다. 애노테이션을 사용하면 라이브러리가 요구하는 의미를 클래스에게 부여할 수 있다. 코틀린에서 애노테이션을 사용하는 문법은 자바와 똑같지만, 애노테이션을 선언할 때 사용하는 문법은 자바와 약간 다르다. 애노테이션 선언 & 적용 메타데이터를 선언에 추가하면 애노테이션 프로세서가 컴파일 타임/ 런타임에 적절한 처리를 해준다. 메타데이터가 뭔데? 메타데이터(metadata)는 데이터에 대한 데이터라는 의미를 가지며, 특정 정보의 구조, 내용, 관계 등을 설명하는..

Kotlin 2024.04.10

[Kotlin] SAM 을 익명 객체 VS 람다로 구현 & fun interface (feat. 우테코)

블랙잭 미션을 진행하면서, 크루원 중 한명이 SAM 인터페이스와 코틀린 fun interface 를 잘 모르겠다고 했다. 나도 코드에 이것을 잘 사용하는 것이 항상 어려웠다. 그래서 다시 공부해서 스터디 시간에 발표하려고 한다. 먼저 익명 객체와 람다부터 알아보자. 익명 객체(Anonymous Object) 코틀린에서 익명 객체(anonymous objects)는 객체 지향 프로그래밍에서 유용한 개념 중 하나이다. 익명 객체는 이름이 없는 클래스 인스턴스를 만들어내는 방법으로, 주로 인터페이스나 추상 클래스의 인스턴스를 만들 때 사용된다. 코틀린에서는 익명 객체를 선언하고 초기화하는 방법이 간단하고 직관적이다. 코틀린 vs 자바 에서 익명 객체 구현 코틀린에서 익명 객체 구현 val thread = Th..

Kotlin 2024.03.22

의인화 & 정보 전문가 패턴 & 리팩터링 _feat(우테코 - 로또)

우테코 2단계 level 2 로또 미션 중에 나는 매우 재미있는 경험을 했다. 이전에는 책에서 봤던 이론적인 내용을 말로는 표현할 수 있었지만, 나의 코드로는 적용하기가 어려웠다. 나는 무언가를 안다는 것은 아래 세가지 단계로 나뉜다고 생각한다. (내 생각이 아니라, 어디서 봤던 것 같기도 하고...) 개념을 알고 설명한다. 그 개념을 똑같이 사용할 수 있다. 그 개념을 다르게 활용할 수 있다. 나는 책에서 보았던 내용을 1단계 정도밖에 알지 못하는 것 같았다. 내가 읽었던 책은 조영호 저자의 객사오('객체지향의 사실과 오해') 와, '오브젝트 - 코드로 이해하는 객체지향 설계', 그리고 마틴 파울러 저자의 '리팩터링 2판' 이다. 의인화 - 객사오 이 책의 66, 67 페이지에서는 아래와 같은 내용이 ..

[Kotlin] 방어적 복사와 깊은 복사, 얕은 복사 (feat. 우테코)

Mutablility(가변성)과 방어적 복사, 혹은 방어적 프로그래밍은 공부할 때 봤던 코틀린 인 액션 책에 "6.3.2 읽기 전용과 변경 가능한 컬렉션"에서 잠깐 다룬다.(이 글에서도) 하지만 뭔가 부족한 느낌이 있었는데, 마침 우테코 수업에서 이 내용을 다루었다!! 모든 코드는 Kotlin 으로 작성된다. 얕은 복사(Shallow copy)와 깊은 복사(Deep Copy), 그리고 방어적 복사(Defensive Copy) 순서로 공부해보자. 얕은 복사(Shallow copy) & 깊은 복사(Deep copy) 먼저 방어적 복사 이전에 얕은 복사와 깊은 복사를 알아야 한다. 얕은 복사(Shallow copy) 얕은 복사: 객체의 주솟값을 복사한다. 복사된 객체의 인스턴스는 원본 객체의 인스턴스와 같은 ..

Kotlin 2024.03.08