Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

코루틴(플로우) - 2 면접 질문 #124

Open
Choisehyeon opened this issue Jul 5, 2024 · 28 comments
Open

코루틴(플로우) - 2 면접 질문 #124

Choisehyeon opened this issue Jul 5, 2024 · 28 comments
Assignees

Comments

@Choisehyeon
Copy link
Collaborator

Choisehyeon commented Jul 5, 2024

  • Q: Explain the concept of coroutine channels in Kotlin.
  • Q: Explain the role of the asFlow extension function in Kotlin Coroutines.
  • Q: What is the purpose of the StateFlow in Kotlin Coroutines?
  • Q: Explain the concept of coroutine flow operators in Kotlin.
  • Q: What is the purpose of the launchIn and collectAsState functions in combination with Jetpack Compose?
  • Q: How does Kotlin Coroutines handle backpressure in flow-based programming?
  • Q: How do you handle exceptions in a coroutine flow in Kotlin?
  • Q: Explain the difference between cold and hot flows in Kotlin Coroutines.
  • Q: How can you implement a timeout for a coroutine flow in Kotlin?
  • StateFlow와 SharedFlow의 차이점 설명
  • StateFlow와 LiveData의 차이점 설명
  • callbackFlow와 channelFlow 비교하여 설명
  • Flow에서 Buffer가 무엇이고 역할이 무엇인지 설명
  • combine, zip 연산자의 목적
  • collect와 onEach의 차이
  • flowOn이 무엇이고 사용 목적이 무엇인지
  • cold flow를 사용했던 경험을 말씀해주세요.
  • sequence와 flow의 차이가 뭔가요?
  • stateIn에는 어떤 파라미터가 있으며, 각각의 역할은 무엇인가요?
  • flow의 map 함수를 직접 구현하려면 어떻게 하실건가요?
  • 채널의 4가지 타입엔 어떤 것들이 있고 각각 간단한 설명을 해주실 수 있나요?
  • flow의 최종 연산 함수는 무엇이 있을까요?
  • 플로우에서 "debounce"의 역할은 무엇이며 성능을 최적화하는 데 어떻게 사용할 수 있습니까?
  • 플로우에서 "scan" 및 "fold" 작업의 역할을 설명하십시오.
  • Kotlin 코루틴을 사용하여 스로틀링 메커니즘을 어떻게 구현할 수 있습니까?
  • Flow 변환에서 "emit" 및 "emitAll"의 역할을 설명하십시오.
  • 플로우의 "flatMapConcat", "flatMapMerge" 및 "flatMapLatest"는 무엇이며 서로 어떻게 다릅니까?
  • 코틀린에서 flow를 어떻게 생성하나요? flowOf와 asFlow 함수의 차이점에 대해서 설명해주세요.
@s9hn s9hn changed the title 플로우 면접 질문 코루틴(플로우) - 2 면접 질문 Jul 6, 2024
@Choisehyeon
Copy link
Collaborator Author

Choisehyeon commented Jul 6, 2024

Explain the concept of coroutine channels in Kotlin.

코루틴끼리의 통신을 위한 기본적인 방법으로 공유책장으로 비유하여 설명할 수 있다.
채널에는 send, receive 중단 함수가 있는데
send는 공유책장에 책이 가득 채워져 있을 때(채널의 용량이 가득 찼을 때) 중단되고,
receive는 공유책장에 책이 없을 때(채널에 원소가 없을 때) 중단된다.

@sujin9
Copy link
Collaborator

sujin9 commented Jul 6, 2024

Explain the role of the asFlow extension function in Kotlin Coroutines.

@s9hn
Copy link
Member

s9hn commented Jul 6, 2024

Q: What is the purpose of the StateFlow in Kotlin Coroutines?

@hyemdooly
Copy link
Collaborator

Q: Explain the concept of coroutine flow operators in Kotlin.

@no1msh
Copy link
Collaborator

no1msh commented Jul 6, 2024

What is the purpose of the launchIn and collectAsState functions in combination with Jetpack Compose?

collectAsState는 composable 내에서 flow를 상태로 변환하여 관찰하고 재구성을 트리거하는 데 사용되며, launchIn은 특정 코루틴 스코프에서 flow 수집을 시작하는 데 사용됩니다.
주로 ViewModel에서 stateFlow를 두고 launchIn으로 viewModelScope에서 수집하도록 하고 composable 함수에선 collectAsState로 구독하는 형태로 구현합니다.

@krrong
Copy link
Collaborator

krrong commented Jul 6, 2024

Q: How does Kotlin Coroutines handle backpressure in flow-based programming?

  • buffer를 사용하여 생산자가 너무 빨리 값을 방출하더라도 수집자가 자신의 속도로 수집할 수 있도록 할 수 있다.
  • collectLatest 를 사용하여 가장 최근에 방출된 값을 수집하고, 새로운 값이 방출되면 이전 수집을 취소할 수 있다.

@Choisehyeon
Copy link
Collaborator Author

Choisehyeon commented Jul 6, 2024

Q: How do you handle exceptions in a coroutine flow in Kotlin?

flow에서 예외처리는 catch, retry, retryWhen을 사용하여 할 수 있다.

  • catch를 사용하여 던져진 예외에 대한 처리를 할 수 있다.
  • retry는 최대(기본값 Int.MAX_VALUE) 횟수를 지정하여 재시도 가능하다.
  • retryWhen은 재시도 횟수를 카운트하여 처리가 가능하며, catch 발생 시 catch에서와 마찬가지로 emit 값을 흘려보낼 수 있다.

@sujin9
Copy link
Collaborator

sujin9 commented Jul 6, 2024

Q: Explain the difference between cold and hot flows in Kotlin Coroutines.

@s9hn
Copy link
Member

s9hn commented Jul 6, 2024

Q: How can you implement a timeout for a coroutine flow in Kotlin?

A: Timeout for a coroutine flow can be implemented using the onTimeout operator. This operator allows you to specify a maximum duration for the flow to complete, and if the flow doesn't complete within that duration, it will be cancelled.

@hyemdooly
Copy link
Collaborator

StateFlow와 SharedFlow의 차이점 설명

@no1msh
Copy link
Collaborator

no1msh commented Jul 6, 2024

StateFlow와 LiveData의 차이점 설명 (값을 비교하는 로직의 차이점)

둘 모두 데이터의 상태를 관리하고 구독하여 UI를 알아서 업데이트되게 사용할 수 있지만 다음과 같은 차이점이 있습니다.

  • 값 비교하는 방법
    • LiveData의 경우 같은 값이 들어오면 값을 비교하지 않고 그대로 상태를 갱신합니다.
    • StateFlow는 들어온 값이 같으면 상태를 갱신하지않습니다.
  • Domain Layer에서
    • 순수 코틀린/ 자바 만 있어야하는 Domain 모듈에 StateFlow가 적합합니다.
    • LiveData는 AAC(Android Architecture Component)의 일종으로 Android 종속성을 가지고 있어 부적합합니다.
  • 사용하는 스레드
    • LiveData의 경우 UI 중심적이기에 MainThread에서 작동합니다.
    • StateFlow는 Context에 따라 다릅니다.
  • 초기값 유무
    • LiveData는 nullable이기에 초기값을 설정해주지 않아도 됩니다.
    • StateFlow는 초기값을 꼭 지정해줘야합니다.

@krrong
Copy link
Collaborator

krrong commented Jul 6, 2024

callbackFlow와 channelFlow 비교하여 설명

  • callbackFlow
    • 사용자의 클릭이나 활동 변화를 감지해야 하는 이벤트 플로우가 필요할 때 사용할 수 있다.
  • channelFlow
    • 한 번 시작하기만 하면 리시버를 기다릴 필요 없이 분리된 코루틴에서 값을 생성한다

각자의 역햘을 대체할 수 있기 때문에 큰 차이는 없는 것 같다.

@Choisehyeon
Copy link
Collaborator Author

Choisehyeon commented Jul 6, 2024

Flow에서 Buffer가 무엇이고 역할이 무엇인지 설명

flow의 collect를 활용하면 하나의 Coroutine에서 발행과 소비가 같이 일어나기 때문에 데이터를 다 소비한 후 다음 데이터가 발행된다.
발행과 소비에 모두 시간이 오래걸린다면 이는 매우 비효율적이다.
이를 방지하기 위해 buffer를 활용하여 발행과 소비를 위한 코루틴을 분리할 수 있다.

buffer
데이터 스트림에서 생산자와 소비자 간의 처리 속도 차이를 조정하고,
백프레셔를 완화하며, 비동기 처리를 가능하게 하는 중요한 도구이다.

@sujin9
Copy link
Collaborator

sujin9 commented Jul 6, 2024

combine, zip 연산자의 목적

@s9hn
Copy link
Member

s9hn commented Jul 6, 2024

collect와 onEach의 차이

@hyemdooly
Copy link
Collaborator

flowOn이 무엇이고 사용 목적이 무엇인지

@no1msh
Copy link
Collaborator

no1msh commented Jul 6, 2024

cold flow를 사용했던 경험을 말씀해주세요.

Room을 통해 cold flow를 사용한 경험이 있습니다.
Room은 flow를 지원하여 DAO 객체의 함수 반환값으로 flow를 사용할 수 있습니다.
저는 Room이 가진 데이터가 변경됨을 감지하여 UI를 자동적으로 갱신하는 로직을 구현하기 위해서 cold flow를 사용하여 구현하였습니다.

@krrong
Copy link
Collaborator

krrong commented Jul 6, 2024

sequence와 flow의 차이가 뭔가요?

  • Sequence
    • 동기적으로 계산되는 값을 처리한다. 데이터를 호출한 스레드에서 연속적으로 수행된다.
    • 각 요소가 필요한 시점에 계산된다. 이는 큰 데이터 컬렉션을 다룰 때 유용하며 전체 컬렉션을 계산하지 않아도 된다.
  • Flow
    • 비동기적으로 계산되는 값을 처리한다.
    • 각 요소가 필요할 때 계산된다.
    • 콜드 스트림이기 때문에 구독자가 생길 때까지 실행되지 않는다.

@Choisehyeon
Copy link
Collaborator Author

Choisehyeon commented Jul 6, 2024

stateIn에는 어떤 파라미터가 있으며, 각각의 역할은 무엇인가요?

scope, started, initialValue

  • 플로우의 원소를 모으는 코루틴을 시작하므로 코루틴 스코프를 받는다.
  • 리스너의 수에 따라 값을 언제부터 감지할지 결정하는 started를 지정해야 한다.
  • StateFlow는 항상 값을 가져야하기 때문에 초기값을 지정해줘야 한다.

@sujin9
Copy link
Collaborator

sujin9 commented Jul 6, 2024

flow의 map 함수를 직접 구현하려면 어떻게 하실건가요?

@s9hn
Copy link
Member

s9hn commented Jul 6, 2024

채널의 4가지 타입엔 어떤 것들이 있고 각각 간단한 설명을 해주실 수 있나요?

@hyemdooly
Copy link
Collaborator

flow의 최종 연산 함수는 무엇이 있을까요?

@no1msh
Copy link
Collaborator

no1msh commented Jul 6, 2024

Kotlin 코루틴에서 "debounce"의 역할은 무엇이며 성능을 최적화하는 데 어떻게 사용할 수 있습니까?

debounce는 인자로 받은 시간동안 이벤트가 발생하지 않으면 마지막 이벤트를 전달하는 함수입니다.
이러한 특성을 이용하여 검색창에 문자를 입력할 때마다 검색하지 않고 일정 시간이 지나야 검색하게끔 성능을 최적화 할 수 있습니다.

@krrong
Copy link
Collaborator

krrong commented Jul 6, 2024

Kotlin 코루틴에서 "scan" 및 "fold" 작업의 역할을 설명하십시오.

초기 값부터 시작하여 주어진 원소 각각에 대해 두 개의 값을 합치는 연산을 적용한다.

  • Fold
    • 최종연산이기 때문에 마지막 값만 생성할 수 있다.
    • collect처럼 플로우가 완료될 때까지 중단된다.
  • Scan
    • 중간연산이기 때문에 누적되는 과정의 모든 값을 생성할 수 있다.

@Choisehyeon
Copy link
Collaborator Author

Choisehyeon commented Jul 6, 2024

Kotlin 코루틴을 사용하여 스로틀링 메커니즘을 어떻게 구현할 수 있습니까?

Throttle

  • 일정 주기마다 이벤트를 캐치해 전달하는 기법
  • 이벤트와 관계 없이 timer를 돌린 상태에서 그 주기 안에서 발생하는 이벤트를 처리

동작 방식

  • 함수 호출이 스로틀을 트리거한다.
  • 설정된 딜레이 내에 함수가 호출되지 않으면 함수가 실행된다.
  • 딜레이 내 추가 호출은 무시된다.
  • 딜레이가 만료되면 호출이 실행되고 프로세스가 반복된다.

throttleFirst, throttleLast도 개발자가 직접 구현하여야 한다.
코틀린에서는 코루틴과 Flow를 사용하여 손쉽게 쓰로틀링 매커니즘을 구현할 수 있다.

구현

@sujin9
Copy link
Collaborator

sujin9 commented Jul 6, 2024

Flow 변환에서 "emit" 및 "emitAll"의 역할을 설명하십시오.

@s9hn
Copy link
Member

s9hn commented Jul 6, 2024

플로우의 "flatMapConcat", "flatMapMerge" 및 "flatMapLatest"는 무엇이며 서로 어떻게 다릅니까?

@hyemdooly
Copy link
Collaborator

코틀린에서 flow를 어떻게 생성하나요? flowOf와 asFlow 함수의 차이점에 대해서 설명해주세요.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants