현직 주니어 서버 개발자입니다. 1년도 채 안된 응애입니다.
질문&답변
한 suspend fun 의 반환값이 다른 suspend fun의 파라미터로 쓰일 때
앗 그리고 추가적으로, 만약 아래와 같이 main 함수 내에서 List를 돌면서 apiCall1, apiCall2를 호출했을 때,동기적 코드fun main() { val list: List = listOf(Example(1), Example(2)... ,Example(100)) list.forEach { ex -> val job1 = apiCall1(ex) val job2 = apiCall2(job1) } } fun apiCall1(ex: Example): Int { // 네트워크를 타는 어떤 외부 api A return 1 } fun apiCall2(num: Int): Int { // 네트워크를 타는 어떤 외부 api B return num + 2 }비동기적 코드fun main(): Unit = runBlocking { val list: List = listOf(Example(1), Example(2)... ,Example(100)) list.forEach { ex -> val job1 = async { apiCall1(ex) } val job2 = async { apiCall2(job1.await()) } } } suspend fun apiCall1(ex: Example): Int { // 네트워크를 타는 어떤 외부 api A return 1 } suspend fun apiCall2(num: Int): Int { // 네트워크를 타는 어떤 외부 api B return num + 2 }이 상황에서는 apiCall2() 의 실행은 마찬가지로 apiCall1() 이 완료된 후에 진행되지만,비동기적으로 코드를 작성했을 경우에는 리스트의 첫번째 원소의 apiCall1()이 끝나면, apiCall2() 가 완료되기를 기다리지 않고, 바로 다음 원소의 apiCall1() 이 실행될 것으로 예상했는데... 혹시 맞을까요?forEach 자체가 비동기 함수가 아니라서 아닐 수도 있겠네요...ㅜㅜ 첫번째 질문과 두번째 질문을 정리하자면,1. 한 suspend fun A()의 반환값을 파라미터로 받는 다른 suspend fun B()가 있으면, B의 실행은 A가 종료된 이후에 실행되므로 동기적 코드에 비교했을 때 큰 이점이 없다?2. 리스트를 순회하면서 suspend fun A, B를 호출했을 때는 단건 호출과 다르게 비동기 코드의 이점이 있다? (리스트 하나의 원소의 처리가 모두 다 끝나기를 기다리지 않고 다음 원소 처리로 넘어가는가?)입니다.EDIT) 혹시 다음과 같이 작성하면 리스트의 각 원소마다 새로운 코루틴이 생성되어 각각의 원소를 병렬처리할 수 있을 것으로 보았는데 맞을까요? 그리고 아래와 같은 상황이라면 apiCall1, apiCall2는 suspend fun이 아니어도 될 것 같습니다..!fun main(): Unit = runBlocking { val list: List = listOf(Example(1), Example(2)... ,Example(100)) list.forEach { ex -> launch { val job1 = apiCall1(ex) val job2 = apiCall2(job1) } } } fun apiCall1(ex: Example): Int { // 네트워크를 타는 어떤 외부 api A return 1 } fun apiCall2(num: Int): Int { // 네트워크를 타는 어떤 외부 api B return num + 2 }