만약 이 질문에 답변이 가능하다면 당신은 이미 대부분의 후보자들보다 앞서있습니다.
수년에 걸처 나는 같은 코틀린 질문들이 계속 등장한다는 것을 알게되었습니다.
가끔은 표현만 바뀌고, 가끔은 더 까다로워지지만 핵심 개념은 언제나 같습니다.
진짜 코틀린 질문들 면접을 한번 살펴봅시다.
그리고 그들이 정말로 테스트 하려는 것에 대해서도요.
1. 코틀린 함수에서 inline으로 표시하면 어떻게됩니까??
먼저 너는 이렇게 말할수 있습니다
"성능을 위해 함수가 호출되는 지점에 직접 인라인 화 합니다."
맞습니다. 하지만 이 스토리에 대해 반만 정답입니다.
면접관은 이것을 물어봅니다.
당신이 왜 인라인 함수가 고차 함수에서 중요한지를 알고 있는가를 확인하기 위해서 입니다.
(즉, 성능 최적화나 람다 처리 방식의 차이를 이해하고 있는지를 확인하기 위함입니다.)
- 일반적으로 람다는 메모리에 할당받습니다. (함수 객체)
- 함수가 inline으로 표시되면, 그 할당들은 사라집니다.
- 또한 람다 안에서 단순히 람다를 끝내는 것이 아니라 람다를 호출한 바깥 함수 전체를 종료할수도 있습니다.
예시
inline fun repeatAction(times: Int, action: () -> Unit) {
for (i in 0 until times) action()
}
람다 내부에서 return을 사용할 수 있는데
그렇게 하면 람다를 호출한 바깥 함수 전체에서 빠져나가게 됩니다.
이건 전형적인 함정 질문이에요.
2. 코루틴 안에서 launch와 async 차이점이 뭔가요?
두 개는 비슷하게 들리지만, 목적은 완전히 다릅니다.
그리고 면접관들은 언제 어떤 것을 써야하는지 명확히 설명할때에 아주 좋아합니다.
- launch = 실행하고 잊기 -> Job을 반환함
- async = 결과를 반환하는 비동기 작업 Deferred를 반환하고, 결과를 받으려면 await() 호출
하지만 다음에 나오는 함정 질문이 바로 이것입니다.
"만약 await() 호출을 잊어버리면 무슨 일이 일어나나요? "
그러면 코루틴은 실행되지만, 그 결과는 완전히 무시됩니다.
즉 헛된 계산이 되는 셈이지요.
면접에서 좋은 인상을 주는 보너스 팁
async 는 병렬 결과가 진짜로 필요할때만 사용해야 합니다.
그냥 모든 걸 async로 감싸는건 좋은 습관이아닙니다.
3. Sealed Class는 Enum과 어떻게 다르며 왜 컴포즈 팀들이 그것들을 좋아하나요?
Enum은 심플합니다.
Sealed Class는 데이터를 가질 수 있는 똑똑한 Enum 입니다.
이들은 타입 안정성을 유지하면서, 상태를 모델링할 수 있게 해주며,
안드로이드에 UI 상태를 다루기에 이상적입니다.
sealed class UiState {
data object Loading : UiState()
data class Success(val data: List<User>) : UiState()
data class Error(val message: String) : UiState()
}
컴포즈와 Sealed Class 조합은
컴파일러가 검증할 수 있는 더 깔끔한 When 표현식을 만들어줍니다.
그래서 면접관들이 이 질문을 하는이유는
단순히 문법을 아는지 보려고하는게 아니라,
상태 모델링을 제대로 이해하고있는지를 확인하기 위함입니다.
4. Flow, LiveData, StateFlow의 차이를 설명해주세요.
이 질문은 초급자와 숙련 개발자를 구분하는 질문입니다.
이렇게 말할 수 있습니다.
- LiveData - 생명주기를 인식하고, 오래된 방식이고 기본적으로 변경가능
- Flow - 콜드 스트림이며, collect 될때 시작하고, map, filter등 다양한 변환 연산자를 지원합니다.
- StateFLow - 핫 스트림이며, 마지막 값을 항상 보관하고 UI 상태 표현에 적합
하지만 더 중요한 포인트는 이거입니다.
- 당신은 언제 써야 하는지 알고 있나요?
만약 면접에서 flow를 결합하거나, stateIn() 또는 shareIn() 을 사용해 상태 관리에 대해 말한다면 그때 면접관은 미소를 짓기 시작할 것입니다.
5. by lazy와 lateinit의 진짜 차이는 무엇인가요?
겉보기에는 쉬워보이지만, 대부분의 답변은 미묘한 차이를 놓칩니다.
- lateinit 는 var 용이며, 의존성 주입이나 view 바인딩 드에서 나중에 값을 설정할 떄 사용됩니다.
- by lazy는 val 용이며 기본적으로 thread safe하고 지연초기화를 제공합니다
함정 질문은 다음과 같습니다
"만약 lateinit 변수를 초기화 전에 접근하면 어떻게 될까요"
그럴 경우 NullPointException이 아니라, UninitializedPropertyAccessException이 발생하며, 결과적으로 앱이 크래시 됩니다.
면접관이 이 질문을 하는 이유는,
당신이 코틀린 초기화 생명주기를 제대로 이해하고 있는지를 확인하기 위해서입니다.
6. 코루틴 내부에서 예외를 어떻게 처리하나요?
대부분이 try -catch로 처리합니다. 라고 하면 면접관들은 고개를 끄덕이지만,
곧바로 이렇게 되묻습니다.
"좋아요, 그런데 그 예외가 자식 코루틴 안에서 발생하면요?"
이때 진짜 실력 차이가 드러납니다.
여기서 구조적 동시성에 대해 언급해야합니다.
즉 부모 코루틴이 실패하면 모든 자식 코루틴이 함께 취소되고,
SupervisorJob을 사용하면 자식 간에 실패를 격리 할 수 있다는 것을 말이죠.
면접에서 깊은 한마디
CoroutineExceptionHanlder와 SupervisorScope에 대해 언급하세요.
이 두 가지를 언급하면, 면접관은
" 아 진짜 이 코루틴 예외를 디버깅해본사람이구나" 로 생각합니다.
7. Scope functions(let, run, apply, also, with) 을 설명해주세요. 단 실제 사례로요
모든 안드로이드 개발자가 이름은 알고 있지만, 제대로 사용하는 사람은 많지 않습니다.
단순히 정의를 나열하는대신, 면접관이 듣고싶은건 언제, 그리고 왜 사용하는지입니다.
user?.let {
showProfile(it)
}
-> Null 체크용으로 훌륭합니다.
val view = TextView(context).apply {
text = "Hello"
setTextColor(Color.Black)
}
-> 빌더 스타일 초기화에 완벽합니다
만약 면접에서 이렇게 말할 수 있다면
"let은 null 처리나 변환용으로, apply는 설정 및 초기화 용으로 사용합니다."
이미 시니어하게들립니다.
8. 코틀린에서 위임 프로퍼티는 어떻게 동작하나요?
면접관들이 이 질문을 좋아하는 이유는
지원자가 언어의 깊은 동작을 이해하고있는지를 확인할 수 있기 떄문입니다.
예를들어
var name: String by Delegates.observable("Koti") { _, old, new ->
println("Changed from $old to $new")
}
이것이 바로 프로퍼티 위임입니다.
내부적으로 getter와 setter 로직이 위임 객체에 의해 처리됩니다.
만약 면접에서 lazy, observable, 그리고 직접 만든 custom delegates까지 언급한다면
그 순간 면접관은 이 사람 진짜 코틀린 아네로 생각합니다.
9. 코틀린에서 Tail Recursion이란 무엇이며 , 왜 중요한가요?
코틀린에서 재귀 함수가 나오면 면접관이 자주 던지는 질문입니다.
Tail Recursion은 trailrec 키워드를 사용해 재귀 호출을 반복문으로 처리하여 스택 오버플로를 방지하는 기능입니다.
예시
tailrec fun factorial(n: Int, acc: Int = 1): Int =
if (n == 0) acc else factorial(n - 1, acc * n)
코틀린의 은근히 잘 모르는 멋진 기능중 하나입니다.
10. 왜 구글은 현대 안드로이드 개발에서 자바대신 코틀린을 선택했나요?
이것은 마지막 질문입니다.
정답은 하나로 고정되어있지 않지만, 강한 인상을 남기는 대답은 이렇게들립니다
""코틀린은 자바의 보일러플레이트를 제거하고, 널 안정성을 제공하며, 불변성을 장려하고,
현대적인 함수 패턴에 더 잘맞기 떄문입니다. 그리고 무엇보다 자바와 100% 상호 운용합니다.
"
기타
allocate 할당된
'영어 데일리' 카테고리의 다른 글
| “Kotlin 2.2.0: 개발 워크플로우를 혁신적으로 바꿀 게임 체인저급 기능들 (0) | 2025.11.11 |
|---|---|
| MVVI는 이제 구식이다: 현대적인 Android 개발스택은 MVI + GraphQL + Compose (0) | 2025.11.10 |
| 아무도 대답 할 수 없었던 안드로이드 인터뷰 질문들, 당신은 가능한가? (0) | 2025.10.31 |
| 코틀린의 장례식이 발표되었다. 애플의 안드로이드용 스위프트에 숨겨진 마스터플랜 (5) | 2025.07.07 |
| 코틀린 델리게이션: 더 좋은 코드를 작성하기 위한 똑똑한 방법 (0) | 2025.06.17 |