프로그래밍안드로이드 개발자

Kotlin에서 기본 인수(default arguments)와 명명된 매개변수(named parameters)는 어떻게 작동합니까? Java와의 차이점, 인수 전달의 뉘앙스, 오버로드 메소드와의 컴파일, 명명된 매개변수와 위치 매개변수의 순서에 대해 설명해 주십시오. 예를 제공하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

Kotlin은 기본 값 (default arguments)과 명명된 매개변수 (named parameters)를 지원하여 Java에 비해 큰 유연성을 제공합니다.

주요 사항:

  • Kotlin에서는 함수 매개변수가 기본 값을 가질 수 있습니다:
    fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
  • 필요한 매개변수만 지정하여 함수를 호출할 수 있으며, 나머지는 기본 값으로 채워집니다.
  • 명명된 매개변수는 인수의 이름을 명시적으로 지정할 수 있게 해 주며, 이는 함수에 매개변수가 많은 경우 특히 유용합니다:
    greet(greeting = "안녕하세요") // -> 안녕하세요, User!
  • 일반(위치) 매개변수와 명명된 매개변수를 조합할 수 있지만, 명명된 매개변수가 호출 중간에 사용되어서는 안 됩니다.
  • Java와는 달리 (여러 조합에 대해 오버로드를 만드는 방식), Kotlin은 기본 인수를 Java와의 상호 운용성을 위해서만 오버로드 메소드로 컴파일하며, Kotlin 내부에서는 그것이 보이지 않습니다.

뉘앙스:

  • 명명된 인수를 사용한 후에는 다음 인수들도 명명되어야 합니다.
  • Java에서 기본 매개변수가 있는 함수를 사용하기 위해서는 @JvmOverloads 주석이 필요할 수 있습니다.

트릭 질문.

Kotlin에서 함수 호출 시 위치 인수와 명명된 인수를 자유롭게 혼합할 수 있습니까?

정답: 아닙니다, 최소한 하나의 명명된 인수를 지정한 후에는 모든 후속 인수도 명명되어야 합니다. 이것을 위반하면 컴파일 오류가 발생합니다.

// 잘못된 예 greet(greeting = "안녕하세요", "Ivan") // 오류! // 올바른 예 greet("Ivan", greeting = "안녕하세요") greet(name = "Ivan", greeting = "안녕하세요")

주제의 미세한 차이에 대한 실제 오류 예시.


이야기

팀은 Kotlin 모듈을 레거시 Java 프로젝트에 통합했으며, 기본 매개변수가 있는 함수에 @JvmOverloads 주석을 추가하는 것을 잊었습니다. 그 결과 Java 코드에서 필요한 오버로드 메소드를 볼 수 없어, 호출 시 런타임 오류가 발생했습니다.


이야기

명명된 매개변수를 사용한 리팩토링 중 개발자가 실수로 인수의 순서를 바꾸었고, 매개변수의 이름 변경 시 이 문제가 눈에 띄지 않았습니다 (타입은 변경되지 않았지만 호출의 의미가 변경되었습니다!). 이로 인해 UI 논리에서 이상한 버그가 발생했고, 즉시 발견되지 않았습니다.


이야기

한 개발자는 가독성을 높이기 위해 호출의 중간에서 위치 인수와 명명된 인수를 혼합했습니다. 코드는 컴파일되지 않았지만, 팀은 문제가 무엇인지 이해하는 데 어려움을 겪었습니다 — 다른 언어에서 자주 접했던 방식이기 때문에 Kotlin에서도 유사한 동작을 기대했습니다.