2025 안드로이드 탐구 영역 응시 후기

leeeha·1일 전
0

안드로이드

목록 보기
6/6
post-thumbnail

📌 시험지 링크: https://android-exam25.gdg.kr/

신청 경로

GDG Korea Android 오픈 채팅방에서 위와 같은 글을 보게 되어서 바로 신청했다! 제출 마감 일자가 12월 7일인데 12월 초에 졸업 작품 마감 일정으로 한창 바쁠 때여서 결국 제때 제출하지는 못했다,,

그 이후로 때마침 기술 면접 일정이 잡혀서, 면접 전에 안드로이드 핵심 개념도 복습할 겸! 전체 문제를 풀어보았다. 구글링 없이 해결하지 못하는 문제가 꽤 많아서 깊은 반성의 시간을 가질 수 있었다.. 😂

📌 아래부터 이어지는 문제에 대한 설명은 개인적으로 학습하고 정리한 내용을 포함하고 있으므로, 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다! 🙏

2번: 안드로이드 4대 컴포넌트 ⭐️

  • 액티비티: 화면에 UI를 표시하며, 사용자와의 상호작용을 담당한다.
  • 서비스: UI 없이 백그라운드에서 작업을 처리한다.
    • 포그라운드 서비스: 사용자에게 알림(notification)으로 작업 상태 표시 (ex. 음악 플레이어 앱, GPS 추적 앱 등) → 시스템에 의해 강제 종료될 가능성이 낮다.
    • 백그라운드 서비스: 사용자에게 알림 없이 백그라운드 작업 수행 → 시스템에 의해 강제 종료될 가능성이 높다.
    • 바운드 서비스: 다른 컴포넌트가 바인딩하여 서비스와 통신할 수 있음. (ex. 음악 플레이어 앱에서 재생 상태를 액티비티에 표시)
  • 브로드캐스트 리시버: 시스템 이벤트 또는 다른 어플리케이션에서 발생한 이벤트를 수신한다.
    • 이벤트 기반 동작: 네트워크 연결 상태, 배터리 부족, 알람 발생 등의 시스템 이벤트나 커스텀 이벤트를 처리합니다.
    • 정적 등록: 앱이 실행 중이지 않아도 이벤트 수신 가능, 메니페스트 파일에 등록
    • 동적 등록: 앱이 실행 중일 때만 이벤트 수신 가능, 코드 상에서 등록
  • 콘텐츠 프로바이더: 어플리케이션 간의 데이터 공유를 관리한다.
    • 다른 앱이 DB, 파일 등의 데이터에 안전하게 접근할 수 있도록 표준화 된 API 제공 (query, insert, update, delete 등)
  • 모든 안드로이드 어플리케이션은 4대 컴포넌트 중에 하나 이상을 반드시 사용해야 한다.

📌 면접 때 받았던 꼬리 질문: 브로드캐스트 리시버는 앱 내에서 발생한 이벤트도 수신할 수 있나요?

자료를 찾아보니 LocalBroadcastManager를 사용하면, 외부 앱과 통신할 수 없고 현재 프로세스 내에서만 작동하는 브로드캐스트 리시버를 구현할 수 있다고 한다. 면접 당시에는 구현이 가능할 거 같긴 한데, 구체적인 방법을 몰라서 제대로 답변하지 못했다!

3번: Context ⭐️

https://github.com/leeeha/Android-TIL/blob/main/Android/context.md

4번: 축약어 설명

AGP (Android Gradle Plugin)

  • Android 프로젝트를 빌드하고 관리하기 위해 사용되는 Gradle 플러그인입니다.
  • 빌드 설정, APK 생성, 의존성 관리, 리소스 최적화 등과 관련된 작업을 자동화합니다.

ADB (Android Debug Bridge)

  • 안드로이드 디바이스와 PC 간의 통신을 가능하게 하는 디버깅 도구입니다.
  • 애플리케이션 설치, 로그 확인, 쉘 명령 실행, 파일 전송, 디바이스 리부팅 등의 작업에 사용됩니다.

ART (Android Runtime)

  • 안드로이드 애플리케이션의 실행 환경으로, Dalvik VM을 대체했습니다.
  • Ahead-of-Time(AOT) 컴파일 방식을 사용하여 애플리케이션의 실행 성능을 향상시키고, 메모리 효율성을 높입니다.

📌 AOT 컴파일이란?

  • AOT (Ahead-of-Time) 컴파일: 프로그램 코드를 실행하기 전에 미리 기계어로 변환하는 컴파일 방식을 의미합니다. 실행 시 컴파일 과정이 생략되므로 더 빠르게 실행됩니다.
  • JIT (Just-In-Time) 컴파일: 런타임 시 코드를 필요에 따라 기계어로 변환하는 방식으로, AOT에 비해 초기 실행 시간이 느리지만, 실행 중 최적화를 수행할 수 있는 장점이 있습니다.
  • 안드로이드의 ART(Android Runtime)는 AOT로 미리 컴파일된 코드를 사용하면서도 JIT을 통해 런타임에서 추가 최적화를 수행합니다.

AAB (Android App Bundle)

  • Google Play에서 권장하는 애플리케이션 배포 형식입니다.
  • APK 대신 AAB 형식을 사용하면, 필요한 리소스와 코드를 기반으로 최적화된 APK를 생성하여 다운로드 크기를 줄일 수 있습니다.

DFM (Dynamic Feature Module)

  • 앱의 특정 기능을 필요에 따라 다운로드 및 설치할 수 있도록 모듈화한 기능입니다.
  • 기본 앱에 포함되지 않고, 사용자가 요청할 때만 다운로드 되므로 앱 크기를 줄이고 업데이트 효율성을 높입니다.

5번: 리사이클러뷰 ⭐️

https://github.com/leeeha/Android-TIL/blob/main/Android/recyclerview-in-nestedscrollview.md

  • 뷰홀더: 화면에 표시될 아이템 뷰를 저장하는 객체
  • 어댑터: 데이터 목록을 아이템 뷰에 바인딩 시키는 역할
  • 레이아웃 매니저: 아이템 뷰가 화면에 배치되는 형태 관리

리사이클러뷰는 현재 화면에 보이는 뷰 객체만 생성하며, 스크롤로 인해 더 이상 보이지 않게 된 뷰 객체를 재활용한다. 이를 위해서는 아이템 뷰를 기억하고 있을 객체가 필요하며, 이것이 바로 ViewHolder이다.

뷰홀더가 아이템 뷰를 갖고 있고, 어댑터에 의해 바인딩 된 데이터가 화면에 표시된다. 스크롤 시 이미 만들어진 아이템 뷰를 재활용할 수 있으면, 데이터만 바인딩 시켜 화면에 표시한다.

리스트 뷰에서도 성능 개선을 위해 개발자가 직접 뷰홀더 패턴을 적용할 수도 있다.

6번: AsyncTask

https://velog.io/@haero_kim/Android-AsyncTask-%EA%B0%80-%EB%96%A0%EB%82%98%EA%B0%84-%EC%9D%B4%EC%9C%A0

  • 오직 한 번만 실행되어 재사용 불가
  • 종료를 명시적으로 해주지 않으면 메모리 누수 발생 (OOM으로 이어질 수 있음)
  • 항상 UI 스레드에서 호출해야 함.
  • 순차적으로 코드가 실행되어 속도가 저하될 수 있음.
  • 취소 메서드만 있고 onError 같은 예외 처리 메서드 부재
  • AsyncTask 병렬 실행 시 doInBackground() 메서드의 실행 순서 보장 x
  • 프래그먼트에서 실행하다가 액티비티 종료시키면, getContext(), getActivity()에서 null 반환되어 NPE 발생

7번: <merge> 태그 사용 목적

  • <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>

8번: View

  • FrameLayout: 자식 뷰들을 겹쳐서 배치하며, 주로 겹치는 UI를 만들 때 사용된다.
  • LinearLayout: 자식 뷰를 수평 또는 수직 방향으로 순차적으로 배치하는 레이아웃이다.
  • ConstraintLayout: 자식 뷰들 간의 상호 제약을 설정할 수 있어, 복잡한 레이아웃도 성능의 손실 없이 구성할 수 있다.
  • RelativeLayout: 자식 뷰를 다른 뷰나 부모 레이아웃을 기준으로 상대적으로 배치하는 레이아웃이다. (ConstraintLayout에 의해 많이 대체되었음)
  • ViewGroup은 기본적으로 터치 이벤트를 자식 뷰로 전달하지만, 필요에 따라 onTouchEvent(MotionEvent), onInterceptTouchEvent(MotionEvent) 같은 메서드를 활용해 직접 처리할 수도 있다. 예를 들어, RecyclerView, ScrollView 같은 ViewGroup은 터치 이벤트를 가로채서 스크롤 동작을 처리한다.

9번: 데이터 클래스

https://github.com/leeeha/Android-TIL/blob/main/Kotlin/data-class.md

10번: sealed class

https://github.com/leeeha/Android-TIL/blob/main/Kotlin/enum-vs-sealed.md

11번: 코틀린 스코프 함수

https://github.com/leeeha/Android-TIL/blob/main/Kotlin/scope-function.md

12번: ConstraintLayout

https://medium.com/@futureofdev/android-constraintlayout-%EC%89%BD%EA%B2%8C-%EC%95%8C%EC%95%84%EA%B0%80%EC%9E%90-62d2ded79c17

→ 다양한 속성들에 대해 더 알아봐야겠다!

14번: 스레드, 핸들러, 루퍼 ⭐️

https://github.com/leeeha/Android-TIL/blob/main/Android/thread-handler-looper.md

15번: 액티비티 생명주기 ⭐️

https://velog.io/@jxlhe46/Android-Activity-Lifecycle

Q. onDestroy() 생명주기 콜백 함수에 대해 틀린 설명을 모두 고르시오.

  1. Activity 생명주기 콜백 함수 중 가장 마지막에 호출되는 함수이다.
  2. 하나의 액티비티 객체에서 단 한번만 호출된다.
  3. 이 콜백 함수가 호출되기 이전에 onStop() 콜백 함수가 무조건 한번 호출된다. (X)
  4. 액티비티 객체가 가비지 컬렉터에 의해 수거되기 직전에 호출되는 함수이다. (X)
  5. 액티비티가 백그라운드에 있을 때 System Kill 당하는 경우 이 콜백 함수는 호출되지 않는다.

정답: 3번, 4번

  • 3번: onCreate()에서 finish() 호출 시, onStop() 없이 onDestroy()가 바로 호출될 수 있다.
  • 4번: onDestroy()는 액티비티가 소멸되기 직전에 호출되는 함수이다. 가비지 컬렉션은 더 이상 참조되지 않는 객체를 시스템이 필요에 따라 수거하는 동작으로, onDestroy() 함수가 이러한 시스템의 동작을 보장하지는 않는다.

22번: 프래그먼트 생명주기

https://velog.io/@jxlhe46/Android-Fragment-Lifecycle

DialogFragment는 구성 변경이 발생하면, 일반적인 프래그먼트처럼 onSaveInstanceState(), onViewStateRestored() 메서드를 사용해 번들 형태로 이전 상태를 저장 및 복원한다.

📌 면접 때 받았던 질문: 프래그먼트가 항상 기본 생성자를 가져야 하는 이유는?
구성 변경이나 프로세스 종료 같은 상황에서 시스템이 프래그먼트를 재생성할 때 기본 생성자가 필요하기 때문에 (참고)

To be continued...

profile
습관이 될 때까지 📝

0개의 댓글