GDG Korea Android - 2025 안드로이드 탐구영역후기 및 문제풀이

Murjune·2024년 12월 15일
4
post-thumbnail

지난 12월 1일 ~ 12월 7일까지 진행된 2025학년도 안드로이드 탐구영역에 대한 후기입니다.

응시 전

실제 수능처럼 제출하는 것인지 인지하지 못하다가, 12월 7일 저녁 9시 경 급하게 문제를 풀고 제출했습니다. 포장지를 뜯고 시험지와 마주하니 진짜 수능처럼 구성이 되어있더군요 👏

응시

"1시간이면 되겠지~"라는 안일한 마음가짐으로 문제를 풀기 시작했습니다.
그런데, 실제 수능처럼 사고력을 요하는 문제가 생각보다 있었고 난이도가 생각보다 어렵더군요..
그리고, 문제를 풀면서 출제자분들이 실제 수능과 유사하게 문제를 구성하려고 얼마나 노력했는지가 느껴져 감탄을 하며 문제를 풀었습니다.

머리를 쥐어짜면서 간신히 시간 안에 풀고, 11시 58분 경에 제출했습니다.

근데 제출 기한이 11시 50분까지 였더라구요..?
GDG 분들이 봐주신 것 같습니다 ㅋㅋㅋ

인상적이였던 문제

12번 문제

저는 12번이 가장 어려웠습니다.
ConstraintLayout 의 History를 잘 알고 있어야 풀 수 있는 문제였습니다.
보기 선지도 헷갈리게 너무 잘 내신 것 같습니다.

일단 layout_constraintWidth를 속성이 없다고 가정을 하고 [그림 1], [그림 2]와 같이 나타내보겠습니다.

보기 G - layout_constraintHorizontal_bias


<TextView...
    app:layout_constraintEnd_toStartOf="@+id/button"
    app:layout_constraintStart_toStartOf="parent"
.../>

현재 activity_main.xml 파일을 보시면, textView가 parent와 button의 제약이 걸려있습니다.
위와 같은 상황에서 다음과 같은 형태가 나옵니다.

[그림1], [그림 2]와 같이 왼쪽에 딱 붙게 위치시키고 싶다면 layout_constraintHorizontal_bias="0" 을 지정해 뷰의 위치를 조절할 수 있습니다. 0에 가까울수록 왼쪽에 붙게 되고, 1에 가까울수록 오른쪽에 붙게 됩니다.(default는 0.5)

<TextView
    ...      
	app:layout_constraintHorizontal_bias="0" <!-- 0: 왼쪽, 1: 오른쪽 -->
	...
/>

따라서, 보기 G ✅

ConstraintLayout 공식문서: Centering positioning and bias

보기 A, F: wrap_content, layout_constrainedWidth

ConstraintLayout에서 특정 뷰의 layout_width/heightwrap_content로 지정하면, View가 스스로 크기를 결정합니다. 따라서, [그림2] 와 같이 텍스트가 길어지는 경우 다음과 같이 TextView가 Button의 영역을 침범하는 현상이 발생합니다.

ConstaintLayout 1.1 부터, layout_constrainedWidth 속성을 사용하여 wrap_content일 때도 제약을 강제할 수 있습니다.

<TextView 
	app:layout_width="wrap_content" 
	app:layout_constrainedWidth="true"
.../>

이제 텍스트가 길어져도 TextView 의 크기가 제약을 받아 Button의 영역을 침범하지 않습니다.

보기 A,F ✅

➡️ 1번 "A,F,G" 가 정답입니다.

추가 설명

layout_constraintWidth_default=wrap

constarintLayout 1.1 이전에는 layout_constraintWidth_default=wrap 옵션을 통해 다른 뷰 침범을 방지했습니다.

<TextView 
	android:layout_width="0dp"
	app:layout_constraintWidth_default="wrap"
/>

그러나, CostraintLayout 1.1 이후에는 layout_constraintWidth_default=wrap 옵션을 사용할 경우 다음과 같은 에러가 발생합니다.

해당 옵션 대신 layout_width=wrap_contentlayout_constrainedWidth=true 로 대체해야합니다.

➡️ 보기 E ❌, 2번 선지(B-D-E-F-G) ❌

layout_constraintWidth="wrap_content"

layout_constraintWidthConstraintLayout 2.1 사용 가능한 속성으로 layout_width를 오버라이드합니다.

4번 선지 (A-C-F-G)를 xml로 나타내보겠습니다.

<TextView
    ...
	android:layout_width="wrap_content" -- 보기 A
	app:layout_constraintWidth="wrap_content" -- 보기 C
	app:layout_constrainedWidth="true" -- 보기 F
	app:layout_constraintHorizontal_bias="0" -- 보기 G
	android:text="가나다라마바아자차카타파하"
    ...
/>

app:layout_constraintWidth="wrap_content"android:layout_widthlayout_constrainedWidth 속성을 오버라이딩하기 때문에 다음과 같이 나타납니다.

➡️ 4번 선지(A-C-F-G) ❌

layout_constraintWidth="wrap_content_constrained"

layout_constraintWidth 속성에 wrap_content_constrained 값을 지정하면, layout_constrainedWidth 속성을 true로 설정한 것과 같은 효과를 얻을 수 있습니다.

<TextView
    ...
	android:layout_width="wrap_content"
	app:layout_constraintWidth="wrap_content_constrained"
	app:layout_constraintHorizontal_bias="0"
	android:text="가나다라마바아자차카타파하"
    ...
/>

layout_constraintWidth_max/min

layout_width 의 속성이 match_constraint(=0dp) 일 경우에 min/maxWidth 은 적용되지 않는다. layout_constraintWidth_max/min 을 사용하여 뷰의 최대, 최소 크기를 지정할 수 있다.

<TextView
    ...
	android:layout_width="0dp"
	app:layout_constraintWidth_max="200dp"
	app:layout_constraintHorizontal_bias="0"
	android:text="가나다라마바아자차"
    ...
/>

추가로 layout_constraintWidth_max 에 wrap_content 라는 옵션은 없습니다.
대신 기본값으로 갖는 wrap 이라는 속성은 있습니다.

➡️ 보기 H ❌, 2번 선지(A-C-F-G) ❌, 5번 선지(A-E-F-G-H) ❌

빈칸은 5줄인데 정답은 1번(A-F-G)인게 조금 킹받았다.. 👀

19번 문제

19번은 apiimplementation 와 모듈의 의존성 그래프 그리기 문제였다.
상당히 머리가 아팠다..

api 와 implementation 에 대해서만 가볍게 정리하고 풀이하겠다.

  • api: 의존성을 현재 모듈 뿐만 아니라 이 모듈을 사용하는 다른 모듈에도 노출됨
    - ex) a ---(api)---> b 일때, a를 참조하는 모듈들은 b 코드도 참조 가능
  • implementation: 의존성이 현재 모듈 내부에서만 사용되며, 이 모듈을 사용하는 다른 모듈에는 노출되지 않는다.
    - ex) a ---(implementation)---> b 일때, a를 참조하는 모듈들은 b 코드는 참조 불가

이제 문제의 조건들을 하나하나 분석해보면서 모듈들의 의존 그래프를 그려보자

  • 모듈 B 에서 모듈 E를 코드 참조할 수 있지만, 모듈 E에서는 모듈 B 코드 참조 불가능

B만 E를 참조할 수 있기 때문에 다음과 같은 의존 그래프를 유추할 수 있다.

  • 하나의 모듈은 다른 하나의 모듈만을 참조하거나 어떤 모듈도 참조하지 않는다.
  • 모듈 A,C 모두 모듈 B,E 에서 작성한 코드 가져올 수 있다.

A,C 모두 B,E를 참조해야 하므로, B --(api)-->E 임이 확정이 났다.

다만, 아직 A와 C의 관계는 모른다.

  • 모듈 D에서 모듈 B에서 작성한 인터페이스와 구현체를 모듈 A에 주입할 수 있지만, C에 주입할 수 없다.

위 조건은 다음과 같이 치환될 수 있다.

  • 모듈 D가 모듈 A, B를 모두 알고 있다
  • 모듈 D는 C를 모른다.

모듈 D가 모듈 A와 B를 알고 있어야하기 때문에 자연스럽게 A ---(api)---> B 관계가 된다.
그리고, api 사용 횟수를 최소화해야하기 때문에 D --(implementation)--> A, C --(implementation)---> ? 가 확정난다.

이제 C가 어느 모듈을 참조하는지 결정해야 하는데 2가지 경우가 나온다.

의존 그래프를 모두 그렸으니 이제 보기를 보자

ㄱ) A~E가 api로 참조하고 있기 때문에 모듈 D는 A,B,E 코드에 모두 접근할 수 있다 ✅
ㄴ) 모듈 C를 참조하는 모듈은 없다 ✅
ㄷ) api 2번, implementation 2번 사용하고 있다 ✅

따라서, 정답은 5번이다

13번과 더불어 진짜 수능스럽게 잘 만든 문제라고 생각한다 👍👍👍

선택영역 코루틴 28번

코루틴 예외 전파 제한에 대한 문제였다.
응시할 때 내가 잘못 알고 있던 건가?? 라는 의구심이 들었는데 문제 오류였다 😂
해당 문제는 아래 포스팅을 보면 자연스럽게 오류임을 알 수 있다 ㅋㅋㅋ

kotlin Coroutine: 코루틴 예외 전파 제한 왜 하는거지?(with SupervisorJob)

후기

GDG 분들 덕분에 모르거나 애매하게 알고 있던 개념들도 보충해나갈 수 있었기에 너무 좋은 경험이었다.
그리고, 28번 문제 덕분에 처음으로 GDG 톡방에서 얘기도 해볼 수 있었기에 재밌었다. 하핫..

그리고, 다른 문제들도 해설할 수 있으면 추가로 올려야겠당 흐흐

문제는 아래 링크에서 다운받을 수 있습니다!
https://android-exam25.gdg.kr/

profile
열심히 하겠슴니다:D

2개의 댓글

comment-user-thumbnail
2024년 12월 16일

19번 깔끔한 해설 좋으네요 ㅎ
28번에 대한 코루틴 부모 자식 관계 그래프도(카톡에 첨부해주신) 글에 추가해주시면 좋을 것 같슴다!

1개의 답글

관련 채용 정보