1. lateinit, lazy 를 사용하는 이유는?
보통 클래스에서 변수를 초기화하면 클래스 생성 시 해당 변수도 함께 생성되며 초기화 된다.
그렇게되면 클래스 객체를 생성할 때마다 해당 변수도 함께 초기화되니, 바로 사용할 수 있는 장점이 있다.
하지만, 해당 변수를 바로 사용하지 않거나 꼭 사용하는 경우가 아니라면 오히려 클래스 생성마다 해당 변수를 만들고 초기화 하는 것이 시간과, 메모리 낭비가 된다. 또한, 전역 변수를 선언하기 위해 굳이 null 처리를 해야하는 경우가 있다.
2. Android 와 AndroidX 차이는?
AndroidX 는 Jetpack 내에 라이브러리를 개발, 테스트, 패키지화, 버전 및 릴리즈를 하기 위해 사용하는 오픈소스 프로젝트이다.
기존 Android 지원 라이브러리를 대폭 개선하였다. com.android.support.* 라이브러리들을 하나로 통합한 것이라 생각하면 된다.
3. View 를 참조하는 방법
- ViewBinding
- findViewById(Boilerplate code 발생)
- ButterKnife(deprecated)
- Databindng
- Kotlin synthetic properties(deprecated)

4. 레이아웃이 그려지는 과정 설명해보기
뷰(Activity/Fragment)는 포커스를 얻으면 레이아웃을 그리도록 요청한다.
이 때 레이아웃의 계층구조 중 루트 노드를 제공 해야한다.
따라서 그리기는 루트노드에서 시작되어 트리를 따라 전회 순회 방식으로 그려진다.
부모 뷰는 자식 뷰가 그려지기 전에 그려지며, 자식 뷰는 전위 순회 방식에 따라 순서대로 그려진다.
레이아웃을 그리는 과정은 measure 단계와 layout 단계를 통해 그려지게 된다.
measure(측정 단계)
- 부모노드에서 자식노드를 경유하며 실행하여, 뷰의 크기를 알아내기 위해 호출된다.
layout(레이아웃 단계)
- 부모노드에서 자식노드를 경유하며 실행하여, 뷰와 자식뷰들의 크기와 위치를 할당할 때 사용된다.
5. View 라이프 사이클은 어떻게될까?
Constructor > onAttachedToWindow > onMeasure > onLayout > onDraw > Visible to User

Constructor :
모든 뷰는 생성자에서 출발한다. 생성자에서 초기화를 하고, default 값을 설정한다.
onAttachedToWindow :
부모 뷰가 addView 를 호출하고 자식 뷰는 윈도우에 붙게된다. 이 때부터 뷰의 id를 통해 접근 가능하다.
onMeasure :
뷰의 크기를 측정하는 단계이다. 대부분의 경우 레이아웃에 맞게 특정 크기를 가져야한다.
onLayout :
뷰의 크기와 위치를 할당한다.
onDraw :
뷰를 실제로 그리는 단계이다. (해당 함수는 호출 시 많은 시간이 소요된다. 고로 객체 할당은 피하고 한 번 할당한 객체를 재사용하는 것이 좋다)
invalidate, requestLayout :
두 함수는 뷰를 다시 그리도록하는 함수다. 두 함수는 런타임에 뷰를 다시 그릴 수 있게 한다.
'Android Q&A > Android One a day' 카테고리의 다른 글
[안드로이드 면접] - 9 : (0) | 2023.02.01 |
---|---|
[안드로이드 면접] - 8 : (0) | 2023.01.31 |
[안드로이드 면접] - 6 : (0) | 2023.01.29 |
[안드로이드 면접] - 5: (0) | 2023.01.28 |
[안드로이드 면접] - 4 : (0) | 2023.01.27 |