프로그래밍코틀린 개발자, 백엔드 개발자

코틀린에서 숫자 범위(Range 및 Progression) 메커니즘은 어떻게 작동하며, 사용자 정의 범위를 어떻게 생성하고, 어떤 용도로 사용됩니까?

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

답변.

범위(Range) 및 진행(Progression) — 코틀린에서 특정 단계로 값의 순서를 나타내기 위한 내장 메커니즘입니다. 이들은 주로 루프, 조건, 컬렉션 반복 및 데이터 검증과 작업할 때 사용됩니다. Range는 코틀린의 문법을 자바보다 간결하고 표현력 있게 만들기 위한 방법 중 하나로 등장했습니다.

이력

자바에서는 유사한 작업이 인덱스가 있는 for 및 while 루프를 통해 수행되어 다소 장황하고 오류에 취약했습니다. 코틀린에서는 범위를 생성하기 위한 간결한 연산자(예: 1..10)와 단계 설정을 위한 메서드가 도입되었습니다.

문제

  • 값의 범위를 쉽게 전달할 수 있어야 합니다(예: 1에서 100까지의 모든 숫자 값).
  • 반복 및 검증 시 편리함이 향상됩니다.
  • 사용자 정의 타입에 대한 범위를 재정의할 수 있는 기능이 필요합니다.

해결

코틀린은 표준 숫자 범위(IntRange, LongRange, CharRange, UIntRange 등)와 사용자 정의 진행을 생성하기 위한 인터페이스를 제공합니다:

코드 예:

for (i in 1..5) print("$i ") // 1 2 3 4 5 for (i in 5 downTo 1 step 2) print("$i ") // 5 3 1 // 값 확인 val x = 42 if (x in 1..100) println("범위 내에 있습니다!")

사용자 정의 범위

사용자 정의 타입에 대해 범위를 정의하려면 rangeTo 및 Progression 연산자를 구현해야 합니다:

data class Version(val major: Int, val minor: Int) : Comparable<Version> { override fun compareTo(other: Version) = compareValuesBy(this, other, Version::major, Version::minor) } operator fun Version.rangeTo(other: Version) = VersionRange(this, other) class VersionRange( override val start: Version, override val endInclusive: Version ) : ClosedRange<Version> for (v in Version(1, 0)..Version(1, 2)) println(v)

주요 특징:

  • 범위를 생성하기 위한 간결한 구문(start..end, downTo, step).
  • 내장된 포함 여부 검사(in, !in).
  • 사용자 정의 타입에 대한 범위 및 진행을 정의할 수 있는 기능.

함정 질문.

1..5 표현식이 실제로 반환하는 것은 무엇인가요?

이것은 ClosedRange<Int> 인터페이스를 구현하는 IntRange 클래스의 인스턴스를 생성합니다. 이것은 컬렉션이 아니라 경계와 단계를 정의하는 객체입니다. 지연(yield) 구현입니다.

왜 범위의 단계(step)는 항상 1인가요? 단계는 어떻게 변경하나요?

기본적으로 범위의 step은 1입니다(또는 downTo의 경우 -1). 다른 단계는 step 및 downTo 메서드를 사용하여 설정합니다. 예를 들어:

for (i in 2..10 step 2) println(i)

비교 가능한 것을 구현하지 않은 타입과 범위를 사용할 수 있나요?

아니요, 사용자 정의 범위가 올바르게 작동하려면 형식이 Comparable 인터페이스를 구현해야 하며, 그렇지 않으면 rangeTo 연산자가 작동할 수 없습니다.

일반적인 오류 및 안티 패턴

  • step 메서드를 사용하지 않고 Range의 단계를 변경하려는 시도.
  • Comparable이 없는 타입과 범위를 사용하는 경우.
  • 방향이 엉켜서(예: 5..1은 결과를 주지 않음).

실생활 예제

부정적인 케이스

개발자가 downTo 없이 for (i in 5..1) 루프를 사용하여 "5, 4, 3, 2, 1"이 될 것이라고 기대하지만 실제로는 루프가 한 번도 실행되지 않습니다.

장점:

  • 문법이 간단합니다.

단점:

  • 부정적인 범위의 동작이 명확하지 않습니다.
  • 초보자가 혼란스러워하기 쉽습니다.

긍정적인 케이스

원하는 간격으로 보고서를 반복하기 위해 downTo 및 step을 사용하는 진행을 활용하여 코드를 간결하고 문서화할 수 있습니다.

장점:

  • 간결한 스타일.
  • 경계 초과 오류 가능성이 낮습니다.

단점:

  • 단계 및 방향의 특성을 알아야 합니다.