TIL #102

loci·2024년 8월 19일
0

TIL

목록 보기
95/103

두개의 API를 받아올때 async를 적용해 한번에 받아오기

// 변경 전
fun getSearchImageList(query: String) {
        CoroutineScope(Dispatchers.Main).launch {
            val imageList = searchRepository.getSearchImageList(query, 1)?.items
            val clipList = searchRepository.getSearchClipList(query, 1)?.items

            val totalList: MutableList<TotalEntity> = mutableListOf()
            imageList?.let { totalList.addAll(it) }
            clipList?.let { totalList.addAll(it) }
            Log.d("get", searchRepository.getSearchImageList(query, 1)?.items.toString())

            totalList.sortByDescending { it.datetime }
            _getSearchImageList.value = totalList
        }
    }
//변경 후
fun getSearchImageList(query: String) {
        CoroutineScope(Dispatchers.Main).launch {
            val imageList = async(IO) { searchRepository.getSearchImageList(query, 1)?.items }
            val clipList = async(IO) { searchRepository.getSearchClipList(query, 1)?.items }

            val imageResult = imageList.await()
            val clipResult = clipList.await()
            val totalList: MutableList<TotalEntity> = mutableListOf()
            imageResult?.let { totalList.addAll(it) }
            clipResult?.let { totalList.addAll(it) }

            Log.d("get", searchRepository.getSearchImageList(query, 1)?.items.toString())

            totalList.sortByDescending { it.datetime }
            _getSearchImageList.value = totalList
        }
    }

CS 질문

  • 메모리의 힙 영역을 너무 크게 잡으면 어떤 일이 생길까요?

프로세스는 운영체제로부터 독립된 데이터영역을 할당받는다. 메모리 영역구조는 코드, 데이터, 힙, 스택으로 구성된다.

  • 코드영역: 실행할 코드가 기계어로 컴파일 되어있어 cpu가 해당코드영역에 저장된 명령어를 하나씩 가져가 처리한다.
  • 데이터 영역: 전역변수, 정적 변수, 배열, 구조체, 등이 저장되며 프로그램이 시작될때 할당되고, 종료되면 소멸한다.
  • 힙 영역: 사용자에 의해 동적 메모리 할당이 일어나는 영역 생성한 객체가 많아지면 그만큼 힙영역의 크기도 늘어난다.
  • 스택영역: 지역변수, 함수의 매개변수, 반환되는 주소값 등이 저장되는 영역, 함수가 호출되면 새로운 스택프레임이 스택에 추가되고 함수가 반환되면 해당 프레임이 제거된다.

힙영역은 런타임때 영역크기가 결정되는데 스택영역과 힙 영역은 메모리 영역을 공유하기 때문에 서로의 영역을 침범하는 문제가 발생할 수 있다. 스택이 힙영역을 침범하는 하는 경우 스택 오버플로우, 힙영역이 스택영역을 침범하는 경우 힙 오버플로우 라고 한다.

힙영역을 너무 크게 잡으면 메모리가 낭비되어 시스템의 전체적인 성능에 영향을 주고 가비지 컬렉션의 오버헤드(추가적인 시간, 자원이 소모됨)가 발생해 메모리를 정리하는 가비지 컬렉터의 메모리를 정리하는 가비지 컬렉션의 수행시간이 너무 길어지게된다.

그래서 JVM에서도 힙영역을 너무 크게 잡지 않고, 힙영역이 꽉 차면 GC진행 후 힙 영역을 확장한다.

Android 질문

  • Set과 Map의 차이는 무엇일까요? Map: key,value 항 쌍으로 이루어 진 데이터집합, key에 중복된 값이 입력될 수 없음, value의 중복은 허용 ,순서유지X , 뛰어난 검색속도, index가 없어 iterator 사용 Set: 순서와 중복이 없는 자료구조, index를 사용하지 않고 집합과 비슷한 자료구조, 빠른 검색속도와 index가 없어 iterator를 사용 주요 차이점은 값을 저장하는 형태가 다르고 Set은 중복을 허용하지 않지만 Map은 key의 중복은 허용하지 않고 value의 중복은 허용한다.
profile
편리한 개발자

0개의 댓글