코틀린(Kotlin)

코틀린(kotlin) : Ranges 범위 표현

알통몬_ 2018. 2. 7. 14:00
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


이번 포스팅에서는 Ranges 에 대해서 공부합니다.

기본적인 범위의 표현은 in키워드를 사용해서 표현합니다.

ex) i in 1..10    -> i >=1 && i<=10

1,2,3,4,5,6,7,8,9,10 이렇게 되는 거죠.

ex) i in 10..1 은 실행해도 아무런 결과를 얻을 수 없습니다.

기본적으로 ++ 연산으로 진행되기 때문에 --연산을 하려면

i in 10 downTo 1 처럼 해야 --연산을 할 수 있습니다.


그리고 아래와 같은 코드도 가능합니다.

for( i in 1..10 step 2 ) print(i) // 13579
println()
for( i in 10 downTo 1 step 2 ) print(i) // 108642

그리고 a..b 에서 b를 제외하고 싶다면

fun main(args: Array<String>) {
for(i in 1 until 10) {
print(i) // 123456789
}
}

이렇게 하면 됩니다.


How it works

Ranges 는 공통 라이브러리 인터페이스인 CloseRange<T>를 구현합니다.

CloseRange<T> 는 비교 가능한 타입에 대해 정의된 수학적 의미에서 closed interval을

나타냅니다. 

Range에는 start 와 endInclusive 두 끝 점이 있습니다.

주 연산은 참조이고 일반적으로 in / !in 형태의 연산자를 사용합니다.


Integral type progressions(IntProgression, LongProgression, CharProgression)은

산술 Progression을 의미합니다.

Progressions 는 first element 와 last element 그리고 0이 아닌 step을 정의합니다.

first element 는 말 그대로 first 이고 후속 요소는 first에 step을 더합니다.

last element 는 항상 progression이 비어있지 않으면 항상 hit됩니다.


progression 은 Iterable<N> 의 subtype이고 N은 Int, Long, Char 가 올 수 있습니다.

그리고 이것은 map, filter 등과 같이 for-loops 와 메서드를 사용할 수 있습니다.

progression을 통한 for-loop은 java / javascript와 동일합니다.

for (int i = first; i != last; i += step) { // ... }


그렇다고 코틀린에서 선언할 때 위와 같은 형식을 허용하는 건 아닙니다.

단순히 내부적으로 저렇게 진행된다는 것입니다.


Integral 타입의 경우 .. 연산자는 ClosedRange<T> 와 *Progression을 모두 구현하는

오브젝트를 만듭니다. 예를 들어서 IntRange 는 ClosedRange<Int> 구현하고

IntProgression을 상속 받습니다.

그러므로 IntProgression을 위해 정의된 연산들은 IntRange에서도 사용 가능합니다.

downTo() 와 step() 메서드는 항상 *Progression입니다.


Progressions 는 companion objects 에 정의된 fromClosedRange 메서드로 생성됩니다.

IntProgression.fromClosedRange(start, end, step)

progression의 마지막 element 는 최댓값이 end 보다 크지 않도록, 또는 최솟값이

end 보다 작지 않도록 계산합니다.


유용한 메서드들

https://kotlinlang.org/docs/reference/ranges.html#utility-functions

위 링크에서 각 메서드들에 대해 공부하실 수 있습니다.

rangeTo() 

downTo()

reversed()

step()


이상입니다.

다음 포스팅에서는 Type Checks and Casts: 'is' and 'as' 에 대해서 공부합니다.

감사합니다.

반응형