프로그래밍백엔드 개발자

코틀린에서 인픽스 함수란 무엇이며, 어떻게 선언하고 올바르게 사용할 수 있으며, 어떤 제한이 있습니까? 사용자 정의 인픽스 함수를 만드는 예를 제시하고 문제점에 대해 이야기해 주세요.

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

답변.

인픽스 함수는 점과 괄호 없이 인픽스 형식으로 호출할 수 있는 함수로, 코드 가독성을 높여줍니다. 이러한 함수는 DSL(도메인 특화 언어)을 만드는 데 유용합니다.

인픽스 함수 선언 방법:

  • 함수는 클래스의 메서드/익스텐션 함수이어야 합니다.
  • 정확히 하나의 매개변수를 가져야 합니다.
  • infix 수정자와 함께 선언됩니다.
  • vararg 및 기본값을 매개변수로 사용할 수 없습니다.

예제:

infix fun Int.add(x: Int): Int = this + x val result = 5 add 10 // 15

장점:

  • 특히 계산이나 호출 체인에서 가독성을 향상시킵니다.
  • 수집 구조를 구성하거나 조건을 확인하는 데 적용 가능합니다(예: x to y).

제한 사항 및 문제점:

  • 인픽스는 오직 하나의 필수 매개변수를 가져야만 사용할 수 있습니다.
  • 인픽스의 실행 우선순위는 비교 연산자 및 산술 연산자보다 낮기 때문에(이로 인해 연산 우선순위에 대한 놀라움이 발생할 수 있습니다).
  • 인픽스 함수는 기본값 및 vararg 선언과 함께 작동하지 않습니다.

문제의 질문.

여러 매개변수 또는 기본값이 있는 인픽스 함수를 사용할 수 있습니까?

답변: 아니요, 사용할 수 없습니다. 인픽스 함수는 기본값 없이 vararg 없이 정확히 하나의 필수 매개변수만 가질 수 있습니다.

잘못된 선언 예:

// 오류! infix fun foo(a: Int, b: Int) { }

주제에 대한 세부 사항을 모르는 것에서 발생하는 실제 오류 예:


이야기

프로젝트에서 빌더 함수 호출을 더 가독성 있는 인픽스 표현으로 대체하기 위해 인픽스 함수를 도입하려고 했습니다. 매개변수 수에 대한 제한을 몰라 두 매개변수로 함수를 선언하여 학생들이 컴파일이 되지 않는 이유를 오랫동안 이해하지 못했습니다.


이야기

개발자가 괄호 없이 큰 산술 표현식에서 인픽스 표현을 사용했으며, 연산자의 우선순위가 전통적인 수학 연산자와 같다고 생각했습니다. 그 결과 표현식은 예상과 다르게 계산되어야 했고 명시적인 괄호를 추가해야 했습니다.


이야기

컬렉션 내부에서 인픽스를 통해 쌍을 구현하고 내부에서 중첩을 적용했으나 문법에 대한 오해로 두 개의 중첩된 인픽스 호출이 작동하지 않았습니다. 최상위에서 쌍을 할당한 것만 작동했으며, 중첩된 쌍은 무시되어 중요한 데이터 손실이 발생했습니다.