📌 시험지 링크: https://android-exam25.gdg.kr/
GDG Korea Android 오픈 채팅방에서 위와 같은 글을 보게 되어서 바로 신청했다! 제출 마감 일자가 12월 7일인데 12월 초에 졸업 작품 마감 일정으로 한창 바쁠 때여서 결국 제때 제출하지는 못했다,,
그 이후로 때마침 기술 면접 일정이 잡혀서, 면접 전에 안드로이드 핵심 개념도 복습할 겸! 전체 문제를 풀어보았다. 구글링 없이 해결하지 못하는 문제가 꽤 많아서 깊은 반성의 시간을 가질 수 있었다.. 😂
📌 아래부터 이어지는 문제에 대한 설명은 개인적으로 학습하고 정리한 내용을 포함하고 있으므로, 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다! 🙏
📌 면접 때 받았던 꼬리 질문: 브로드캐스트 리시버는 앱 내에서 발생한 이벤트도 수신할 수 있나요?
자료를 찾아보니 LocalBroadcastManager를 사용하면, 외부 앱과 통신할 수 없고 현재 프로세스 내에서만 작동하는 브로드캐스트 리시버를 구현할 수 있다고 한다. 면접 당시에는 구현이 가능할 거 같긴 한데, 구체적인 방법을 몰라서 제대로 답변하지 못했다!
https://github.com/leeeha/Android-TIL/blob/main/Android/context.md
AGP (Android Gradle Plugin)
ADB (Android Debug Bridge)
ART (Android Runtime)
📌 AOT 컴파일이란?
- AOT (Ahead-of-Time) 컴파일: 프로그램 코드를 실행하기 전에 미리 기계어로 변환하는 컴파일 방식을 의미합니다. 실행 시 컴파일 과정이 생략되므로 더 빠르게 실행됩니다.
- JIT (Just-In-Time) 컴파일: 런타임 시 코드를 필요에 따라 기계어로 변환하는 방식으로, AOT에 비해 초기 실행 시간이 느리지만, 실행 중 최적화를 수행할 수 있는 장점이 있습니다.
- 안드로이드의 ART(Android Runtime)는 AOT로 미리 컴파일된 코드를 사용하면서도 JIT을 통해 런타임에서 추가 최적화를 수행합니다.
AAB (Android App Bundle)
DFM (Dynamic Feature Module)
https://github.com/leeeha/Android-TIL/blob/main/Android/recyclerview-in-nestedscrollview.md
리사이클러뷰는 현재 화면에 보이는 뷰 객체만 생성하며, 스크롤로 인해 더 이상 보이지 않게 된 뷰 객체를 재활용한다. 이를 위해서는 아이템 뷰를 기억하고 있을 객체가 필요하며, 이것이 바로 ViewHolder이다.
뷰홀더가 아이템 뷰를 갖고 있고, 어댑터에 의해 바인딩 된 데이터가 화면에 표시된다. 스크롤 시 이미 만들어진 아이템 뷰를 재활용할 수 있으면, 데이터만 바인딩 시켜 화면에 표시한다.
리스트 뷰에서도 성능 개선을 위해 개발자가 직접 뷰홀더 패턴을 적용할 수도 있다.
<include>
: 레이아웃에 재사용 되는 컴포넌트를 추가할 때 사용 (ex. 여러 화면에서 중복되는 앱바)<merge>
: merge 태그의 자식 뷰들을 include 태그의 부모 컨테이너에 직접 추가함으로써, 불필요한 ViewGroup의 사용을 제거한다. 이를 통해 뷰 계층 구조를 최적화 하여 레이아웃 렌더링 성능을 개선할 수 있다.<!-- reusable_layout.xml -->
<!-- merge 태그가 없으면 ViewGroup으로 감싸야 한다. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello" />
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="World" />
</LinearLayout>
<!-- reusable_layout.xml -->
<!-- 불필요하게 ViewGroup으로 감싸지 않아도 된다. -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello" />
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="World" />
</merge>
<!-- main_layout.xml -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/reusable_layout" />
</FrameLayout>
FrameLayout
: 자식 뷰들을 겹쳐서 배치하며, 주로 겹치는 UI를 만들 때 사용된다.LinearLayout
: 자식 뷰를 수평 또는 수직 방향으로 순차적으로 배치하는 레이아웃이다.ConstraintLayout
: 자식 뷰들 간의 상호 제약을 설정할 수 있어, 복잡한 레이아웃도 성능의 손실 없이 구성할 수 있다.RelativeLayout
: 자식 뷰를 다른 뷰나 부모 레이아웃을 기준으로 상대적으로 배치하는 레이아웃이다. (ConstraintLayout에 의해 많이 대체되었음)https://github.com/leeeha/Android-TIL/blob/main/Kotlin/data-class.md
https://github.com/leeeha/Android-TIL/blob/main/Kotlin/enum-vs-sealed.md
https://github.com/leeeha/Android-TIL/blob/main/Kotlin/scope-function.md
→ 다양한 속성들에 대해 더 알아봐야겠다!
https://github.com/leeeha/Android-TIL/blob/main/Android/thread-handler-looper.md
https://velog.io/@jxlhe46/Android-Activity-Lifecycle
Q. onDestroy() 생명주기 콜백 함수에 대해 틀린 설명을 모두 고르시오.
정답: 3번, 4번
https://velog.io/@jxlhe46/Android-Fragment-Lifecycle
DialogFragment는 구성 변경이 발생하면, 일반적인 프래그먼트처럼 onSaveInstanceState()
, onViewStateRestored()
메서드를 사용해 번들 형태로 이전 상태를 저장 및 복원한다.
📌 면접 때 받았던 질문: 프래그먼트가 항상 기본 생성자를 가져야 하는 이유는?
구성 변경이나 프로세스 종료 같은 상황에서 시스템이 프래그먼트를 재생성할 때 기본 생성자가 필요하기 때문에 (참고)
To be continued...